# Tagging URL --\> Summary Page

**URL:** <https://forum.getkirby.com/t/tagging-url-summary-page/9624>\
**Category:** Questions\
**Tags:** v2\
**Created:** [February 5, 2018, 1:08pm UTC](https://forum.getkirby.com/t/tagging-url-summary-page/9624 "2018-02-05T13:08:26Z")\
**Posts on this page:** 1\
**Showing post:** 15

<div class="post-metadata">

**Author:** ![demlak](https://avatars.discourse-cdn.com/v4/letter/d/a9a28c/32.png) [@demlak](https://forum.getkirby.com/u/demlak)\
**Post date:** [February 13, 2018, 9:19pm UTC](https://forum.getkirby.com/t/tagging-url-summary-page/9624/15 "2018-02-13T21:19:49Z")

</div>

Ok, here is the code, if anyone is interested in. maybe it is a help for someone.  
Since, the markdown-extra tables are not very comfortable to align and multiple head-lines are not supported, i will change my original idea and write my own html table and/or tab based template. also i’m not sure which data i will output. so, here is a sample output you will have to modifiy for yourself. at this stage, i think, every change will just help myself and not anyone else… so here are my findings/is my code.

- The Plugin analyses the raw content files for Markdown Links which are extended by a `tag:` attribut.
- Original: (link: [http://wikipedia.de](http://wikipedia.de) text: wikipedia Website)
- New: (link: [http://wikipedia.de](http://wikipedia.de) tag: wiki text: wikipedia Website)
- when you use the new snippet tag in any of your pages, you will get a table of link collection.

**site/snippets/linksnippet.php**

```auto
<div>
<?php
$items = page('home')->children()->visible();

foreach($items as $item) {
    page::$methods['getTaggedLinklist'] = function($page, $field = null) {
          if(!is_null($field) && in_array($field, $page->content()->fields())) {
          $raw = $page->{$field}();
            } else {
                $raw = $page->content()->raw();
                }
        // find all tags
        preg_match_all('!`[^``]*`(*SKIP)(*F)|\(([^)]+\))!', $raw, $matches);
        $list = [];
        if(count($matches[0]) > 0) {
          // loop through the matches
          foreach($matches[0] as $match) {
            // remove the brackets
            $tag = trim(rtrim(ltrim($match, '('), ')'));
              // get the name of the tag
              $name = trim(substr($tag, 0, strpos($tag, ':')));
                // check if it is a link tag
                if($name == 'link') {
                  // create a new Kirbytag instance
                  $tag = new Kirbytag(null, $name, $tag);
                  // check if tag is included
                  if(!is_null($tag->attr('tag'))) {
                    // get all the attributes and add them to our list
                    $list[] = $tag->attr();
                  }
                }
          }
        }
        return $list;
      };

      foreach($item->getTaggedLinklist() as $element) {
          // define content of each link-array
      if(empty($element['text'])) {
            $textelement = parse_url($element['link'], PHP_URL_HOST);
              } else {
                $textelement = $element['text'];
                }
          $output = array(
                  'tag' => $element['tag'],
                  'link' => $element['link'],
                  'text' => $textelement,
                  'pagetitle' => $item->title()->value(),
                  'pagelink' => $item->url(),
                  'date' => $item->date()
                  );
          $key = $element['tag'];
          $full[$key][] = $output; // add link-array to tag-group
          // filter duplicate links while
              $temparr = array_unique(array_column($full[$key], 'link'));
              $finalarray[$key] = array_intersect_key($full[$key], $temparr);
          // sort each element in a tag-group by date
              usort($finalarray[$key], function($a, $b) {
                        return $a['date'] - $b['date'];
                        }
                    );
      }
    }

    // sort tag-groups by alphabet
    uksort($finalarray, 'strcasecmp');

    // generate markdown table of array

    $tgmt = "\n"; // tag group markdown table
    foreach($finalarray as $taggroupname => $taggroup) {
    $tgmt .= '### ' . $taggroupname . "\n";
    $tgmt .= '|link|text|date|' . "\n"; // table header
    $tgmt .= '|--|--:|--:|' . "\n";
        foreach($taggroup as $tgi) { // taggroupitem
            // convert unix timestamp
            $timeconv = date('Y.m.d - H:i', $tgi['date']);

            // generate table row
            $linkstring = url::short($tgi['link'], 33);

            $link = '(link: ' . $tgi['link'] . ' text: ' . $linkstring . ')';
            $tgmt .= '|' . $link . '|' . $tgi['text'] . '|(link: ' . $tgi['pagelink'] . ' text: ' . $timeconv . ')|' . "\n";
        }
    }
    echo kirbytext($tgmt);
?>
</div>

```

**site/tag/link.php**

```auto
<?php

// link tag
kirbytext::$tags['link'] = array(
  'attr' => array(
    'text',
    'class',
    'role',
    'title',
    'rel',
    'lang',
    'target',
    'popup',
    'tag'
  ),
  'html' => function($tag) {

    $link = url($tag->attr('link'), $tag->attr('lang'));
    $text = $tag->attr('text');

    if(empty($text)) {
      $text = $link;
    }

    if(str::isURL($text)) {
      $text = url::short($text);
    }

    return html::a($link, $text, array(
      'rel' => $tag->attr('rel'),
      'class' => $tag->attr('class'),
      'role' => $tag->attr('role'),
      'title' => $tag->attr('title'),
      'target' => $tag->target(),
    ));

  }
);

```

**site/tag/snippet.php**

```auto
<?php
kirbytext::$tags['snippet'] = array(
  'attr' => array(
  ),
  'html' => function($tag) {
        $file = $tag->attr('snippet');
        return snippet($file, array(), true);
  }
);

```

some notes:

- links inside codeblocks or inline-code are ignored
- duplicate links are ignored
- invisible pages are ignored
- output is sorted by tag and by date
- when text attribute is empty, the hostname of the link is used as text
- tags are case-sensitive
- take a look at linksnippet.php to get an idea of outputcode
- i’m not a coder. those few lines of code cost me a lot of time. most of you will laugh on the ugly code, the ugly structure and time i wasted. i know, the most of you would write something like this is an hour or less. for me it took several _full_ days of finding code snippets and trying to understand them.
- thx a lot to @texnixe for your help.
- also a lot help was the idea of this thread: [Embedding Snippets](https://forum.getkirby.com/t/embedding-snippets/900)

Include in site  
 ![snippet-tag](https://europe1.discourse-cdn.com/flex017/uploads/getkirby/original/2X/c/c61895046429fa992dca9388661299ae914607e9.jpg)

possible output (with align-problem)

 ![alignment-final](https://europe1.discourse-cdn.com/flex017/uploads/getkirby/original/2X/6/640fef12cb64e6311f26e7ac9173a9cc2f149eb1.jpg)

---

_[View the full topic](https://forum.getkirby.com/t/tagging-url-summary-page/9624)._
