CINXE.COM
plugin:explain [DokuWiki]
<!DOCTYPE html> <html lang="en" dir="ltr" class="no-js"> <head> <meta charset="utf-8" /> <title>plugin:explain [DokuWiki]</title> <meta name="generator" content="DokuWiki"/> <meta name="theme-color" content="#008800"/> <meta name="robots" content="index,follow"/> <meta name="keywords" content="plugin,explain"/> <link rel="search" type="application/opensearchdescription+xml" href="/lib/exe/opensearch.php" title="DokuWiki"/> <link rel="start" href="/"/> <link rel="contents" href="/plugin:explain?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=plugin"/> <link rel="edit" title="Edit this page" href="/plugin:explain?do=edit"/> <link rel="alternate" type="text/html" title="Plain HTML" href="/_export/xhtml/plugin:explain"/> <link rel="alternate" type="text/plain" title="Wiki Markup" href="/_export/raw/plugin:explain"/> <link rel="canonical" href="https://www.dokuwiki.org/plugin:explain"/> <link rel="stylesheet" href="/lib/exe/css.php?t=dokuwiki&tseed=f1005bad3d81fc9c803c7f93d32a390e"/> <script >var NS='plugin';var JSINFO = {"plugins":{"edittable":{"default columnwidth":""}},"id":"plugin:explain","namespace":"plugin","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="/plugin:explain?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="plugin:explain" /><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="plugin:explain" /><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="/plugin:explain?do=recent" title="Recent Changes [r]" rel="nofollow" accesskey="r">Recent Changes</a></li><li class="action media"><a href="/plugin:explain?do=media&ns=plugin" title="Media Manager" rel="nofollow">Media Manager</a></li><li class="action index"><a href="/plugin:explain?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="/plugin:explain" class="breadcrumbs" title="plugin:explain">explain</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"> <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>plugin:explain</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="#explain_a_term_plugin">Explain a Term Plugin</a></div> <ul class="toc"> <li class="level2"><div class="li"><a href="#download_and_installation">Download and Installation</a></div></li> <li class="level2"><div class="li"><a href="#syntax">Syntax</a></div></li> <li class="level2"><div class="li"><a href="#example">Example</a></div></li> <li class="level2"><div class="li"><a href="#known_bugs">Known Bugs</a></div></li> <li class="level2"><div class="li"><a href="#changelog">ChangeLog</a></div></li> <li class="level2"><div class="li"><a href="#discussion">Discussion</a></div> <ul class="toc"> <li class="level3"><div class="li"><a href="#edit_the_conf_explainconf_file_as_a_dokuwiki_page_via_symlink">Edit the conf/explain.conf File as a Dokuwiki Page via Symlink</a></div></li> <li class="level3"><div class="li"><a href="#regular_expressions">regular expressions</a></div></li> <li class="level3"><div class="li"><a href="#explain_like_footnote">explain like footnote</a></div></li> <li class="level3"><div class="li"><a href="#two_feature_requests">Two feature requests</a></div></li> <li class="level3"><div class="li"><a href="#when_do_changes_take_effect">When do changes take effect?</a></div></li> <li class="level3"><div class="li"><a href="#use_with_deflist_plugin">Use with deflist plugin</a></div></li> <li class="level3"><div class="li"><a href="#very_simple_odt-plugin_support">Very simple ODT-Plugin support</a></div></li> <li class="level3"><div class="li"><a href="#ignore_this_word">Ignore this Word</a></div></li> </ul></li> </ul></li> </ul> </div> </div> <!-- TOC END --> <h1 class="sectionedit1" id="explain_a_term_plugin">Explain a Term Plugin</h1> <div class="level1"> <div class="pluginrepo_entry"><div class="usageInfo"><div class="compatibility"><p class="label">Compatible with DokuWiki</p><p class="nothing">No compatibility info given!</p></div><ul class="actions"><li><a class="download" href="https://github.com/cosmocode/explain/zipball/master">Download</a></li><li><a class="bugs" href="https://github.com/cosmocode/explain/issues">Report bugs</a></li></ul><div class="clearer"></div></div><div class="mainInfo"><p class="description"><a class="media" href="/plugins"><img alt="plugin" class="medialeft" src="/lib/plugins/pluginrepo/images/dwplugin.png" width="60" height="60" /></a> Explains terms and links to two alternative definitions. Terms are defined in a configuration file for the whole wiki. Just like acronyms.</p></div><div class="metaInfo"><dl><dt>Last updated on</dt><dd>2019-01-23</dd><dt>Provides</dt><dd><a href="/plugins?plugintype=1#extension__table" class="wikilink1" title="List all Syntax plugins">Syntax</a></dd><dt>Repository</dt><dd><a class="urlextern" href="https://github.com/cosmocode/explain/">Source</a></dd></dl></div><div class="moreInfo"><div class="notify"><p>This extension has not been updated in over 2 years. It may no longer be maintained or supported and may have compatibility issues.</p></div><p class="tags">Tagged with <a href="/plugins?plugintag=definitions#extension__table" class="wikilink1" title="List all plugins with this tag">definitions</a>, <a href="/plugins?plugintag=terms#extension__table" class="wikilink1" title="List all plugins with this tag">terms</a></p></div><div class="authorInfo"><strong>By <a href="mailto:dokuwiki%20%5Bat%5D%20cosmocode%20%5Bdot%5D%20de" class="mail" title="dokuwiki [at] cosmocode [dot] de">Adrian Lang (original author: Marc Wäckerlin marc@waeckerlin.org)</a></strong><ul><li><a href="/plugin:csv" class="wikilink1" title="plugin:csv" data-wiki-id="plugin:csv">csv</a></li> <li><a href="/plugin:clearhistory" class="wikilink1" title="plugin:clearhistory" data-wiki-id="plugin:clearhistory">clearhistory</a></li> <li><a href="/plugin:preview" class="wikilink1" title="plugin:preview" data-wiki-id="plugin:preview">preview</a></li> <li><a href="/plugin:logstats" class="wikilink1" title="plugin:logstats" data-wiki-id="plugin:logstats">logstats</a></li> <li><a href="/plugin:oiddelegate" class="wikilink1" title="plugin:oiddelegate" data-wiki-id="plugin:oiddelegate">oiddelegate</a></li> <li><a href="/plugin:labeled" class="wikilink1" title="plugin:labeled" data-wiki-id="plugin:labeled">labeled</a></li> <li><a href="/plugin:slider" class="wikilink1" title="plugin:slider" data-wiki-id="plugin:slider">slider</a></li> <li><a href="/plugin:groupusers" class="wikilink1" title="plugin:groupusers" data-wiki-id="plugin:groupusers">groupusers</a></li> <li><a href="/plugin:navi" class="wikilink1" title="plugin:navi" data-wiki-id="plugin:navi">navi</a></li> <li><a href="/plugin:aclinfo" class="wikilink1" title="plugin:aclinfo" data-wiki-id="plugin:aclinfo">aclinfo</a></li> <li>and 127 more</li></ul></div></div> <p> Just like for the acronyms you can define a file containing a table which declares terms, a short explanation and two links to a longer definition. This automatically works for all those terms in the whole wiki. </p> <p> <a href="https://www.cosmocode.de/en/open-source/dokuwiki-plugins/" class="media" title="https://www.cosmocode.de/en/open-source/dokuwiki-plugins/"><img src="/lib/exe/fetch.php?cache=recache&tok=a307b5&media=https%3A%2F%2Fwww.cosmocode.de%2Fstatic%2Fimg%2Fdokuwiki%2Fdwplugins.png" class="mediaright" loading="lazy" title="A CosmoCode Plugin" alt="A CosmoCode Plugin" /></a> </p> </div> <div class="secedit editbutton_section editbutton_1"><form class="button btn_secedit" method="post" action="/plugin:explain"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1704726114" /><input type="hidden" name="summary" value="[Explain a Term Plugin] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="explain_a_term_plugin" /><input type="hidden" name="codeblockOffset" value="0" /><input type="hidden" name="range" value="1-1000" /><button type="submit" title="Explain a Term Plugin">Edit</button></div></form></div> <h2 class="sectionedit2" id="download_and_installation">Download and Installation</h2> <div class="level2"> <p> Search and install the plugin using the <a href="/plugin:extension" class="wikilink1" title="plugin:extension" data-wiki-id="plugin:extension">Extension Manager</a>. Refer to <a href="/plugins" class="wikilink1" title="plugins" data-wiki-id="plugins">Plugins</a> on how to install plugins manually. </p> </div> <div class="secedit editbutton_section editbutton_2"><form class="button btn_secedit" method="post" action="/plugin:explain"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1704726114" /><input type="hidden" name="summary" value="[Download and Installation] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="download_and_installation" /><input type="hidden" name="codeblockOffset" value="0" /><input type="hidden" name="range" value="1001-1178" /><button type="submit" title="Download and Installation">Edit</button></div></form></div> <h2 class="sectionedit3" id="syntax">Syntax</h2> <div class="level2"> <p> The terms are defined in the file <code>conf/explain.conf</code>. The syntax of the file is a table format. The table rows are the lines and the table cells are separated by tabulators. The table has the following four columns: </p> <div class="table sectionedit4"><table class="inline"> <tr class="row0"> <td class="col0"> Term to be defined </td><td class="col1"> Short explanation (ca. 80 characters) </td><td class="col2"> first <abbr title="Uniform Resource Locator">URL</abbr> </td><td class="col3"> second <abbr title="Uniform Resource Locator">URL</abbr> </td> </tr> </table></div> <div class="secedit editbutton_table editbutton_4"><form class="button btn_secedit" method="post" action="/plugin:explain"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1704726114" /><input type="hidden" name="summary" value="[Table] " /><input type="hidden" name="target" value="table" /><input type="hidden" name="hid" value="table" /><input type="hidden" name="range" value="1423-1510" /><button type="submit" title="Table">Edit</button></div></form></div> <p> Only the second <abbr title="Uniform Resource Locator">URL</abbr> is optional, all other fields are mandatory. </p> <ul> <li class="level1"><div class="li"> “<em>Term to be defined</em>” just the term, may contain spaces. E.g. “<em>Carpe Diem</em>”</div> </li> <li class="level1"><div class="li"> “<em>Short explanation</em>” a short tool-tip explanation, used in the link title. E.g. “<em>Latin for 'pluck the day'</em>”</div> </li> <li class="level1"><div class="li"> “<em>first <abbr title="Uniform Resource Locator">URL</abbr></em>” normally the first <abbr title="Uniform Resource Locator">URL</abbr> is an intra-wiki link, means should go to a definition inside of your wiki. I recommend the use of my <a href="/plugin:dl" class="wikilink1" title="plugin:dl" data-wiki-id="plugin:dl">definition list plugin</a> for this. If the first <abbr title="Uniform Resource Locator">URL</abbr> links to an external page, then the second <abbr title="Uniform Resource Locator">URL</abbr> is not used at all. E.g. “<em>Introduction:Definitions#Carpe_Diem</em>”</div> </li> <li class="level1"><div class="li"> “<em>second <abbr title="Uniform Resource Locator">URL</abbr></em>” the second <abbr title="Uniform Resource Locator">URL</abbr> is used, if your actual position is already inside of the first <abbr title="Uniform Resource Locator">URL</abbr>, in the example above, if you are actually on page <em>Introduction:Definitions</em>. Use the second <abbr title="Uniform Resource Locator">URL</abbr> to link to a more detailed or external definition. E.g. “<em>http://en.wikipedia.org/wiki/carpe_diem</em>”</div> </li> </ul> <p> <em>Note:</em> Lines starting with # are treated as comments. Empty lines are allowed. </p> </div> <div class="secedit editbutton_section editbutton_3"><form class="button btn_secedit" method="post" action="/plugin:explain"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1704726114" /><input type="hidden" name="summary" value="[Syntax] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="syntax" /><input type="hidden" name="codeblockOffset" value="0" /><input type="hidden" name="range" value="1179-2515" /><button type="submit" title="Syntax">Edit</button></div></form></div> <h2 class="sectionedit5" id="example">Example</h2> <div class="level2"> <p> A definition line in <code>conf/explain.conf</code>: </p> <pre class="code">Carpe Diem <TAB> Latin for "pluck the day". <TAB> Introduction:Definitions#Carpe_Diem <TAB> http://en.wikipedia.org/wiki/carpe_diem</pre> <p> Here, <code><TAB></code> means a tabulator. </p> </div> <div class="secedit editbutton_section editbutton_5"><form class="button btn_secedit" method="post" action="/plugin:explain"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1704726114" /><input type="hidden" name="summary" value="[Example] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="example" /><input type="hidden" name="codeblockOffset" value="0" /><input type="hidden" name="range" value="2516-2773" /><button type="submit" title="Example">Edit</button></div></form></div> <h2 class="sectionedit6" id="known_bugs">Known Bugs</h2> <div class="level2"> <p> With very large numbers of entries in the explain.conf file, with some configurations of PHP 4.4.6 an error can be generated by the preg-match() function running out of compilation space. That is not a bug of the explain plugin, but I have encountered it. The fix was for the hosting provider to roll back to their previous version of PHP! </p> <p> - Edward Barker </p> </div> <div class="secedit editbutton_section editbutton_6"><form class="button btn_secedit" method="post" action="/plugin:explain"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1704726114" /><input type="hidden" name="summary" value="[Known Bugs] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="known_bugs" /><input type="hidden" name="codeblockOffset" value="1" /><input type="hidden" name="range" value="2774-3157" /><button type="submit" title="Known Bugs">Edit</button></div></form></div> <h2 class="sectionedit7" id="changelog">ChangeLog</h2> <div class="level2"> <ul> <li class="level1 node"><div class="li"> <em>2006-01-25 mrw</em></div> <ul> <li class="level2"><div class="li"> no more accepts()</div> </li> </ul> </li> <li class="level1 node"><div class="li"> <em>2006-01-25 mrw</em></div> <ul> <li class="level2"><div class="li"> initial release</div> </li> </ul> </li> </ul> </div> <div class="secedit editbutton_section editbutton_7"><form class="button btn_secedit" method="post" action="/plugin:explain"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1704726114" /><input type="hidden" name="summary" value="[ChangeLog] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="changelog" /><input type="hidden" name="codeblockOffset" value="1" /><input type="hidden" name="range" value="3158-3275" /><button type="submit" title="ChangeLog">Edit</button></div></form></div> <h2 class="sectionedit8" id="discussion">Discussion</h2> <div class="level2"> <blockquote><div class="no"> As this is a substitution plugin it doesn't (can't even) accept other modes. The accepts override function is not necessary. Also as I mentioned on your dl plugin page, overriding accepts is not necessary unless you want something other than default behaviour, getAllowedTypes() is the preferred method. — <em><a href="mailto:chris%20%5Bat%5D%20jalakai%20%5Bdot%5D%20co%20%5Bdot%5D%20uk" class="mail" title="chris [at] jalakai [dot] co [dot] uk">Christopher Smith</a> 2006-01-25 10:55</em></div></blockquote> <p> You're so right! </p> <p> <strong>Tried it and liked it</strong> </p> <p> Tremendously simplifies migration of documentation from an old website to wiki where you have have existing lookup tables for the old detail pages. Stick the lookup tables into explain.conf format and migrate the pages one by one. As they are done there is only one place to change the links to the topic. </p> <p> Also greatly simplifies writing the text as the links just fall into place once the explain.conf file has been constructed. </p> <p> Works fine with an explain.conf file of 400k. </p> <p> If you install the plugin and get a bunch of php errors on your pages, don't worry. The explain.conf must be present with at least one valid line and that fixes it. Alternatively, if you have more sense than me, install the explain.conf file before installing the plugin. </p> <p> Bear in mind the second <abbr title="Uniform Resource Locator">URL</abbr> values in the explain.conf file are optional. Very useful, but don't worry if you don't have them for some of the terms to be explained. In fact it looks a bit odd, but even if neither <abbr title="Uniform Resource Locator">URL</abbr> is specified, the short description can be applied to a multi word phrase somewhat in the same way the acronym function works with single words/acronyms - though the appearance of the term in the text is as a local link, not the same style as for an acronym. </p> <p> Edward Barker </p> </div> <div class="secedit editbutton_section editbutton_8"><form class="button btn_secedit" method="post" action="/plugin:explain"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1704726114" /><input type="hidden" name="summary" value="[Discussion] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="discussion" /><input type="hidden" name="codeblockOffset" value="1" /><input type="hidden" name="range" value="3276-4965" /><button type="submit" title="Discussion">Edit</button></div></form></div> <h3 class="sectionedit9" id="edit_the_conf_explainconf_file_as_a_dokuwiki_page_via_symlink">Edit the conf/explain.conf File as a Dokuwiki Page via Symlink</h3> <div class="level3"> <p> The file can be <a href="https://www.namecheap.com/support/knowledgebase/article.aspx/9561/29/how-to-create-a-symbolic-link-in-cpanel" class="urlextern" title="https://www.namecheap.com/support/knowledgebase/article.aspx/9561/29/how-to-create-a-symbolic-link-in-cpanel">symlinked</a> / soft linked to a page and edited via dokuwiki. The same can be done for the hints of the standard acronyms.conf editing. </p> <p> The TAB character can't be used for editing within the browser, as it just skips to the next field. The solution is to change the delimiter from a TAB to something else.<br/> Thanks to <a href="https://www.fiverr.com/dvdias" class="urlextern" title="https://www.fiverr.com/dvdias">https://www.fiverr.com/dvdias</a><br/> Instead of the CSV code below, I chose to use 4 whitespace characters as the delimiter, by changing line 53 from:<br/> </p> <pre class="code"> $parts = explode("\t", $line);</pre> <p> to: </p> <pre class="code"> $parts = explode(" ", $line);</pre> <p> Which is a lot easier than the CSV code below. Maybe needs deleting as it is for a much older version of explain plugin? I can't say I understand the purpose. </p> <pre class="code php"><span class="kw2"><?php</span> <span class="kw1">if</span><span class="br0">(</span><span class="sy0">!</span><a href="http://www.php.net/defined"><span class="kw3">defined</span></a><span class="br0">(</span><span class="st_h">'DOKU_INC'</span><span class="br0">)</span><span class="br0">)</span> <a href="http://www.php.net/define"><span class="kw3">define</span></a><span class="br0">(</span><span class="st_h">'DOKU_INC'</span><span class="sy0">,</span><a href="http://www.php.net/realpath"><span class="kw3">realpath</span></a><span class="br0">(</span><a href="http://www.php.net/dirname"><span class="kw3">dirname</span></a><span class="br0">(</span><span class="kw4">__FILE__</span><span class="br0">)</span><span class="sy0">.</span><span class="st_h">'/../../'</span><span class="br0">)</span><span class="sy0">.</span><span class="st_h">'/'</span><span class="br0">)</span><span class="sy0">;</span> <span class="kw1">if</span><span class="br0">(</span><span class="sy0">!</span><a href="http://www.php.net/defined"><span class="kw3">defined</span></a><span class="br0">(</span><span class="st_h">'DOKU_PLUGIN'</span><span class="br0">)</span><span class="br0">)</span> <a href="http://www.php.net/define"><span class="kw3">define</span></a><span class="br0">(</span><span class="st_h">'DOKU_PLUGIN'</span><span class="sy0">,</span>DOKU_INC<span class="sy0">.</span><span class="st_h">'lib/plugins/'</span><span class="br0">)</span><span class="sy0">;</span> <span class="kw1">require_once</span><span class="br0">(</span>DOKU_PLUGIN<span class="sy0">.</span><span class="st_h">'syntax.php'</span><span class="br0">)</span><span class="sy0">;</span> <span class="co4">/** Explain Terms and Definitions It works like acronym.conf, but for any term (even with more than one word). Evaluates con/explain.conf which is in the following syntax: term TAB explanation TAB wiki-link term: regular expression of the term to explain explanation: a short description of the term wiki-link: link in wiki syntax (A:B:C) to the definition License: GPL */</span> <span class="kw2">class</span> syntax_plugin_explain <span class="kw2">extends</span> DokuWiki_Syntax_Plugin <span class="br0">{</span> <span class="coMULTI">/* csv_explode is founded by a google search, forget where it comes from. Sorry! */</span> <span class="kw2">function</span> csv_explode<span class="br0">(</span><span class="re0">$str</span><span class="sy0">,</span> <span class="re0">$delim</span> <span class="sy0">=</span> <span class="st_h">','</span><span class="sy0">,</span> <span class="re0">$qual</span> <span class="sy0">=</span> <span class="st0">"<span class="es1">\"</span>"</span><span class="br0">)</span> <span class="br0">{</span> <span class="re0">$len</span> <span class="sy0">=</span> <a href="http://www.php.net/strlen"><span class="kw3">strlen</span></a><span class="br0">(</span><span class="re0">$str</span><span class="br0">)</span><span class="sy0">;</span> <span class="re0">$inside</span> <span class="sy0">=</span> <span class="kw4">false</span><span class="sy0">;</span> <span class="re0">$word</span> <span class="sy0">=</span> <span class="st_h">''</span><span class="sy0">;</span> <span class="kw1">for</span> <span class="br0">(</span><span class="re0">$i</span> <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span> <span class="re0">$i</span> <span class="sy0"><</span> <span class="re0">$len</span><span class="sy0">;</span> <span class="sy0">++</span><span class="re0">$i</span><span class="br0">)</span> <span class="br0">{</span> <span class="kw1">if</span> <span class="br0">(</span><span class="re0">$str</span><span class="br0">[</span><span class="re0">$i</span><span class="br0">]</span><span class="sy0">==</span><span class="re0">$delim</span> <span class="sy0">&&</span> <span class="sy0">!</span><span class="re0">$inside</span><span class="br0">)</span> <span class="br0">{</span> <span class="re0">$out</span><span class="br0">[</span><span class="br0">]</span> <span class="sy0">=</span> <span class="re0">$word</span><span class="sy0">;</span> <span class="re0">$word</span> <span class="sy0">=</span> <span class="st_h">''</span><span class="sy0">;</span> <span class="br0">}</span> <span class="kw1">else</span> <span class="kw1">if</span> <span class="br0">(</span><span class="re0">$inside</span> <span class="sy0">&&</span> <span class="re0">$str</span><span class="br0">[</span><span class="re0">$i</span><span class="br0">]</span><span class="sy0">==</span><span class="re0">$qual</span> <span class="sy0">&&</span> <span class="br0">(</span><span class="re0">$i</span><span class="sy0"><</span><span class="re0">$len</span> <span class="sy0">&&</span> <span class="re0">$str</span><span class="br0">[</span><span class="re0">$i</span><span class="sy0">+</span><span class="nu0">1</span><span class="br0">]</span><span class="sy0">==</span><span class="re0">$qual</span><span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span> <span class="re0">$word</span> <span class="sy0">.=</span> <span class="re0">$qual</span><span class="sy0">;</span> <span class="sy0">++</span><span class="re0">$i</span><span class="sy0">;</span> <span class="br0">}</span> <span class="kw1">else</span> <span class="kw1">if</span> <span class="br0">(</span><span class="re0">$str</span><span class="br0">[</span><span class="re0">$i</span><span class="br0">]</span> <span class="sy0">==</span> <span class="re0">$qual</span><span class="br0">)</span> <span class="br0">{</span> <span class="re0">$inside</span> <span class="sy0">=</span> <span class="sy0">!</span><span class="re0">$inside</span><span class="sy0">;</span> <span class="br0">}</span> <span class="kw1">else</span> <span class="br0">{</span> <span class="re0">$word</span> <span class="sy0">.=</span> <span class="re0">$str</span><span class="br0">[</span><span class="re0">$i</span><span class="br0">]</span><span class="sy0">;</span> <span class="br0">}</span> <span class="br0">}</span> <span class="re0">$out</span><span class="br0">[</span><span class="br0">]</span> <span class="sy0">=</span> <span class="re0">$word</span><span class="sy0">;</span> <span class="kw1">return</span> <span class="re0">$out</span><span class="sy0">;</span> <span class="br0">}</span> <span class="coMULTI">/*-------csv_explode()------------*/</span> <span class="kw2">function</span> syntax_plugin_explain<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span> <span class="co1">// "static" not allowed in PHP4?!?</span> <span class="co1">//if (isset($keys[0]) return; // evaluate at most once</span> <span class="re0">$lines</span> <span class="sy0">=</span> <span class="sy0">@</span><a href="http://www.php.net/file"><span class="kw3">file</span></a><span class="br0">(</span>DOKU_CONF<span class="sy0">.</span><span class="st_h">'explain.conf'</span><span class="br0">)</span><span class="sy0">;</span> <span class="kw1">foreach</span> <span class="br0">(</span><span class="re0">$lines</span> <span class="kw1">as</span> <span class="re0">$line</span><span class="br0">)</span> <span class="br0">{</span> <span class="re0">$line</span> <span class="sy0">=</span> <a href="http://www.php.net/trim"><span class="kw3">trim</span></a><span class="br0">(</span><span class="re0">$line</span><span class="br0">)</span><span class="sy0">;</span> <span class="kw1">if</span> <span class="br0">(</span><a href="http://www.php.net/empty"><span class="kw3">empty</span></a><span class="br0">(</span><span class="re0">$line</span><span class="br0">)</span><span class="br0">)</span> <span class="kw1">continue</span><span class="sy0">;</span> <span class="coMULTI">/* changed the explode to cvs_explode here, others remain unchanged. */</span> <span class="re0">$parts</span> <span class="sy0">=</span> <span class="re0">$this</span><span class="sy0">-></span><span class="me1">csv_explode</span><span class="br0">(</span><span class="re0">$line</span><span class="br0">)</span><span class="sy0">;</span> <span class="re0">$this</span><span class="sy0">-></span><span class="me1">map</span><span class="br0">[</span><span class="re0">$parts</span><span class="br0">[</span><span class="nu0">0</span><span class="br0">]</span><span class="br0">]</span> <span class="sy0">=</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">(</span><a href="http://www.php.net/htmlspecialchars"><span class="kw3">htmlspecialchars</span></a><span class="br0">(</span><span class="re0">$parts</span><span class="br0">[</span><span class="nu0">0</span><span class="br0">]</span><span class="br0">)</span><span class="sy0">,</span> <a href="http://www.php.net/htmlspecialchars"><span class="kw3">htmlspecialchars</span></a><span class="br0">(</span><span class="re0">$parts</span><span class="br0">[</span><span class="nu0">1</span><span class="br0">]</span><span class="br0">)</span><span class="sy0">,</span> <span class="re0">$this</span><span class="sy0">-></span><a href="http://www.php.net/link"><span class="kw3">link</span></a><span class="br0">(</span><span class="re0">$parts</span><span class="br0">[</span><span class="nu0">2</span><span class="br0">]</span><span class="sy0">,</span> <span class="re0">$parts</span><span class="br0">[</span><span class="nu0">3</span><span class="br0">]</span><span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span> <span class="re0">$this</span><span class="sy0">-></span><span class="me1">keys</span><span class="br0">[</span><span class="br0">]</span> <span class="sy0">=</span> <span class="re0">$parts</span><span class="br0">[</span><span class="nu0">0</span><span class="br0">]</span><span class="sy0">;</span> <span class="br0">}</span> <span class="re0">$this</span><span class="sy0">-></span><span class="me1">pattern</span> <span class="sy0">=</span> <a href="http://www.php.net/join"><span class="kw3">join</span></a><span class="br0">(</span><span class="st_h">'|'</span><span class="sy0">,</span> <span class="re0">$this</span><span class="sy0">-></span><span class="me1">keys</span><span class="br0">)</span><span class="sy0">;</span> <span class="br0">}</span> <span class="kw2">function</span> <a href="http://www.php.net/link"><span class="kw3">link</span></a><span class="br0">(</span><span class="re0">$target</span><span class="sy0">,</span> <span class="re0">$other</span><span class="br0">)</span> <span class="br0">{</span> <span class="kw2">global</span> <span class="re0">$ID</span><span class="sy0">;</span> static <span class="re0">$url</span> <span class="sy0">=</span> <span class="st_h">'^http://'</span><span class="sy0">;</span> <span class="co1">// '^(http://)?[-_[:alnum:]]+[-_.[:alnum:]]*\.[a-z]{2}'</span> <span class="co1">// '(/[-_./[:alnum:]&%?=#]*)?';</span> <span class="kw1">if</span> <span class="br0">(</span><a href="http://www.php.net/ereg"><span class="kw3">ereg</span></a><span class="br0">(</span><span class="re0">$url</span><span class="sy0">,</span> <span class="re0">$target</span><span class="br0">)</span><span class="br0">)</span> <span class="kw1">return</span> <span class="re0">$target</span><span class="sy0">;</span> <a href="http://www.php.net/list"><span class="kw3">list</span></a><span class="br0">(</span><span class="re0">$id</span><span class="sy0">,</span> <span class="re0">$hash</span><span class="br0">)</span> <span class="sy0">=</span> <a href="http://www.php.net/split"><span class="kw3">split</span></a><span class="br0">(</span><span class="st_h">'#'</span><span class="sy0">,</span> <span class="re0">$target</span><span class="sy0">,</span> <span class="nu0">2</span><span class="br0">)</span><span class="sy0">;</span> resolve_pageid<span class="br0">(</span>getNS<span class="br0">(</span><span class="re0">$ID</span><span class="br0">)</span><span class="sy0">,</span> <span class="re0">$id</span><span class="sy0">,</span> <span class="re0">$exists</span><span class="br0">)</span><span class="sy0">;</span> <span class="kw1">if</span> <span class="br0">(</span><span class="re0">$other</span><span class="sy0">!=</span><span class="st_h">''</span> <span class="sy0">&&</span> <span class="re0">$ID</span><span class="sy0">==</span><span class="re0">$id</span><span class="br0">)</span> <span class="kw1">if</span> <span class="br0">(</span><a href="http://www.php.net/ereg"><span class="kw3">ereg</span></a><span class="br0">(</span><span class="re0">$url</span><span class="sy0">,</span> <span class="re0">$other</span><span class="br0">)</span><span class="br0">)</span> <span class="kw1">return</span> <span class="re0">$other</span><span class="sy0">;</span> <span class="kw1">else</span> <span class="br0">{</span> <a href="http://www.php.net/list"><span class="kw3">list</span></a><span class="br0">(</span><span class="re0">$id</span><span class="sy0">,</span> <span class="re0">$hash</span><span class="br0">)</span> <span class="sy0">=</span> <a href="http://www.php.net/split"><span class="kw3">split</span></a><span class="br0">(</span><span class="st_h">'#'</span><span class="sy0">,</span> <span class="re0">$other</span><span class="sy0">,</span> <span class="nu0">2</span><span class="br0">)</span><span class="sy0">;</span> resolve_pageid<span class="br0">(</span>getNS<span class="br0">(</span><span class="re0">$ID</span><span class="br0">)</span><span class="sy0">,</span> <span class="re0">$id</span><span class="sy0">,</span> <span class="re0">$exists</span><span class="br0">)</span><span class="sy0">;</span> <span class="kw1">return</span> wl<span class="br0">(</span><span class="re0">$id</span><span class="br0">)</span><span class="sy0">.</span><span class="st_h">'#'</span><span class="sy0">.</span><span class="re0">$hash</span><span class="sy0">;</span> <span class="br0">}</span> <span class="kw1">else</span> <span class="kw1">return</span> wl<span class="br0">(</span><span class="re0">$id</span><span class="br0">)</span><span class="sy0">.</span><span class="st_h">'#'</span><span class="sy0">.</span><span class="re0">$hash</span><span class="sy0">;</span> <span class="br0">}</span> <span class="kw2">function</span> getInfo<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span> <span class="kw1">return</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">(</span><span class="st_h">'author'</span> <span class="sy0">=></span> <span class="st_h">'Marc Wäckerlin'</span><span class="sy0">,</span> <span class="st_h">'email'</span> <span class="sy0">=></span> <span class="st_h">'marc [at] waeckerlin [dot-org]'</span><span class="sy0">,</span> <span class="st_h">'name'</span> <span class="sy0">=></span> <span class="st_h">'Explain'</span><span class="sy0">,</span> <span class="st_h">'desc'</span> <span class="sy0">=></span> <span class="st_h">'Explain terms'</span><span class="sy0">,</span> <span class="st_h">'url'</span> <span class="sy0">=></span> <span class="st_h">'http://marc.waeckerlin.org'</span><span class="br0">)</span><span class="sy0">;</span> <span class="br0">}</span> <span class="kw2">function</span> <a href="http://www.php.net/gettype"><span class="kw3">getType</span></a><span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span> <span class="kw1">return</span> <span class="st_h">'substition'</span><span class="sy0">;</span> <span class="br0">}</span> <span class="kw2">function</span> getSort<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span> <span class="kw1">return</span> <span class="nu0">239</span><span class="sy0">;</span> <span class="co1">// before 'acronym'</span> <span class="br0">}</span> <span class="kw2">function</span> connectTo<span class="br0">(</span><span class="re0">$mode</span><span class="br0">)</span> <span class="br0">{</span> <span class="kw1">if</span> <span class="br0">(</span><span class="re0">$this</span><span class="sy0">-></span><span class="me1">pattern</span><span class="sy0">!=</span><span class="st_h">''</span><span class="br0">)</span> <span class="re0">$this</span><span class="sy0">-></span><span class="me1">Lexer</span><span class="sy0">-></span><span class="me1">addSpecialPattern</span><span class="br0">(</span><span class="re0">$this</span><span class="sy0">-></span><span class="me1">pattern</span><span class="sy0">,</span> <span class="re0">$mode</span><span class="sy0">,</span> <span class="st_h">'plugin_explain'</span><span class="br0">)</span><span class="sy0">;</span> <span class="br0">}</span> <span class="kw2">function</span> handle<span class="br0">(</span><span class="re0">$match</span><span class="sy0">,</span> <span class="re0">$state</span><span class="sy0">,</span> <span class="re0">$pos</span><span class="sy0">,</span> <span class="sy0">&</span><span class="re0">$handler</span><span class="br0">)</span> <span class="br0">{</span> <span class="kw1">return</span> <span class="re0">$this</span><span class="sy0">-></span><span class="me1">map</span><span class="br0">[</span><span class="re0">$match</span><span class="br0">]</span><span class="sy0">;</span> <span class="br0">}</span> <span class="kw2">function</span> render<span class="br0">(</span><span class="re0">$format</span><span class="sy0">,</span> <span class="sy0">&</span><span class="re0">$renderer</span><span class="sy0">,</span> <span class="re0">$data</span><span class="br0">)</span> <span class="br0">{</span> <span class="re0">$renderer</span><span class="sy0">-></span><span class="me1">doc</span> <span class="sy0">.=</span> <span class="st_h">'<a href="'</span><span class="sy0">.</span><span class="re0">$data</span><span class="br0">[</span><span class="nu0">2</span><span class="br0">]</span> <span class="sy0">.</span><span class="st_h">'" title="'</span><span class="sy0">.</span><span class="re0">$data</span><span class="br0">[</span><span class="nu0">1</span><span class="br0">]</span><span class="sy0">.</span><span class="st_h">'" class="explain">'</span> <span class="sy0">.</span><span class="re0">$data</span><span class="br0">[</span><span class="nu0">0</span><span class="br0">]</span><span class="sy0">.</span><span class="st_h">'</a>'</span><span class="sy0">;</span> <span class="kw1">return</span> <span class="kw4">true</span><span class="sy0">;</span> <span class="br0">}</span> <span class="br0">}</span> <span class="sy1">?></span></pre> <p> Base on the style of plugins, I have changed the <abbr title="Cascading Style Sheets">CSS</abbr> to plugins/explain/style.css as below: </p> <pre class="code css"> div<span class="re1">.dokuwiki</span> a<span class="re1">.explain</span> <span class="br0">{</span> <span class="kw1">color</span><span class="sy0">:</span> __black__<span class="sy0">;</span> <span class="kw1">border-bottom</span><span class="sy0">:</span> <span class="re3">1px</span> <span class="kw2">dotted</span> __black__<span class="sy0">;</span> <span class="kw1">padding-top</span><span class="sy0">:</span> <span class="nu0">0</span><span class="sy0">;</span> <span class="br0">}</span> div<span class="re1">.dokuwiki</span> a<span class="re1">.explain</span><span class="sy0">:</span><span class="kw5">hover</span> <span class="br0">{</span> <span class="kw1">background-color</span><span class="sy0">:</span> __light__<span class="sy0">;</span> <span class="br0">}</span></pre> <p> Ken Cheung 2007-04-30<br/> Marcos Reyes 2019-08-01 </p> </div> <div class="secedit editbutton_section editbutton_9"><form class="button btn_secedit" method="post" action="/plugin:explain"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1704726114" /><input type="hidden" name="summary" value="[Edit the conf/explain.conf File as a Dokuwiki Page via Symlink] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="edit_the_conf_explainconf_file_as_a_dokuwiki_page_via_symlink" /><input type="hidden" name="codeblockOffset" value="1" /><input type="hidden" name="range" value="4966-9775" /><button type="submit" title="Edit the conf/explain.conf File as a Dokuwiki Page via Symlink">Edit</button></div></form></div> <h3 class="sectionedit10" id="regular_expressions">regular expressions</h3> <div class="level3"> <blockquote><div class="no"> Currently the term searched for is case sensitive. Is there a way to change the search regular expression to case insensitive? — <em><a href="mailto:curufea%20%5Bat%5D%20yahoo%20%5Bdot%5D%20com" class="mail" title="curufea [at] yahoo [dot] com">Peter Cobcroft</a> 2008-01-15 03:50</em><blockquote><div class="no"> By default, the explain plugin isn't really working with regular expressions, just with words. If you use “(?i)Carpe ?Diem” in your explain.conf, anything from “carpediem” to “Carpe Diem” will be matched. However, in the wikipage, the matching word will also be replaced by “(?i)Carpe ?Diem”, which is not what you want <img src="/lib/images/smileys/smile.svg" class="icon smiley" alt=":-)" /> </div></blockquote> </div></blockquote> <p> To change that, modify the handle() method like this: </p> <pre class="code">function handle($match, $state, $pos, &$handler) { foreach (array_keys($this->map) as $rxmatch) { if (preg_match('/^('.$rxmatch.')$/',$match)) { return array($match,$this->map[$rxmatch][1],$this->map[$rxmatch][2]); } } }</pre> <p> I've tested it and it sort of works, but round brackets and slashes loose meaning in your regexp (as they are escaped by the DokuWiki lexer). backslashes don't work either, for reasons beyond me. <br/> *-pike 2008/03/22 </p> </div> <div class="secedit editbutton_section editbutton_10"><form class="button btn_secedit" method="post" action="/plugin:explain"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1704726114" /><input type="hidden" name="summary" value="[regular expressions] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="regular_expressions" /><input type="hidden" name="codeblockOffset" value="3" /><input type="hidden" name="range" value="9776-10852" /><button type="submit" title="regular expressions">Edit</button></div></form></div> <h3 class="sectionedit11" id="explain_like_footnote">explain like footnote</h3> <div class="level3"> <p> To make the explain 'tooltip' look more like the footnote (so it can also contain more text and behave better across browsers), I changed the render() method like this : </p> <pre class="code">function render($format,&$renderer,$data) { $renderer->doc .= '<a class="explain" href="'.$data[2].'">'; $renderer->doc .= $data[0]; $renderer->doc .= '<span class="tooltip">'.$data[1].'</span>'; $renderer->doc .= '</a>'; return true; }</pre> <p> and changed the style.css like this: </p> <pre class="code">div.dokuwiki a.explain { position: relative; text-decoration:none; border-bottom: 1px dotted __border__; } div.dokuwiki a.explain span.tooltip { display: none; background-color:__background_neu__; color:__text_neu__; border:1px solid __border__; font-size:80%; line-height:1.2em; padding:4px 4px 8px 8px; text-align:left; } /* IE/Win requires this */ div.dokuwiki a.explain:hover {font-size: 100%;} /*the span will display just on :hover state*/ div.dokuwiki a.explain:hover span.tooltip { display: block !important; position: absolute; top: 5px; left: 40px; width: 150px; z-index:99; } </pre> <p> This trick is based on <a href="http://www.communitymx.com/content/article.cfm?cid=4E2C0" class="urlextern" title="http://www.communitymx.com/content/article.cfm?cid=4E2C0">http://www.communitymx.com/content/article.cfm?cid=4E2C0</a> , and it works nice, except for older (1.3.9) safari's. </p> <p> *-pike 2008/03/22 </p> </div> <div class="secedit editbutton_section editbutton_11"><form class="button btn_secedit" method="post" action="/plugin:explain"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1704726114" /><input type="hidden" name="summary" value="[explain like footnote] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="explain_like_footnote" /><input type="hidden" name="codeblockOffset" value="4" /><input type="hidden" name="range" value="10853-12152" /><button type="submit" title="explain like footnote">Edit</button></div></form></div> <h3 class="sectionedit12" id="two_feature_requests">Two feature requests</h3> <div class="level3"> <p> I have a couple requests for the awesome explain plugin. </p> <ul> <li class="level1"><div class="li"> Can I automatically turn off links to pages that are self-referential? In other words, I don't want to link to the page on X from the page on X.</div> </li> <li class="level1 node"><div class="li"> Due to the number of times a given term is used, some of the longer articles may link to the same article twelve or even twenty times or more. This is somewhat distracting. Is there any possible way I could link to only the first time a given term is used? –Paul Albert, 27 July 2009</div> <ul> <li class="level2"><div class="li"> The version of 2015-02-26 has this feature. –Art Carlson, Max Planck Institute of Biochemistry, Munich, Germany, 2015-07-08</div> </li> </ul> </li> </ul> </div> <div class="secedit editbutton_section editbutton_12"><form class="button btn_secedit" method="post" action="/plugin:explain"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1704726114" /><input type="hidden" name="summary" value="[Two feature requests] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="two_feature_requests" /><input type="hidden" name="codeblockOffset" value="6" /><input type="hidden" name="range" value="12153-12812" /><button type="submit" title="Two feature requests">Edit</button></div></form></div> <h3 class="sectionedit13" id="when_do_changes_take_effect">When do changes take effect?</h3> <div class="level3"> <p> When I add an entry to explain.conf, it <em>sometimes</em> (usually?) has no effect on pages already containing that term, even if these are reloaded. If I make a change and save the page, the explain term becomes active. Is there any way to control or at least predict when the changes will take effect? Is there any way to force the changes in explain.conf to be propagated to all the pages on the wiki? –Art Carlson, Max Planck Institute of Biochemistry, Munich, Germany, 2015-07-08 </p> <p> A solution I can live with is <a href="/caching" class="wikilink1" title="caching" data-wiki-id="caching">purging the cache</a>. After making my changes, I go to Admin > Configuration Settings > Save (without making any changes). That apparently forces dokuwiki to re-render every page before displaying it the next time, using the new version of the explain.config file. –Art Carlson, Max Planck Institute of Biochemistry, Munich, Germany, 2015-07-15 </p> <p> My experience is that you have to change and re-change the template to force it. Only saving the configuration isn't enough in all cases. Also see my git issue at <a href="https://github.com/cosmocode/explain/issues/1" class="urlextern" title="https://github.com/cosmocode/explain/issues/1">GIT Cache problem #1</a> for this. <br/> — <a href="https://forum.dokuwiki.org/u/Juergen_aus_Zuendorf" class="interwiki iw_user" title="https://forum.dokuwiki.org/u/Juergen_aus_Zuendorf">Juergen_aus_Zuendorf</a> <em>2015-07-15 14:31</em> </p> </div> <div class="secedit editbutton_section editbutton_13"><form class="button btn_secedit" method="post" action="/plugin:explain"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1704726114" /><input type="hidden" name="summary" value="[When do changes take effect?] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="when_do_changes_take_effect" /><input type="hidden" name="codeblockOffset" value="6" /><input type="hidden" name="range" value="12813-14047" /><button type="submit" title="When do changes take effect?">Edit</button></div></form></div> <h3 class="sectionedit14" id="use_with_deflist_plugin">Use with deflist plugin</h3> <div class="level3"> <p> I decided to use this plugin in conjunction with the <a href="/plugin:deflist" class="wikilink1" title="plugin:deflist" data-wiki-id="plugin:deflist">deflist</a> plugin to provide direct internal links to my glossary page. I ran into a problem because one of my terms was PAGE (Polyacrylamide gel electrophoresis), and explain was linking every use of the ordinary word “page”. What I needed was a way to turn off the linkage to a term for most cases, but still specify linkage in the few cases where it was appropriate. </p> <p> What I discovered was a hack consisting up two parts. </p> <p> First, add a space character at the end of the line of containing the term on the glossary page, like this: </p> <pre class="code"> ?? PAGE<SPACE><NEWLINE> :: Polyacrylamide gel electrophoresis !!</pre> <p> Second, add a space after the term in the explain.conf file, like this: </p> <pre class="code">PAGE<SPACE><TAB>Polyacrylamide gel electrophoresis<TAB>:glossary#page</pre> <p> For reasons undocumented, this turns off the recognition of the word “page”, unless it is followed by a double space (“the PAGE<SPACE><SPACE>technique”) or a space plus a character that is not a letter or a digit or an underscore. </p> <p> This will <em>usually</em> give the right result, namely no link, but it will still give a false link if, for example, the normal word page is followed by a parenthetical comment. For the few instances that PAGE really does refer to electrophoresis and should be linked, an extra space must be added in the wiki markup. </p> <p> –Art Carlson, Max Planck Institute of Biochemistry, Munich, Germany, 2015-07-13 </p> </div> <div class="secedit editbutton_section editbutton_14"><form class="button btn_secedit" method="post" action="/plugin:explain"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1704726114" /><input type="hidden" name="summary" value="[Use with deflist plugin] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="use_with_deflist_plugin" /><input type="hidden" name="codeblockOffset" value="6" /><input type="hidden" name="range" value="14048-15548" /><button type="submit" title="Use with deflist plugin">Edit</button></div></form></div> <h3 class="sectionedit15" id="very_simple_odt-plugin_support">Very simple ODT-Plugin support</h3> <div class="level3"> <p> At the moment, the terms are not exported via the plugin <a href="/plugin:odt" class="wikilink1" title="plugin:odt" data-wiki-id="plugin:odt">odt</a>. Fixed it. </p> <pre class="code php"> <span class="kw2">public</span> <span class="kw2">function</span> render<span class="br0">(</span><span class="re0">$format</span><span class="sy0">,</span> Doku_Renderer <span class="re0">$renderer</span><span class="sy0">,</span> <span class="re0">$data</span><span class="br0">)</span> <span class="br0">{</span> <span class="kw1">if</span><span class="br0">(</span><a href="http://www.php.net/is_null"><span class="kw3">is_null</span></a><span class="br0">(</span><span class="re0">$data</span><span class="br0">[</span><span class="st_h">'desc'</span><span class="br0">]</span><span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span> <span class="re0">$renderer</span><span class="sy0">-></span><span class="me1">doc</span> <span class="sy0">.=</span> hsc<span class="br0">(</span><span class="re0">$data</span><span class="br0">[</span><span class="st_h">'content'</span><span class="br0">]</span><span class="br0">)</span><span class="sy0">;</span> <span class="kw1">return</span> <span class="kw4">true</span><span class="sy0">;</span> <span class="br0">}</span> <span class="kw1">if</span> <span class="br0">(</span><span class="re0">$format</span> <span class="sy0">==</span> <span class="st_h">'xhtml'</span><span class="br0">)</span> <span class="br0">{</span> <span class="re0">$renderer</span><span class="sy0">-></span><span class="me1">doc</span> <span class="sy0">.=</span> <span class="st_h">'<a class="explain"'</span><span class="sy0">;</span> <span class="kw1">if</span><span class="br0">(</span><span class="br0">(</span><span class="re0">$data</span><span class="br0">[</span><span class="st_h">'target'</span><span class="br0">]</span><span class="br0">)</span> <span class="sy0">!==</span> <span class="st_h">''</span><span class="br0">)</span> <span class="br0">{</span> <span class="re0">$renderer</span><span class="sy0">-></span><span class="me1">doc</span> <span class="sy0">.=</span> <span class="st_h">' href="'</span> <span class="sy0">.</span> hsc<span class="br0">(</span><span class="re0">$data</span><span class="br0">[</span><span class="st_h">'target'</span><span class="br0">]</span><span class="br0">)</span> <span class="sy0">.</span> <span class="st_h">'"'</span><span class="sy0">;</span> <span class="br0">}</span> <span class="re0">$renderer</span><span class="sy0">-></span><span class="me1">doc</span> <span class="sy0">.=</span> <span class="st_h">'>'</span> <span class="sy0">.</span> hsc<span class="br0">(</span><span class="re0">$data</span><span class="br0">[</span><span class="st_h">'content'</span><span class="br0">]</span><span class="br0">)</span><span class="sy0">;</span> <span class="kw1">if</span> <span class="br0">(</span><span class="re0">$data</span><span class="br0">[</span><span class="st_h">'desc'</span><span class="br0">]</span> <span class="sy0">!==</span> <span class="st_h">''</span><span class="br0">)</span> <span class="br0">{</span> <span class="re0">$renderer</span><span class="sy0">-></span><span class="me1">doc</span> <span class="sy0">.=</span> <span class="st_h">'<span class="tooltip">'</span><span class="sy0">.</span>hsc<span class="br0">(</span><span class="re0">$data</span><span class="br0">[</span><span class="st_h">'desc'</span><span class="br0">]</span><span class="br0">)</span><span class="sy0">.</span><span class="st_h">'</span>'</span><span class="sy0">;</span> <span class="br0">}</span> <span class="re0">$renderer</span><span class="sy0">-></span><span class="me1">doc</span> <span class="sy0">.=</span> <span class="st_h">'</a>'</span><span class="sy0">;</span> <span class="kw1">return</span> <span class="kw4">true</span><span class="sy0">;</span> <span class="br0">}</span> <span class="co1">// generate output for ODT export</span> <span class="kw1">if</span> <span class="br0">(</span><span class="re0">$format</span> <span class="sy0">==</span> <span class="st_h">'odt'</span><span class="br0">)</span> <span class="br0">{</span> <span class="re0">$renderer</span><span class="sy0">-></span><span class="me1">doc</span> <span class="sy0">.=</span> hsc<span class="br0">(</span><span class="re0">$data</span><span class="br0">[</span><span class="st_h">'content'</span><span class="br0">]</span><span class="br0">)</span><span class="sy0">;</span> <span class="kw1">return</span> <span class="kw4">true</span><span class="sy0">;</span> <span class="br0">}</span> <span class="kw1">return</span> <span class="kw4">false</span><span class="sy0">;</span> <span class="br0">}</span></pre> <p> – Alois Hockenschlohe, Germany </p> </div> <div class="secedit editbutton_section editbutton_15"><form class="button btn_secedit" method="post" action="/plugin:explain"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1704726114" /><input type="hidden" name="summary" value="[Very simple ODT-Plugin support] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="very_simple_odt-plugin_support" /><input type="hidden" name="codeblockOffset" value="8" /><input type="hidden" name="range" value="15549-16603" /><button type="submit" title="Very simple ODT-Plugin support">Edit</button></div></form></div> <h3 class="sectionedit16" id="ignore_this_word">Ignore this Word</h3> <div class="level3"> <p> I love the plugin, thank you! One question, or maybe it's a request… Some terms may be used in the 'English' sense of the word, when it is the second instance of the term it doesn't matter but when it is the first it will be highlighted. This is expected behaviour but incorrect in terms of this particular use case. Is there a way to 'mark' a term as 'ignore this' so it isn't highlighted and the next instance of the term is? </p> <p> <a href="https://forum.dokuwiki.org/u/lizat" class="interwiki iw_user" title="https://forum.dokuwiki.org/u/lizat">Liz T</a> <em>2020-12-03</em> </p> </div> <div class="secedit editbutton_section editbutton_16"><form class="button btn_secedit" method="post" action="/plugin:explain"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1704726114" /><input type="hidden" name="summary" value="[Ignore this Word] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="ignore_this_word" /><input type="hidden" name="codeblockOffset" value="9" /><input type="hidden" name="range" value="16604-" /><button type="submit" title="Ignore this Word">Edit</button></div></form></div> <!-- wikipage stop --> </div> <div class="docInfo"><bdi>plugin/explain.txt</bdi> · Last modified: <time datetime="2024-01-08T16:01:54+0100">2024-01-08 16:01</time> by <bdi>Aleksandr</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="/plugin:explain?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="/plugin:explain?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="/plugin:explain?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=plugin%3Aexplain&1744258866" width="2" height="1" alt="" /></div> <div id="screen__mode" class="no"></div></body> </html>