CINXE.COM
devel:metadata [DokuWiki]
<!DOCTYPE html> <html lang="en" dir="ltr" class="no-js"> <head> <meta charset="utf-8" /> <title>devel:metadata [DokuWiki]</title> <meta name="generator" content="DokuWiki"/> <meta name="theme-color" content="#008800"/> <meta name="robots" content="index,follow"/> <meta name="keywords" content="devel,metadata"/> <link rel="search" type="application/opensearchdescription+xml" href="/lib/exe/opensearch.php" title="DokuWiki"/> <link rel="start" href="/"/> <link rel="contents" href="/devel:metadata?do=index" title="Sitemap"/> <link rel="manifest" href="/lib/exe/manifest.php"/> <link rel="alternate" type="application/rss+xml" title="Recent Changes" href="/feed.php"/> <link rel="alternate" type="application/rss+xml" title="Current namespace" href="/feed.php?mode=list&ns=devel"/> <link rel="edit" title="Edit this page" href="/devel:metadata?do=edit"/> <link rel="alternate" type="text/html" title="Plain HTML" href="/_export/xhtml/devel:metadata"/> <link rel="alternate" type="text/plain" title="Wiki Markup" href="/_export/raw/devel:metadata"/> <link rel="canonical" href="https://www.dokuwiki.org/devel:metadata"/> <link rel="stylesheet" href="/lib/exe/css.php?t=dokuwiki&tseed=f1005bad3d81fc9c803c7f93d32a390e"/> <link rel="alternate" hreflang="fr" href="https://www.dokuwiki.org/fr:devel:metadata"/> <link rel="alternate" hreflang="ja" href="https://www.dokuwiki.org/ja:devel:metadata"/> <link rel="alternate" hreflang="ko" href="https://www.dokuwiki.org/ko:devel:metadata"/> <link rel="alternate" hreflang="ru" href="https://www.dokuwiki.org/ru:devel:metadata"/> <link rel="alternate" hreflang="x-default" href="https://www.dokuwiki.org/devel:metadata"/> <script >var NS='devel';var JSINFO = {"plugins":{"edittable":{"default columnwidth":""}},"id":"devel:metadata","namespace":"devel","ACT":"show","useHeadingNavigation":0,"useHeadingContent":0};(function(H){H.className=H.className.replace(/\bno-js\b/,'js')})(document.documentElement);</script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.4/jquery.min.js" defer="defer"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.13.2/jquery-ui.min.js" defer="defer"></script> <script src="/lib/exe/js.php?t=dokuwiki&tseed=f1005bad3d81fc9c803c7f93d32a390e&lang=en" defer="defer"></script> <meta name="viewport" content="width=device-width,initial-scale=1" /> <link rel="shortcut icon" href="/lib/tpl/dokuwiki/images/favicon.ico" /> <link rel="apple-touch-icon" href="/lib/tpl/dokuwiki/images/apple-touch-icon.png" /> <meta name="verify-v1" content="OVxl3gsCv2MhZqh1cBQyl0JytWXSwXMjyvwc+4w3WtA=" /> <meta name="google-site-verification" content="YhTVK69hW94ZXUtc2zSLPxTkZKbZIn0zK67mz5WQB-E" /> <!-- Global site tag (gtag.js) - Google Analytics --> <script async src="https://www.googletagmanager.com/gtag/js?id=UA-83791-1"></script> <script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'UA-83791-1', { 'anonymize_ip': true }); </script> </head> <body> <div id="dokuwiki__site"><div id="dokuwiki__top" class="site dokuwiki mode_show tpl_dokuwiki showSidebar hasSidebar"> <!-- ********** HEADER ********** --> <header id="dokuwiki__header"><div class="pad group"> <div class="headings group"> <ul class="a11y skip"> <li><a href="#dokuwiki__content">skip to content</a></li> </ul> <h1 class="logo"><a href="/start" accesskey="h" title="Home [h]"><img src="/lib/tpl/dokuwiki/images/logo.png" width="64" height="64" alt="" /><span>DokuWiki</span></a></h1> <p class="claim">It's better when it's simple</p> </div> <div class="tools group"> <!-- USER TOOLS --> <div id="dokuwiki__usertools"> <h3 class="a11y">User Tools</h3> <ul> <li class="action login"><a href="/devel:metadata?do=login&sectok=" title="Log In" rel="nofollow"><span>Log In</span><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M10 17.25V14H3v-4h7V6.75L15.25 12 10 17.25M8 2h9a2 2 0 0 1 2 2v16a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2v-4h2v4h9V4H8v4H6V4a2 2 0 0 1 2-2z"/></svg></a></li> </ul> </div> <!-- SITE TOOLS --> <div id="dokuwiki__sitetools"> <h3 class="a11y">Site Tools</h3> <form action="/start" method="get" role="search" class="search doku_form" id="dw__search" accept-charset="utf-8"><input type="hidden" name="do" value="search" /><input type="hidden" name="id" value="devel:metadata" /><div class="no"><input name="q" type="text" class="edit" title="[F]" accesskey="f" placeholder="Search" autocomplete="on" id="qsearch__in" value="" /><button value="1" type="submit" title="Search">Search</button><div id="qsearch__out" class="ajax_qsearch JSpopup"></div></div></form> <div class="mobileTools"> <form action="/doku.php" method="get" accept-charset="utf-8"><div class="no"><input type="hidden" name="id" value="devel:metadata" /><select name="do" class="edit quickselect" title="Tools"><option value="">Tools</option><optgroup label="Page Tools"><option value="edit">Edit this page</option><option value="revisions">Old revisions</option><option value="backlink">Backlinks</option></optgroup><optgroup label="Site Tools"><option value="recent">Recent Changes</option><option value="media">Media Manager</option><option value="index">Sitemap</option></optgroup><optgroup label="User Tools"><option value="login">Log In</option></optgroup></select><button type="submit">></button></div></form> </div> <ul> <li class="action recent"><a href="/devel:metadata?do=recent" title="Recent Changes [r]" rel="nofollow" accesskey="r">Recent Changes</a></li><li class="action media"><a href="/devel:metadata?do=media&ns=devel" title="Media Manager" rel="nofollow">Media Manager</a></li><li class="action index"><a href="/devel:metadata?do=index" title="Sitemap [x]" rel="nofollow" accesskey="x">Sitemap</a></li> </ul> </div> </div> <!-- BREADCRUMBS --> <div class="breadcrumbs"> <div class="trace"><span class="bchead">Trace:</span> <span class="bcsep">•</span> <span class="curid"><bdi><a href="/devel:metadata" class="breadcrumbs" title="devel:metadata">metadata</a></bdi></span></div> </div> <hr class="a11y" /> </div></header><!-- /header --> <div class="wrapper group"> <!-- ********** ASIDE ********** --> <nav id="dokuwiki__aside" aria-label="Sidebar"><div class="pad aside include group"> <h3 class="toggle">Sidebar</h3> <div class="content"><div class="group"> <div class="plugin_translation is-dropdown"><span class="title">Translations of this page<sup><a href="/localization" class="wikilink1" title="localization" data-wiki-id="localization">?</a></sup>: </span><ul><li class="span"><span class="wikilink1" title="English">English (en)</span></li><li class="a"><a class="wikilink2" title="|العربية" href="/ar:devel:metadata">|العربية (ar)</a></li><li class="a"><a class="wikilink2" title="Català" href="/ca:devel:metadata">Català (ca)</a></li><li class="a"><a class="wikilink2" title="Česky" href="/cs:devel:metadata">Česky (cs)</a></li><li class="a"><a class="wikilink2" title="Dansk" href="/da:devel:metadata">Dansk (da)</a></li><li class="a"><a class="wikilink2" title="Deutsch" href="/de:devel:metadata">Deutsch (de)</a></li><li class="a"><a class="wikilink2" title="Ελληνικά" href="/el:devel:metadata">Ελληνικά (el)</a></li><li class="a"><a class="wikilink2" title="Esperanto" href="/eo:devel:metadata">Esperanto (eo)</a></li><li class="a"><a class="wikilink2" title="Español" href="/es:devel:metadata">Español (es)</a></li><li class="a"><a class="wikilink2" title="فارسی" href="/fa:devel:metadata">فارسی (fa)</a></li><li class="a"><a class="wikilink1" title="Français" href="/fr:devel:metadata">Français (fr)</a></li><li class="a"><a class="wikilink2" title="עברית" href="/he:devel:metadata">עברית (he)</a></li><li class="a"><a class="wikilink2" title="Magyar" href="/hu:devel:metadata">Magyar (hu)</a></li><li class="a"><a class="wikilink2" title="Italiano" href="/it:devel:metadata">Italiano (it)</a></li><li class="a"><a class="wikilink1" title="日本語" href="/ja:devel:metadata">日本語 (ja)</a></li><li class="a"><a class="wikilink1" title="한국어" href="/ko:devel:metadata">한국어 (ko)</a></li><li class="a"><a class="wikilink2" title="Lietuvių Kalba" href="/lt:devel:metadata">Lietuvių Kalba (lt)</a></li><li class="a"><a class="wikilink2" title="Nederlands" href="/nl:devel:metadata">Nederlands (nl)</a></li><li class="a"><a class="wikilink2" title="Norsk" href="/no:devel:metadata">Norsk (no)</a></li><li class="a"><a class="wikilink2" title="Polski" href="/pl:devel:metadata">Polski (pl)</a></li><li class="a"><a class="wikilink2" title="Português" href="/pt-br:devel:metadata">Português (pt-br)</a></li><li class="a"><a class="wikilink2" title="Română" href="/ro:devel:metadata">Română (ro)</a></li><li class="a"><a class="wikilink1" title="Русский" href="/ru:devel:metadata">Русский (ru)</a></li><li class="a"><a class="wikilink2" title="Српски Језик" href="/sr:devel:metadata">Српски Језик (sr)</a></li><li class="a"><a class="wikilink2" title="Svenska" href="/sv:devel:metadata">Svenska (sv)</a></li><li class="a"><a class="wikilink2" title="ไทย" href="/th:devel:metadata">ไทย (th)</a></li><li class="a"><a class="wikilink2" title="Українська" href="/uk:devel:metadata">Українська (uk)</a></li><li class="a"><a class="wikilink2" title="中文" href="/zh:devel:metadata">中文 (zh)</a></li><li class="a"><a class="wikilink2" title="繁體中文" href="/zh-tw:devel:metadata">繁體中文 (zh-tw)</a></li></ul></div> <p> <strong>Learn about DokuWiki</strong> </p> <ul> <li class="level1"><div class="li"> <a href="/features" class="wikilink1" title="features" data-wiki-id="features">Features</a> & <a href="/blogroll" class="wikilink1" title="blogroll" data-wiki-id="blogroll">reviews</a> </div> </li> <li class="level1"><div class="li"> <a href="/install" class="wikilink1" title="install" data-wiki-id="install">Installation guide</a></div> </li> <li class="level1"><div class="li"> <a href="/manual" class="wikilink1" title="manual" data-wiki-id="manual">User manual</a> & <a href="/wiki:syntax" class="wikilink1" title="wiki:syntax" data-wiki-id="wiki:syntax">syntax</a></div> </li> <li class="level1"><div class="li"> <a href="/changes" class="wikilink1" title="changes" data-wiki-id="changes">Release notes</a></div> </li> <li class="level1"><div class="li"> <a href="/faq" class="wikilink1" title="faq" data-wiki-id="faq">FAQ</a></div> </li> </ul> <p> <strong>Advanced Use</strong> </p> <ul> <li class="level1"><div class="li"> <a href="/extensions" class="wikilink1" title="extensions" data-wiki-id="extensions">Extensions</a></div> </li> <li class="level1"><div class="li"> <a href="/development" class="wikilink1" title="development" data-wiki-id="development">Development manual</a></div> </li> </ul> <p> <strong>Corporate Use</strong> </p> <ul> <li class="level1"><div class="li"> <a href="/faq:support" class="wikilink1" title="faq:support" data-wiki-id="faq:support">Get support</a></div> </li> <li class="level1"><div class="li"> <a href="/donate" class="wikilink1" title="donate" data-wiki-id="donate">Donations</a></div> </li> </ul> <p> <strong>Our Community</strong> </p> <ul> <li class="level1"><div class="li"> <a href="/teams:getting_involved" class="wikilink1" title="teams:getting_involved" data-wiki-id="teams:getting_involved">Get involved</a></div> </li> <li class="level1"><div class="li"> <a href="/dokuinstall" class="wikilink1" title="dokuinstall" data-wiki-id="dokuinstall">Users</a></div> </li> <li class="level1"><div class="li"> <a href="http://forum.dokuwiki.org" class="urlextern" title="http://forum.dokuwiki.org">User forum</a></div> </li> <li class="level1"><div class="li"> <a href="/mailinglist" class="wikilink1" title="mailinglist" data-wiki-id="mailinglist">Development mailinglist</a></div> </li> </ul> <hr /> <p> Follow us on <a href="https://phpc.social/@dokuwiki" class="urlextern" title="https://phpc.social/@dokuwiki">Mastodon</a> and other <a href="/social" class="wikilink1" title="social" data-wiki-id="social">social networks</a>. </p> <p> <a href="/privacy" class="wikilink1" title="privacy" data-wiki-id="privacy">Our Privacy Policy</a> </p> </div></div> </div></nav><!-- /aside --> <!-- ********** CONTENT ********** --> <main id="dokuwiki__content"><div class="pad group"> <div class="pageId"><span>devel:metadata</span></div> <div class="page group"> <!-- wikipage start --> <!-- TOC START --> <div id="dw__toc" class="dw__toc"> <h3 class="toggle">Table of Contents</h3> <div> <ul class="toc"> <li class="level1"><div class="li"><a href="#metadata_storage">Metadata Storage</a></div> <ul class="toc"> <li class="level2"><div class="li"><a href="#storage">Storage</a></div></li> <li class="level2"><div class="li"><a href="#metadata_renderer">Metadata Renderer</a></div> <ul class="toc"> <li class="level3"><div class="li"><a href="#data_structure">Data Structure</a></div></li> <li class="level3"><div class="li"><a href="#metadata_persistence">Metadata Persistence</a></div></li> <li class="level3"><div class="li"><a href="#running_of_metadata_rendering">Running of metadata rendering</a></div></li> <li class="level3"><div class="li"><a href="#metadata_and_plugins">Metadata and Plugins</a></div></li> <li class="level3"><div class="li"><a href="#functions_to_get_and_set_metadata">Functions to Get and Set Metadata</a></div></li> <li class="level3"><div class="li"><a href="#metadata_and_caching">Metadata and caching</a></div></li> </ul> </li> <li class="level2"><div class="li"><a href="#metadata_index">Metadata index</a></div></li> </ul></li> </ul> </div> </div> <!-- TOC END --> <h1 class="sectionedit1" id="metadata_storage">Metadata Storage</h1> <div class="level1"> <p> If the content stored in a wiki page is <em>data</em>, things like the time of last update, who updated it, the filesize etc. could all be regarded as <em>metadata</em> for the wiki page. This page describes where and how such additional data is stored in DokuWiki. </p> <p> Metadata can also be used by plugins for different purposes, apart from storing obvious metadata for the page it can also be used to store data that can be used to determine whether a cache can be used or settings like if a certain feature of the plugin should be enabled on a page. </p> </div> <div class="secedit editbutton_section editbutton_1"><form class="button btn_secedit" method="post" action="/devel:metadata"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1677566584" /><input type="hidden" name="summary" value="[Metadata Storage] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="metadata_storage" /><input type="hidden" name="codeblockOffset" value="0" /><input type="hidden" name="range" value="1-573" /><button type="submit" title="Metadata Storage">Edit</button></div></form></div> <h2 class="sectionedit2" id="storage">Storage</h2> <div class="level2"> <p> DokuWiki does not store all metadata at central place (like a database or registry). Metadata can basically be the own datafile's properties (eg. filesize, last modified date), the other metadata are kept by DokuWiki within the <code>meta</code> directory. Metadata are found within the <code>.meta</code> file corresponding to the wiki page name. There is also an <a href="#metadata_index" title="devel:metadata ↵" class="wikilink1">index</a> in which selected metadata can be searched. </p> </div> <div class="secedit editbutton_section editbutton_2"><form class="button btn_secedit" method="post" action="/devel:metadata"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1677566584" /><input type="hidden" name="summary" value="[Storage] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="storage" /><input type="hidden" name="codeblockOffset" value="0" /><input type="hidden" name="range" value="574-1012" /><button type="submit" title="Storage">Edit</button></div></form></div> <h2 class="sectionedit3" id="metadata_renderer">Metadata Renderer</h2> <div class="level2"> <p> Info in the <code>meta</code> directory is initially written by the metadata renderer. It creates a parallel file for each page named <code><pageid>.meta</code> in the <code>meta</code> directory. The file is a serialized multi-dimensional PHP array whose keys follow the <a href="http://dublincore.org/" class="urlextern" title="http://dublincore.org/">Dublin Core</a> element names. </p> </div> <div class="secedit editbutton_section editbutton_3"><form class="button btn_secedit" method="post" action="/devel:metadata"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1677566584" /><input type="hidden" name="summary" value="[Metadata Renderer] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="metadata_renderer" /><input type="hidden" name="codeblockOffset" value="0" /><input type="hidden" name="range" value="1013-1343" /><button type="submit" title="Metadata Renderer">Edit</button></div></form></div> <h3 class="sectionedit4" id="data_structure">Data Structure</h3> <div class="level3"> <p> Currently, the following metadata is saved by the core metadata renderer: </p> <ul> <li class="level1"><div class="li"> <code>title</code> – string, first heading</div> </li> <li class="level1"><div class="li"> <code>creator</code> – string, full name of the user who created the page</div> </li> <li class="level1"><div class="li"> <code>user</code> – string, the login name of the user who created the page</div> </li> <li class="level1 node"><div class="li"> <code>description</code> – array</div> <ul> <li class="level2"><div class="li"> <code>abstract</code> – raw text abstract (250 to 500 chars) of the page</div> </li> <li class="level2"><div class="li"> <code>tableofcontents</code> – array, list of arrays with header id ('hid'), title ('title'), list item type ('type') and header level ('level')</div> </li> </ul> </li> <li class="level1"><div class="li"> <code>contributor</code> array, list of user ID ⇒ full name of users, who have contributed to the page</div> </li> <li class="level1 node"><div class="li"> <code>date</code> – array</div> <ul> <li class="level2"><div class="li"> <code>created</code> – timestamp, creation date</div> </li> <li class="level2"><div class="li"> <code>modified</code>– timestamp, date of last non-minor modification</div> </li> <li class="level2 node"><div class="li"> <code>valid</code></div> <ul> <li class="level3"><div class="li"> <code>age</code> – seconds, period in seconds before the page should be refreshed (used by 'rss' syntax only)</div> </li> </ul> </li> </ul> </li> <li class="level1 node"><div class="li"> <code>last_change</code> – array, the last changelog entry</div> <ul> <li class="level2"><div class="li"> <code>date</code> – timestamp, date of the last change</div> </li> <li class="level2"><div class="li"> <code>ip</code> – ip of the user editing</div> </li> <li class="level2"><div class="li"> <code>type</code> – type of the edit (C create, E edit, e minor edit, D delete, R revert)</div> </li> <li class="level2"><div class="li"> <code>id</code> – id of the page</div> </li> <li class="level2"><div class="li"> <code>user</code> – username of the user editing</div> </li> <li class="level2"><div class="li"> <code>sum</code> – summary of the editor</div> </li> <li class="level2"><div class="li"> <code>extra</code> – extra data, used for storing the revision (timestamp) in the case of a revert</div> </li> </ul> </li> <li class="level1 node"><div class="li"> <code>relation</code> – array</div> <ul> <li class="level2"><div class="li"> <code>isreferencedby</code> – array, list of pages that link to this page: ID ⇒ boolean exists, this is not used or written by DokuWiki core</div> </li> <li class="level2"><div class="li"> <code>references</code> – array, list of linked pages: page ID ⇒ boolean exists</div> </li> <li class="level2"><div class="li"> <code>media</code> – array, list of linked media files: media ID ⇒ boolean exists</div> </li> <li class="level2"><div class="li"> <code>firstimage</code> – id or url of the first image in the page</div> </li> <li class="level2"><div class="li"> <code>haspart</code> – array, list of included rss feeds (and more, see below)</div> </li> </ul> </li> <li class="level1 node"><div class="li"> <code>internal</code> – array</div> <ul> <li class="level2"><div class="li"> <code>cache</code> – boolean, if the cache may be used</div> </li> <li class="level2"><div class="li"> <code>toc</code> – boolean, if the toc shall be displayed</div> </li> </ul> </li> </ul> <p> Additionally, plugins can support more metadata elements. Currently used: </p> <ul> <li class="level1 node"><div class="li"> <code>relation</code> – array</div> <ul> <li class="level2"><div class="li"> <code>haspart</code> – array, list of included pages: ID ⇒ boolean exists (<a href="/plugin:include" class="wikilink1" title="plugin:include" data-wiki-id="plugin:include">include</a> plugin) or rss feeds</div> </li> <li class="level2 node"><div class="li"> <code>odt</code> – array, list with properties for <a href="/plugin:odt" class="wikilink1" title="plugin:odt" data-wiki-id="plugin:odt">ODT</a> plugin</div> <ul> <li class="level3"><div class="li"> <code>template</code> – media id of ODT-file used as template</div> </li> </ul> </li> </ul> </li> <li class="level1"><div class="li"> <code>subject</code> – array, lists of tags (<a href="/plugin:tag" class="wikilink1" title="plugin:tag" data-wiki-id="plugin:tag">tag</a> plugin, <a href="/plugin:blogtng" class="wikilink1" title="plugin:blogtng" data-wiki-id="plugin:blogtng">blogtng</a> plugin, <a href="/plugin:flattr" class="wikilink1" title="plugin:flattr" data-wiki-id="plugin:flattr">flattr</a> plugin); this is used by <code>feed.php</code>, if present</div> </li> <li class="level1"><div class="li"> <code>type</code> – string, 'draft' for drafts (<a href="/plugin:blog" class="wikilink1" title="plugin:blog" data-wiki-id="plugin:blog">blog</a> plugin)</div> </li> <li class="level1 node"><div class="li"> <code>geo</code> – array, list of geographic tags (<a href="/plugin:geotag" class="wikilink1" title="plugin:geotag" data-wiki-id="plugin:geotag">geotag</a>, <a href="/plugin:openlayersmap" class="wikilink1" title="plugin:openlayersmap" data-wiki-id="plugin:openlayersmap">openlayersmap</a>, <a href="/plugin:socialcards" class="wikilink1" title="plugin:socialcards" data-wiki-id="plugin:socialcards">socialcards</a> and <a href="/plugin:spatialhelper" class="wikilink1" title="plugin:spatialhelper" data-wiki-id="plugin:spatialhelper">spatialhelper</a> plugins)</div> <ul> <li class="level2"><div class="li"> <code>lat</code> – number, latitude of this location in decimal degrees</div> </li> <li class="level2"><div class="li"> <code>lon</code> – number, longitude of this location in decimal degrees</div> </li> <li class="level2"><div class="li"> <code>alt</code> – number, altitude in meter above sea level</div> </li> <li class="level2"><div class="li"> <code>region</code> – string, region of this location, eg. a province or state</div> </li> <li class="level2"><div class="li"> <code>country</code> – string, the country of this location</div> </li> <li class="level2"><div class="li"> <code>placename</code> – string, placename describing this location or area</div> </li> <li class="level2"><div class="li"> <code>geohash</code> – string, geohash of this location</div> </li> </ul> </li> </ul> <p> It's recommended to use keys from the <a href="http://dublincore.org/documents/dces/" class="urlextern" title="http://dublincore.org/documents/dces/">Dublin Core element set</a> for any metadata that might be interesting for external use. </p> <p> For plugin internal data it is recommended to store your keys under the <code>plugin</code> key: </p> <ul> <li class="level1 node"><div class="li"> <code>plugin</code> – array, contains keys for all plugins storing metadata</div> <ul> <li class="level2"><div class="li"> <code>yourplugin</code> – array, the keys you need for your plugin</div> </li> </ul> </li> </ul> <p> This data is stored in an associative array with two keys: 'current' for all current data (including persistent one), 'persistent' for data that shall be kept over metadata rendering. </p> </div> <div class="secedit editbutton_section editbutton_4"><form class="button btn_secedit" method="post" action="/devel:metadata"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1677566584" /><input type="hidden" name="summary" value="[Data Structure] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="data_structure" /><input type="hidden" name="codeblockOffset" value="0" /><input type="hidden" name="range" value="1344-5053" /><button type="submit" title="Data Structure">Edit</button></div></form></div> <h3 class="sectionedit5" id="metadata_persistence">Metadata Persistence</h3> <div class="level3"> <p> Internally DokuWiki maintains two arrays of metadata, <code>current</code> & <code>persistent</code>. The <code>persistent</code> array holds duplicates of those key/values which should not be cleared during the rendering process. All requests for metadata values using <code>p_get_metadata()</code> are met using the <code>current</code> array. </p> <p> Examples of persistent metadata keys are: </p> <ul> <li class="level1"><div class="li"> 'creator'</div> </li> <li class="level1"><div class="li"> 'contributor'</div> </li> </ul> </div> <div class="secedit editbutton_section editbutton_5"><form class="button btn_secedit" method="post" action="/devel:metadata"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1677566584" /><input type="hidden" name="summary" value="[Metadata Persistence] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="metadata_persistence" /><input type="hidden" name="codeblockOffset" value="0" /><input type="hidden" name="range" value="5054-5466" /><button type="submit" title="Metadata Persistence">Edit</button></div></form></div> <h3 class="sectionedit6" id="running_of_metadata_rendering">Running of metadata rendering</h3> <div class="level3"> <p> The metadata rendering is only started by the <code><a href="https://codesearch.dokuwiki.org/search?project=dokuwiki&defs=p_get_metadata&path=" class="interwiki plugin_xref" title="view definition for p_get_metadata()">p_get_metadata()</a></code> and <code><a href="https://codesearch.dokuwiki.org/search?project=dokuwiki&defs=p_set_metadata&path=" class="interwiki plugin_xref" title="view definition for p_set_metadata()">p_set_metadata()</a></code>. This differs from the xhtml renderer. The wikipage parsing process has two stages: generation of the instructions by the <a href="/devel:parser#handler" class="wikilink1" title="devel:parser" data-wiki-id="devel:parser">Handler</a> and next the generation of xhtml output with these instructions as input. As all <a href="/devel:parser#renderer" class="wikilink1" title="devel:parser" data-wiki-id="devel:parser">Renderers</a> the metadata renderer uses the same instructions as input. In the metadata renderer the metadata can directly be accessed at <code>renderer->meta</code> and <code>renderer->persistent</code>. Some examples and bit of explanation can be found at <a href="/devel:syntax_plugins#render_method" class="wikilink1" title="devel:syntax_plugins" data-wiki-id="devel:syntax_plugins">syntax plugins development documentation</a>. </p> <p> The metadata renderer creates also an short raw text abstract. The abstract is created from the rendered instruction by adding compact text without html to <code>$this->doc</code>. Use the <code>$this->capture</code> to check whether the renderer still collects text for the abstract. </p> <pre class="code php"><span class="co1">// capture only the first few sections. </span> <span class="co1">// Is switched off as well by eg. section metarenderer</span> <span class="kw1">if</span> <span class="br0">(</span><span class="re0">$this</span><span class="sy0">-></span><span class="me1">capture</span><span class="br0">)</span><span class="br0">{</span> <span class="kw1">if</span><span class="br0">(</span><span class="re0">$linktitle</span><span class="br0">)</span> <span class="br0">{</span> <span class="re0">$this</span><span class="sy0">-></span><span class="me1">doc</span> <span class="sy0">.=</span> <span class="re0">$linktitle</span><span class="sy0">;</span> <span class="br0">}</span> <span class="kw1">else</span> <span class="br0">{</span> <span class="re0">$this</span><span class="sy0">-></span><span class="me1">doc</span> <span class="sy0">.=</span> <span class="st_h">'<'</span><span class="sy0">.</span><span class="re0">$url</span><span class="sy0">.</span><span class="st_h">'>'</span><span class="sy0">;</span> <span class="br0">}</span> <span class="br0">}</span></pre> <p> The timing is thus not equal to xhtml renderer, but depends on render flags given to the <code>p_get_metadata()</code> and the <a href="#metadata_and_caching" title="devel:metadata ↵" class="wikilink1">cache status</a>. The logic here is to guarantee the metadata renderer is running when needed, but not unnecessary. Read more about render flags in <a href="#functions_to_get_and_set_metadata" title="devel:metadata ↵" class="wikilink1">functions to Get and Set Metadata</a> below. </p> </div> <div class="secedit editbutton_section editbutton_6"><form class="button btn_secedit" method="post" action="/devel:metadata"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1677566584" /><input type="hidden" name="summary" value="[Running of metadata rendering] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="running_of_metadata_rendering" /><input type="hidden" name="codeblockOffset" value="0" /><input type="hidden" name="range" value="5467-7064" /><button type="submit" title="Running of metadata rendering">Edit</button></div></form></div> <h3 class="sectionedit7" id="metadata_and_plugins">Metadata and Plugins</h3> <div class="level3"> <p> There are two ways for plugins to interact with metadata rendering: </p> <ul> <li class="level1"><div class="li"> <a href="/devel:syntax_plugins" class="wikilink1" title="devel:syntax_plugins" data-wiki-id="devel:syntax_plugins">Syntax Plugins</a> can create metadata for the rendered page with their <code>render()</code> method by handling the <code>$format=="metadata"</code>. The current metadata can be accessed and modified in the <code>renderer->meta</code> array and persistent values are in the <code>renderer->persistent</code> array, when persistent metadata is modified the copy of it in the current metadata should be modified, too.</div> </li> <li class="level1"><div class="li"> <a href="/devel:action_plugins" class="wikilink1" title="devel:action_plugins" data-wiki-id="devel:action_plugins">Action Plugins</a> can register for the <a href="/devel:event:parser_metadata_render" class="wikilink1" title="devel:event:parser_metadata_render" data-wiki-id="devel:event:parser_metadata_render">PARSER_METADATA_RENDER</a> method to inspect or modify metadata before or after metadata rendering.</div> </li> </ul> <p> Persistent metadata can also be set at any time using the <code><a href="https://codesearch.dokuwiki.org/search?project=dokuwiki&defs=p_set_metadata&path=" class="interwiki plugin_xref" title="view definition for p_set_metadata">p_set_metadata</a></code> function that is described below, <em class="u">current</em> metadata should <em class="u">only</em> be set in the context of the renderer as it will be overwritten the next time metadata is rendered. </p> <p> Metadata can be retrieved using the <code><a href="https://codesearch.dokuwiki.org/search?project=dokuwiki&defs=p_get_metadata&path=" class="interwiki plugin_xref" title="view definition for p_get_metadata">p_get_metadata</a></code> function that is described below. Plugins can also add metadata to the <a href="#metadata_index" title="devel:metadata ↵" class="wikilink1">metadata index</a> and search the indexed metadata. This is used in the <a href="/plugin:tag" class="wikilink1" title="plugin:tag" data-wiki-id="plugin:tag">tag</a> plugin. </p> <p> Note that persistent metadata is never cleaned and always used as basis for the current metadata so when switching from persistent to non-persistent metadata in a plugin make sure you implement a cleanup routine which removes persistent metadata from your plugin whenever it exists. For this reason non-persistent metadata should also be preferred whenever possible. </p> <p> If you want to make sure that your plugin's metadata doesn't interfere with other plugins or DokuWiki itself consider using <code>plugin_$plugin</code> as prefix/top level key (especially for persistent metadata, current metadata that fits in the Dublin Core element set should be stored as outlined above). </p> <p> As it is very difficult to cleanly update persistent metadata properties that are arrays from various places (in most cases you don't know which is old metadata that should be cleaned up and which is metadata from other plugins that should be kept - or not because the plugin was disabled) consider using keys that are unique to your plugin for this case and merge them manually into the current metadata using the <a href="/devel:event:parser_metadata_render" class="wikilink1" title="devel:event:parser_metadata_render" data-wiki-id="devel:event:parser_metadata_render">PARSER_METADATA_RENDER</a> event, that way you can for example store custom tags in the persistent metadata and add them to the <code>subject</code> metadata. Then your plugin's metadata also won't be used anymore when your plugin is disabled. </p> </div> <div class="secedit editbutton_section editbutton_7"><form class="button btn_secedit" method="post" action="/devel:metadata"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1677566584" /><input type="hidden" name="summary" value="[Metadata and Plugins] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="metadata_and_plugins" /><input type="hidden" name="codeblockOffset" value="1" /><input type="hidden" name="range" value="7065-9577" /><button type="submit" title="Metadata and Plugins">Edit</button></div></form></div> <h3 class="sectionedit8" id="functions_to_get_and_set_metadata">Functions to Get and Set Metadata</h3> <div class="level3"> <p> There are two functions in <code>inc/parserutils.php</code> to deal with metadata: </p> <ul> <li class="level1 node"><div class="li"> <code><a href="https://codesearch.dokuwiki.org/search?project=dokuwiki&defs=p_get_metadata&path=" class="interwiki plugin_xref" title="view definition for p_get_metadata">p_get_metadata</a>($id, $key, $render)</code> returns a metadata value for a page.</div> <ul> <li class="level2"><div class="li"> <code>$id</code> is the ID of a wiki page; required</div> </li> <li class="level2"><div class="li"> <code>$key</code> the name of the metadata item to be retrieved. Defaults to false. If empty, an array of all the metadata items is returned. For retrieving items that are stored in sub-arrays, separate the keys of the different levels by spaces like <code>relation references</code> for the data stored in <code>$meta['relation']['references']</code> in the renderer.</div> </li> <li class="level2 node"><div class="li"> <code>$render</code> int, the parameter determines if the page metadata should be generated by the renderer when the metadata cache indicates that it shouldn't be used and <code>p_get_metadata</code> isn't called from within <code>p_get_metadata</code>. There are several possibilities:</div> <ul> <li class="level3"><div class="li"> <code>METADATA_DONT_RENDER</code> means the metadata won't be generated/updated on request, use this when you request metadata for a lot of pages in a row as <code>p_get_metadata</code> can trigger the parsing and rendering of the requested page.</div> </li> <li class="level3"><div class="li"> <code>METADATA_RENDER_USING_CACHE</code> is the default, it uses the standard DokuWiki <a href="/devel:caching" class="wikilink1" title="devel:caching" data-wiki-id="devel:caching">caching</a> system, the behavior can be changed using the <a href="/devel:event:parser_cache_use" class="wikilink1" title="devel:event:parser_cache_use" data-wiki-id="devel:event:parser_cache_use">PARSER_CACHE_USE</a> event. Below you can find more details on <a href="#metadata_and_caching" title="devel:metadata ↵" class="wikilink1">metadata and caching</a>.</div> </li> <li class="level3"><div class="li"> <code>METADATA_RENDER_SIMPLE_CACHE</code> means a lot simpler caching will be used, it only considers the modification time of the page and can't be changed using plugins. Use this when you request very simple properties of the page like its title.</div> </li> <li class="level3"><div class="li"> <code>METADATA_RENDER_UNLIMITED</code> means that metadata for an unlimited number of pages should be rendered. Normally only <code>P_GET_METADATA_RENDER_LIMIT</code> (default: 5) pages are rendered for metadata in one request. This should be used in locations like the cli indexer where time doesn't really matter but metadata should always be fresh. This option can be combined with the previous two options using logical or.</div> </li> <li class="level3"><div class="li"> <code>false</code> is interpreted as <code>METADATA_DONT_RENDER</code> (this parameter used to be a boolean before the 2011-05-25 release)</div> </li> <li class="level3"><div class="li"> <code>true</code> is interpreted as <code>METADATA_RENDER_USING_CACHE</code></div> </li> </ul> </li> </ul> </li> <li class="level1 node"><div class="li"> <code><a href="https://codesearch.dokuwiki.org/search?project=dokuwiki&defs=p_set_metadata&path=" class="interwiki plugin_xref" title="view definition for p_set_metadata">p_set_metadata</a>($id, $data, $render, $persistent)</code> sets some properties in the metadata, uses the metadata inside the renderer when there is a renderer for the specified page.</div> <ul> <li class="level2"><div class="li"> <code>$id</code> is the ID of a wiki page; required</div> </li> <li class="level2"><div class="li"> <code>$data</code> is an array with <code>key => value</code> pairs to be set in the metadata, required. Note that here the keys are only keys for the top level. If the key is <code>description</code>, <code>data</code> or <code>contributor</code> the value is expected to be an array and merged with the existing data, if the key is <code>relation</code>, all sub-keys will be merged when there is existing array data for them. Other keys are not merged as array, but just stored as value, which will overwrite eventually subkeys.</div> </li> <li class="level2"><div class="li"> <code>$render</code> boolean, whether or not the page metadata should be generated with the renderer before the metadata is set; optional, default is false</div> </li> <li class="level2"><div class="li"> <code>$persistent</code> a boolean which indicates whether or not the particular metadata value will persist through the next metadata rendering. The default value is true.</div> </li> </ul> </li> </ul> </div> <div class="secedit editbutton_section editbutton_8"><form class="button btn_secedit" method="post" action="/devel:metadata"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1677566584" /><input type="hidden" name="summary" value="[Functions to Get and Set Metadata] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="functions_to_get_and_set_metadata" /><input type="hidden" name="codeblockOffset" value="1" /><input type="hidden" name="range" value="9578-12873" /><button type="submit" title="Functions to Get and Set Metadata">Edit</button></div></form></div> <h3 class="sectionedit9" id="metadata_and_caching">Metadata and caching</h3> <div class="level3"> <p> In general, metadata is rendered on demand when <code><a href="https://codesearch.dokuwiki.org/search?project=dokuwiki&defs=p_get_metadata&path=" class="interwiki plugin_xref" title="view definition for p_get_metadata">p_get_metadata</a></code> is called. This happens normally right after the redirect after saving a page but also from time to time when the cache expires or is expired by a plugin using the <a href="/devel:event:parser_cache_use" class="wikilink1" title="devel:event:parser_cache_use" data-wiki-id="devel:event:parser_cache_use">PARSER_CACHE_USE</a> event or when caching has been disabled in the renderer (but at most once in every request). In the cache file itself only a timestamp is stored. The timestamp is always updated when metadata is rendered, the <code>.meta</code> file only when the metadata was actually changed (the <code>xhtml</code> cache depends on it, that way it is only updated when really needed). </p> <p> When metadata is requested inside the cache handler the old metadata is returned, that way you can compare new data to the old stored metadata in order to decide whether to use the cache or not. In the xhtml cache handler you get the new metadata but as the xhtml cache depends on the metadata whenever you change the metadata the xhtml will be updated. </p> <p> In versions prior to 2011, metadata was only rendered when the xhtml was rendered. Back then you got the old metadata in the xhtml cache handler, plugins that still rely on this need to be updated. </p> </div> <div class="secedit editbutton_section editbutton_9"><form class="button btn_secedit" method="post" action="/devel:metadata"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1677566584" /><input type="hidden" name="summary" value="[Metadata and caching] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="metadata_and_caching" /><input type="hidden" name="codeblockOffset" value="1" /><input type="hidden" name="range" value="12874-14103" /><button type="submit" title="Metadata and caching">Edit</button></div></form></div> <h2 class="sectionedit10" id="metadata_index">Metadata index</h2> <div class="level2"> <p> Since the 2011-05-25 (“Rincewind”) release there is an index where metadata properties can be stored. It is organized in a similar manner as the <a href="/devel:fulltextindex" class="wikilink1" title="devel:fulltextindex" data-wiki-id="devel:fulltextindex">fulltextindex</a> and uses the same page list but different word indexes for each indexed metadata property, they are named <code>$metaname_w.idx</code>, <code>$metaname_i.idx</code> and <code>$metaname_p.idx</code>. In DokuWiki itself currently the properties <code>relation_references</code> and <code>title</code> are indexed. Plugins can add their own metadata keys and it is also possible to add arbitrary data to the index. This can be done with the <a href="/devel:event:indexer_page_add" class="wikilink1" title="devel:event:indexer_page_add" data-wiki-id="devel:event:indexer_page_add">INDEXER_PAGE_ADD</a> event. Plugins need to make sure they add themselves to the indexer version using the <a href="/devel:event:indexer_version_get" class="wikilink1" title="devel:event:indexer_version_get" data-wiki-id="devel:event:indexer_version_get">INDEXER_VERSION_GET</a> event, the index of a page is re-created when this version is different from the version with which it has been indexed before. All metadata indexes are recorded in the <code>metadata.idx</code> index so deleted pages can be removed from all metadata indexes. </p> <p> The data is updated right after the <a href="/devel:fulltextindex" class="wikilink1" title="devel:fulltextindex" data-wiki-id="devel:fulltextindex">fulltextindex</a> so it can be regenerated in the same way, when a plugin wants to force an update of the index of a certain page it can delete the <code>.indexed</code> <a href="https://codesearch.dokuwiki.org/search?project=dokuwiki&defs=metaFN&path=" class="interwiki plugin_xref" title="view definition for metaFN">meta file</a> of that page (the index is not automatically updated when metadata is changed but only when the page itself is changed). </p> <p> The indexer object (which can be obtained by using <code><a href="https://codesearch.dokuwiki.org/search?project=dokuwiki&defs=idx_get_indexer&path=" class="interwiki plugin_xref" title="view definition for idx_get_indexer">idx_get_indexer</a></code>) supports the following methods for metadata: </p> <ul> <li class="level1"><div class="li"> <strong><code><a href="https://codesearch.dokuwiki.org/search?project=dokuwiki&defs=addMetaKeys&path=" class="interwiki plugin_xref" title="view definition for addMetaKeys">addMetaKeys($page, $key, $value=null)</a></code></strong> - adds one or more metadata entries to a page (normally this should be done using <a href="/devel:event:indexer_page_add" class="wikilink1" title="devel:event:indexer_page_add" data-wiki-id="devel:event:indexer_page_add">INDEXER_PAGE_ADD</a> but if plugins want to update the index explicitly and immediately this function can be used)</div> </li> <li class="level1"><div class="li"> <strong><code><a href="https://codesearch.dokuwiki.org/search?project=dokuwiki&defs=lookupKey&path=" class="interwiki plugin_xref" title="view definition for lookupKey">lookupKey($key, &$value, $func=null)</a></code></strong> - for looking up all pages where a certain metadata key has the specified value. It is possible to pass multiple keys as array, then an array with matches for each key is returned. Additionally with the <code>$func</code> parameter it is possible to pass a comparison function like <code>preg_match</code>.</div> </li> <li class="level1"><div class="li"> <strong><code><a href="https://codesearch.dokuwiki.org/search?project=dokuwiki&defs=getPages&path=" class="interwiki plugin_xref" title="search definitions for getPages">getPages($key=null)</a></code></strong> - if the $key parameter is set only pages where the metadata key <code>$key</code> is set to at least one value are returned.</div> </li> </ul> <p> Example for getting the ids of all pages that link to a certain page: </p> <pre class="code php"><span class="re0">$result</span> <span class="sy0">=</span> idx_get_indexer<span class="br0">(</span><span class="br0">)</span><span class="sy0">-></span><span class="me1">lookupKey</span><span class="br0">(</span><span class="st_h">'relation_references'</span><span class="sy0">,</span> <span class="re0">$id</span><span class="br0">)</span><span class="sy0">;</span></pre> <p> (note that this functionality including an <abbr title="Access Control List">ACL</abbr> check is available as <code><a href="https://codesearch.dokuwiki.org/search?project=dokuwiki&defs=ft_backlinks&path=" class="interwiki plugin_xref" title="view definition for ft_backlinks">ft_backlinks($id)</a></code>). </p> <p> For more advanced queries (like getting all values stored for a certain metadata property) can be needed to access the index files directly using <code><a href="https://codesearch.dokuwiki.org/search?project=dokuwiki&defs=idx_getIndex&path=" class="interwiki plugin_xref" title="view definition for idx_getIndex">idx_getIndex</a></code>, feel free to suggest additional features for the metadata index in the <a href="https://github.com/dokuwiki/dokuwiki/issues" class="urlextern" title="https://github.com/dokuwiki/dokuwiki/issues">bug tracker</a>. </p> <p> The <a href="/plugin:tag" class="wikilink1" title="plugin:tag" data-wiki-id="plugin:tag">tag</a> plugin uses the metadata index, in its helper part there are example of how the index can be queried, in its action part you can see how the index is written. </p> </div> <div class="secedit editbutton_section editbutton_10"><form class="button btn_secedit" method="post" action="/devel:metadata"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1677566584" /><input type="hidden" name="summary" value="[Metadata index] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="metadata_index" /><input type="hidden" name="codeblockOffset" value="1" /><input type="hidden" name="range" value="14104-" /><button type="submit" title="Metadata index">Edit</button></div></form></div> <!-- wikipage stop --> </div> <div class="docInfo"><bdi>devel/metadata.txt</bdi> · Last modified: <time datetime="2023-02-28T07:43:04+0100">2023-02-28 07:43</time> by <bdi>saggi</bdi></div> <hr class="a11y" /> </div></main><!-- /content --> <!-- PAGE ACTIONS --> <nav id="dokuwiki__pagetools" aria-labelledby="dokuwiki__pagetools__heading"> <h3 class="a11y" id="dokuwiki__pagetools__heading">Page Tools</h3> <div class="tools"> <ul> <li class="edit"><a href="/devel:metadata?do=edit" title="Edit this page [e]" rel="nofollow" accesskey="e"><span>Edit this page</span><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M20.71 7.04c.39-.39.39-1.04 0-1.41l-2.34-2.34c-.37-.39-1.02-.39-1.41 0l-1.84 1.83 3.75 3.75M3 17.25V21h3.75L17.81 9.93l-3.75-3.75L3 17.25z"/></svg></a></li><li class="revs"><a href="/devel:metadata?do=revisions" title="Old revisions [o]" rel="nofollow" accesskey="o"><span>Old revisions</span><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M11 7v5.11l4.71 2.79.79-1.28-4-2.37V7m0-5C8.97 2 5.91 3.92 4.27 6.77L2 4.5V11h6.5L5.75 8.25C6.96 5.73 9.5 4 12.5 4a7.5 7.5 0 0 1 7.5 7.5 7.5 7.5 0 0 1-7.5 7.5c-3.27 0-6.03-2.09-7.06-5h-2.1c1.1 4.03 4.77 7 9.16 7 5.24 0 9.5-4.25 9.5-9.5A9.5 9.5 0 0 0 12.5 2z"/></svg></a></li><li class="backlink"><a href="/devel:metadata?do=backlink" title="Backlinks" rel="nofollow"><span>Backlinks</span><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M10.59 13.41c.41.39.41 1.03 0 1.42-.39.39-1.03.39-1.42 0a5.003 5.003 0 0 1 0-7.07l3.54-3.54a5.003 5.003 0 0 1 7.07 0 5.003 5.003 0 0 1 0 7.07l-1.49 1.49c.01-.82-.12-1.64-.4-2.42l.47-.48a2.982 2.982 0 0 0 0-4.24 2.982 2.982 0 0 0-4.24 0l-3.53 3.53a2.982 2.982 0 0 0 0 4.24m2.82-4.24c.39-.39 1.03-.39 1.42 0a5.003 5.003 0 0 1 0 7.07l-3.54 3.54a5.003 5.003 0 0 1-7.07 0 5.003 5.003 0 0 1 0-7.07l1.49-1.49c-.01.82.12 1.64.4 2.43l-.47.47a2.982 2.982 0 0 0 0 4.24 2.982 2.982 0 0 0 4.24 0l3.53-3.53a2.982 2.982 0 0 0 0-4.24.973.973 0 0 1 0-1.42z"/></svg></a></li><li class="top"><a href="#dokuwiki__top" title="Back to top [t]" rel="nofollow" accesskey="t"><span>Back to top</span><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8v12z"/></svg></a></li> </ul> </div> </nav> </div><!-- /wrapper --> <!-- ********** FOOTER ********** --> <footer id="dokuwiki__footer"><div class="pad"> <div class="license">Except where otherwise noted, content on this wiki is licensed under the following license: <bdi><a href="https://creativecommons.org/licenses/by-sa/4.0/deed.en" rel="license" class="urlextern">CC Attribution-Share Alike 4.0 International</a></bdi></div> <div class="buttons"> <a href="https://creativecommons.org/licenses/by-sa/4.0/deed.en" rel="license"><img src="/lib/images/license/button/cc-by-sa.png" alt="CC Attribution-Share Alike 4.0 International" /></a> <a href="https://www.dokuwiki.org/donate" title="Donate" ><img src="/lib/tpl/dokuwiki/images/button-donate.gif" width="80" height="15" alt="Donate" /></a> <a href="https://php.net" title="Powered by PHP" ><img src="/lib/tpl/dokuwiki/images/button-php.gif" width="80" height="15" alt="Powered by PHP" /></a> <a href="//validator.w3.org/check/referer" title="Valid HTML5" ><img src="/lib/tpl/dokuwiki/images/button-html5.png" width="80" height="15" alt="Valid HTML5" /></a> <a href="//jigsaw.w3.org/css-validator/check/referer?profile=css3" title="Valid CSS" ><img src="/lib/tpl/dokuwiki/images/button-css.png" width="80" height="15" alt="Valid CSS" /></a> <a href="https://dokuwiki.org/" title="Driven by DokuWiki" ><img src="/lib/tpl/dokuwiki/images/button-dw.png" width="80" height="15" alt="Driven by DokuWiki" /></a> </div> <div style="margin-top: 2em; font-size:90%" class="dokuwiki"><div style="float:right"><a href="http://www.splitbrain.org/personal#imprint" style="float:right; text-decoration: none; color:#333">Imprint</a></div></div><!-- Include for DokuWiki site wide top bar --> <style type="text/css"> @media screen { body { padding-top: 30px; } #global__header { position: absolute; top: 0; left: 0; text-align: left; vertical-align: middle; line-height: 1.5; background-color: #333; box-shadow: 0 0 8px rgba(0,0,0,0.5); width: 100%; margin: 0; padding: 5px 20px; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; white-space: nowrap; overflow: hidden; } #global__header h2 { position: absolute; left: -99999em; top: 0; overflow: hidden; display: inline; } #global__header ul, #global__header li { margin: 0; padding: 0; list-style: none; display: inline; line-height: 1.5; } #global__header a { color: #bbb; text-decoration: none; margin-right: 20px; font-size: 14px; font-weight: normal; } #global__header a:hover, #global__header a:active, #global__header a:focus { color: #fff; text-decoration: underline; } #global__header form { float: right; margin: 0 0 0 20px; } #global__header input { background-color: #333; background-image: none; border: 1px solid #bbb; color: #fff; box-shadow: none; border-radius: 2px; margin: 0; line-height: normal; padding: 1px 0 1px 0; height: auto; } #global__header input.button { border: none; color: #bbb; } #global__header input.button:hover, #global__header input.button:active, #global__header input.button:focus { color: #fff; text-decoration: underline; } } /* /@media */ @media only screen and (min-width: 601px) { /* changes specific for www.dokuwiki.org */ #dokuwiki__header { padding-top: 3em; } #dokuwiki__usertools { top: 3em; } /* changes specific for bugs.dokuwiki.org */ div#container div#showtask { top: 40px; } } /* /@media */ @media only screen and (max-width: 600px) { body { padding-top: 0; } #global__header { position: static; white-space: normal; overflow: auto; } #global__header form { float: none; display: block; margin: 0 0 .4em; } } /* /@media */ @media print { #global__header { display: none; } } /* /@media */ </style> <div id="global__header"> <h2>Global DokuWiki Links</h2> <form method="get" action="https://search.dokuwiki.org/" target="_top"> <input type="text" name="q" title="Search all DokuWiki sites at once" class="input" /> <input type="submit" title="Search all DokuWiki sites at once" value="Search" class="button" /> </form> <ul> <li><a href="https://download.dokuwiki.org" title="Download the latest release" target="_top">Download</a></li> <li><a href="https://www.dokuwiki.org" title="Read the DokuWiki documentation" target="_top">Wiki</a></li> <li><a href="https://forum.dokuwiki.org" title="Ask questions in the DokuWiki forum" target="_top">Forum</a></li> <li><a href="https://irc.dokuwiki.org" title="Check IRC chat logs or join the chat" target="_top">IRC</a></li> <li><a href="https://github.com/splitbrain/dokuwiki/issues" title="Report and track bugs" target="_top">Bugs</a></li> <li><a href="https://translate.dokuwiki.org/" title="Help translating the DokuWiki interface" target="_top">Translate</a></li> <li><a href="https://github.com/splitbrain/dokuwiki" title="Access the most recent git commits" target="_top">Git</a></li> <li><a href="https://xref.dokuwiki.org/reference/dokuwiki/" title="Cross-Reference of the DokuWiki source code" target="_top">XRef</a></li> <li><a href="https://codesearch.dokuwiki.org/" title="Search through the sources of DokuWiki, plugins and templates" target="_top">Code Search</a></li> </ul> </div> <!-- end of DokuWiki top bar include --> </div></footer><!-- /footer --> </div></div><!-- /site --> <div class="no"><img src="/lib/exe/taskrunner.php?id=devel%3Ametadata&1732766349" width="2" height="1" alt="" /></div> <div id="screen__mode" class="no"></div></body> </html>