Skip to main content
Home
實踐-重要 DemoMatters

Main navigation

  • Home
  • Democracy
  • 保險業 新聞
  • 元元園地
  • 討論
  • 維基
User account menu
  • Log in

dyh_ChtGptDrplMrkDwnLnkFltr

By Misc_Admin, 22 December, 2025

Clarifications: This is about ChatGpt assisted creation of Drupal's 'Markdown Link Filter'
ChatGPT Direction
Folder/file structure

  • folder structure: DrupalSiteRoot/modules/modules/custom/PrjctNm/src/Plugin/Filter
  • files
    • DrupalSiteRoot/modules/modules/custom/PrjctNm/mrk_dwn_lnk_fltr.info.yml
      • module/project description file

      name: 'mrk_dwn_lnk_fltr'
      type: module
      description: 'Converts Markdown links to wiki creation links for missing pages.'
      core_version_requirement: ^8 || ^9 || ^10
      package: Custom
      dependencies:
      - filter

    • DrupalSiteRoot/modules/modules/custom/PrjctNm/src/Plugin/Filter/mrk_dwn_lnk_fltr.php
      • the code/implementation

      // simple worked version
      <?php

      namespace Drupal\mrk_dwn_lnk_fltr\Plugin\Filter;

      use Drupal\filter\FilterProcessResult;
      use Drupal\filter\Plugin\FilterBase;
      use Drupal\Core\Form\FormStateInterface;
      use Drupal\filter\Annotation\Filter;

      /**
      * @Filter(
      * id = "mrk_dwn_lnk_fltr",
      * title = @Translation("MarkDown Link Filter"),
      * description = @Translation("Convert Markdown links to wiki creation links if the node does not exist."),
      * type = Drupal\filter\Plugin\FilterInterface::TYPE_MARKUP_LANGUAGE,
      * )
      */
      class mrk_dwn_lnk_fltr extends FilterBase {

      /**
      * {@inheritdoc}
      */
      public function process($text, $langcode) {
      $result = $text;

      // Regex to match Markdown links: [Text](Title)
      $pattern = '/\[(.*?)\]\((.*?)\)/';

      \Drupal::logger('me')->debug('before user call');
      $user = \Drupal::currentUser();
      \Drupal::logger('me')->debug('after user call');
      \Drupal::logger('me')->notice('Current user: uid=@uid name=@name roles=@roles', [
      '@uid' => $user->id(),
      '@name' => $user->getDisplayName(),
      '@roles' => implode(', ', $user->getRoles()),
      ]);

      $content_type = 'wiki'; // adjust as needed

      $result = 'user|'.$content_type.'|'.$result;

      $result0 = preg_replace_callback($pattern, function($matches) use ($user, $content_type) {
      $link_text = $matches[1];
      $link_target = $matches[2];

      \Drupal::logger('me')->debug('CntntTyp='.$content_type);
      \Drupal::logger('me')->debug('LnkTxt='.$link_text);
      \Drupal::logger('me')->debug('LnkTrgtp='.$link_target);

      // Check if node with title exists
      $query = \Drupal::entityTypeManager()->getStorage('node')->getQuery()
      ->accessCheck(FALSE) // do not check permission
      ->condition('title', $link_target) // query condition
      ->condition('type', $content_type) // :
      ->range(0, 1); // first 0 or 1 record
      $nids = $query->execute(); // obtain node id info
      \Drupal::logger('me')->debug('nids='.var_dump($nids));

      if (!empty($nids)) {
      // Node exists, return normal link
      return $matches[0];
      } else {
      // Node does not exist. Check if user can create
      $node_access = \Drupal::entityTypeManager()->getStorage('node')->create(['type' => $content_type]);
      if ($user->hasPermission('create ' . $content_type . ' content')) {
      // Return Markdown link to node/add page + emoji
      $create_url = '/node/add/' . $content_type . '?edit[title]=' . urlencode($link_target);
      return '[' . $link_text . '](' . $create_url . ') ✨';
      }
      else {
      // Node does not exist, user cannot create: just return normal text
      return $link_text;
      }
      }
      }, $text);
      \Drupal::logger('me')->debug($result0);
      return new FilterProcessResult($result0);
      }
      }

      • see also C:\_DH\_Prsnl\_Cds\_ClPhp\_DrplRltd\WikiFltr\wikiFltr.php

Enable module

  • -Admin -Extend -List -custom -mrk_dwn_lnk_fltr = x
  • -Install

Configure

  • -Admin -Configuration -Content authoring -Text formats and editors -select format(e.g. Markdown)
  • -Enabled filter -MarkDown Link Filter = x
  • -set Filter processing order = move 'MarkDown Link Filter' to top
  • Save configuration
  • Log in or register to post comments

Wiki_VwBlck

RSS feed