From 1b03a06c8c0dbf59469ff30d09a0c9c3051e0b00 Mon Sep 17 00:00:00 2001 From: Josh Triplett Date: Sun, 27 Jan 2008 16:13:54 -0800 Subject: [PATCH] =?utf8?q?Add=20new=20preprocessor=20directive=20syntax?= =?utf8?q?=C2=B8=20using=20a=20'!'=20prefix.?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Add a prefix_directives option to the setup file to turn this syntax on; currently defaults to false, for backward compatibility. Support optional '!' prefix even with prefix_directives off, and use that in the underlay to support either setting of prefix_directives. Add NEWS entry with migration information. --- IkiWiki.pm | 93 +++++++++++++----- Makefile.PL | 4 +- debian/NEWS | 33 +++++++ debian/changelog | 6 ++ doc/ikiwiki-prefix-directives.mdwn | 26 +++++ doc/ikiwiki.mdwn | 4 +- doc/ikiwiki/blog.mdwn | 14 +-- doc/ikiwiki/formatting.mdwn | 22 ++--- doc/ikiwiki/openid.mdwn | 8 +- doc/ikiwiki/preprocessordirective.mdwn | 26 +++-- doc/ikiwiki/wikilink.mdwn | 14 ++- doc/shortcuts.mdwn | 94 +++++++++---------- doc/templates.mdwn | 12 +-- .../New_preprocessor_directive_syntax.mdwn | 2 + ikiwiki-prefix-directives | 44 +++++++++ t/linkify.t | 8 ++ t/preprocess.t | 4 +- underlays/basewiki/blog.mdwn | 2 +- underlays/basewiki/helponformatting.mdwn | 2 +- underlays/basewiki/markdown.mdwn | 2 +- underlays/basewiki/openid.mdwn | 2 +- underlays/basewiki/pagespec.mdwn | 2 +- underlays/basewiki/preprocessordirective.mdwn | 2 +- underlays/basewiki/subpage.mdwn | 2 +- underlays/basewiki/wikilink.mdwn | 2 +- 25 files changed, 307 insertions(+), 123 deletions(-) create mode 100644 doc/ikiwiki-prefix-directives.mdwn create mode 100755 ikiwiki-prefix-directives diff --git a/IkiWiki.pm b/IkiWiki.pm index 46060c1b2..56be7ed47 100644 --- a/IkiWiki.pm +++ b/IkiWiki.pm @@ -38,9 +38,9 @@ sub defaultconfig () { #{{{ qr/(^|\/)_MTN\//, qr/\.dpkg-tmp$/], wiki_link_regexp => qr{ - \[\[ # beginning of link + \[\[(?=[^!]) # beginning of link (?: - ([^\]\|\n\s]+) # 1: link text + ([^\]\|]+) # 1: link text \| # followed by '|' )? # optional @@ -100,6 +100,7 @@ sub defaultconfig () { #{{{ usedirs => 1, numbacklinks => 10, account_creation_password => "", + prefix_directives => 0, } #}}} sub checkconfig () { #{{{ @@ -146,6 +147,24 @@ sub checkconfig () { #{{{ umask(possibly_foolish_untaint($config{umask})); } + if (!$config{prefix_directives}) { + $config{wiki_link_regexp} = qr{ + \[\[ # beginning of link + (?: + ([^\]\|\n\s]+) # 1: link text + \| # followed by '|' + )? # optional + + ([^\s\]#]+) # 2: page to link to + (?: + \# # '#', beginning of anchor + ([^\s\]]+) # 3: anchor text + )? # optional + + \]\] # end of link + }x, + } + run_hooks(checkconfig => sub { shift->() }); return 1; @@ -679,10 +698,11 @@ sub preprocess ($$$;$$) { #{{{ my $handle=sub { my $escape=shift; + my $prefix=shift; my $command=shift; my $params=shift; if (length $escape) { - return "[[$command $params]]"; + return "[[$prefix$command $params]]"; } elsif (exists $hooks{preprocess}{$command}) { return "" if $scan && ! $hooks{preprocess}{$command}{scan}; @@ -756,31 +776,58 @@ sub preprocess ($$$;$$) { #{{{ return $ret; } else { - return "[[$command $params]]"; + return "[[$prefix$command $params]]"; } }; - $content =~ s{ - (\\?) # 1: escape? - \[\[ # directive open - ([-\w]+) # 2: command - \s+ - ( # 3: the parameters.. - (?: - (?:[-\w]+=)? # named parameter key? + my $regex; + if ($config{prefix_directives}) { + $regex = qr{ + (\\?) # 1: escape? + \[\[(!) # directive open; 2: prefix + ([-\w]+) # 3: command + ( # 4: the parameters.. + \s+ # Must have space if parameters present + (?: + (?:[-\w]+=)? # named parameter key? + (?: + """.*?""" # triple-quoted value + | + "[^"]+" # single-quoted value + | + [^\s\]]+ # unquoted value + ) + \s* # whitespace or end + # of directive + ) + *)? # 0 or more parameters + \]\] # directive closed + }sx; + } else { + $regex = qr{ + (\\?) # 1: escape? + \[\[(!?) # directive open; 2: optional prefix + ([-\w]+) # 3: command + \s+ + ( # 4: the parameters.. (?: - """.*?""" # triple-quoted value - | - "[^"]+" # single-quoted value - | - [^\s\]]+ # unquoted value + (?:[-\w]+=)? # named parameter key? + (?: + """.*?""" # triple-quoted value + | + "[^"]+" # single-quoted value + | + [^\s\]]+ # unquoted value + ) + \s* # whitespace or end + # of directive ) - \s* # whitespace or end - # of directive - ) - *) # 0 or more parameters - \]\] # directive closed - }{$handle->($1, $2, $3)}sexg; + *) # 0 or more parameters + \]\] # directive closed + }sx; + } + + $content =~ s{$regex}{$handle->($1, $2, $3, $4)}eg; return $content; } #}}} diff --git a/Makefile.PL b/Makefile.PL index 49fac1ade..3148db2ac 100755 --- a/Makefile.PL +++ b/Makefile.PL @@ -35,6 +35,7 @@ extra_build: ikiwiki.out ./mdwn2man ikiwiki 1 doc/usage.mdwn > ikiwiki.man ./mdwn2man ikiwiki-mass-rebuild 8 doc/ikiwiki-mass-rebuild.mdwn > ikiwiki-mass-rebuild.man ./mdwn2man ikiwiki-makerepo 1 doc/ikiwiki-makerepo.mdwn > ikiwiki-makerepo.man + ./mdwn2man ikiwiki-prefix-directives 1 doc/ikiwiki-prefix-directives.mdwn > ikiwiki-prefix-directives.man ./mdwn2man ikiwiki-update-wikilist 1 doc/ikiwiki-update-wikilist.mdwn > ikiwiki-update-wikilist.man $(MAKE) -C po if [ "$$PROFILE" = 1 ]; then dprofpp; fi @@ -67,6 +68,7 @@ extra_install: install -d $(DESTDIR)$(PREFIX)/share/man/man1 install -m 644 ikiwiki.man $(DESTDIR)$(PREFIX)/share/man/man1/ikiwiki.1 install -m 644 ikiwiki-makerepo.man $(DESTDIR)$(PREFIX)/share/man/man1/ikiwiki-makerepo.1 + install -m 644 ikiwiki-prefix-directives.man $(DESTDIR)$(PREFIX)/share/man/man1/ikiwiki-prefix-directives.1 install -m 644 ikiwiki-update-wikilist.man $(DESTDIR)$(PREFIX)/share/man/man1/ikiwiki-update-wikilist.1 install -d $(DESTDIR)$(PREFIX)/share/man/man8 @@ -80,7 +82,7 @@ extra_install: install -d $(DESTDIR)$(PREFIX)/bin install ikiwiki.out $(DESTDIR)$(PREFIX)/bin/ikiwiki - install ikiwiki-makerepo ikiwiki-update-wikilist $(DESTDIR)$(PREFIX)/bin/ + install ikiwiki-makerepo ikiwiki-prefix-directives ikiwiki-update-wikilist $(DESTDIR)$(PREFIX)/bin/ $(MAKE) -C po install DESTDIR=$(DESTDIR) PREFIX=$(PREFIX) } diff --git a/debian/NEWS b/debian/NEWS index 5515bbd7d..461a81977 100644 --- a/debian/NEWS +++ b/debian/NEWS @@ -1,3 +1,36 @@ +ikiwiki (2.21) unstable; urgency=low + + ikiwiki now has an new syntax for preprocessor directives, using the + prefix '!': + + [[!directive ...]] + + This new syntax no longer relies on spaces to distinguish between + wikilinks and preprocessor directives. Thus, wikilinks can use spaces + in their link text, and preprocessor directives without arguments (such + as "toc") need not use a trailing space. + + To enable the new syntax, set prefix_directives to true in your ikiwiki + config. For backward compatibility with existing wikis, + prefix_directives currently defaults to false. In ikiwiki 3.0, + prefix_directives will default to true, and wikis which have not yet + converted to the new syntax will need to set prefix_directives to false + in their setup files. + + To convert your wiki to the new syntax, ikiwiki provides a new script + ikiwiki-prefix-directives. It will convert preprocessor directives in + all files given on the command line. To convert an entire wiki: + + find wikidir/ -type f -name '*.mdwn' -print0 | xargs -0 ikiwiki-prefix-directives + + Even with prefix_directives disabled, ikiwiki now allows an optional '!' + prefix on preprocessor directives (but still requires a space). Thus, a + directive which uses a '!' prefix and contains a space will work with + ikiwiki 2.21 and newer, regardless of the value of prefix_directives. + This allows the underlay to work with all ikiwikis. + + -- Josh Triplett Sat, 26 Jan 2008 16:26:47 -0800 + ikiwiki (2.20) unstable; urgency=low The template plugin has begin to htmlize the variables passed to templates. diff --git a/debian/changelog b/debian/changelog index 50196b077..e81cc21ad 100644 --- a/debian/changelog +++ b/debian/changelog @@ -14,6 +14,12 @@ ikiwiki (2.21) UNRELEASED; urgency=low [ Josh Triplett ] * Add trailing comma to commented-out umask in sample ikiwiki.setup, so that uncommenting it does not break the setup file. + * Add new preprocessor directive syntax¸ using a '!' prefix. Add a + prefix_directives option to the setup file to turn this syntax on; + currently defaults to false, for backward compatibility. Support + optional '!' prefix even with prefix_directives off, and use that in + the underlay to support either setting of prefix_directives. Add NEWS + entry with migration information. -- Joey Hess Fri, 11 Jan 2008 15:09:37 -0500 diff --git a/doc/ikiwiki-prefix-directives.mdwn b/doc/ikiwiki-prefix-directives.mdwn new file mode 100644 index 000000000..df4b88b1c --- /dev/null +++ b/doc/ikiwiki-prefix-directives.mdwn @@ -0,0 +1,26 @@ +# NAME + +ikiwiki-prefix-directives - convert ikiwiki pages to prefixed directive syntax + +# SYNOPSIS + +ikiwiki-prefix-directives page.mdwn... + +# DESCRIPTION + +`ikiwiki-prefix-directives` converts an ikiwiki page from the old +preprocessor directive syntax, requiring a space, to the new syntax, +prefixed by '!'. + +Preprocessor directives which already use the new syntax will remain +unchanged. + +Note that if the page contains wiki links with spaces, which some +older versions of ikiwiki accepted, ikiwiki-prefix-directives will +treat these as preprocessor directives and convert them. + +# AUTHOR + +Josh Triplett + +Warning: this page is automatically made into ikiwiki-prefix-directives's man page, edit with care diff --git a/doc/ikiwiki.mdwn b/doc/ikiwiki.mdwn index c3773ed3a..9f8693ec4 100644 --- a/doc/ikiwiki.mdwn +++ b/doc/ikiwiki.mdwn @@ -1,6 +1,6 @@ This wiki is powered by [ikiwiki](http://ikiwiki.info/). -[[if test="enabled(version)" - then="(Currently running version [[version ]].)" +[[!if test="enabled(version)" + then="(Currently running version [[!version ]].)" ]] Some documentation on using ikiwiki: diff --git a/doc/ikiwiki/blog.mdwn b/doc/ikiwiki/blog.mdwn index 6e5eec4aa..8a9c50d0b 100644 --- a/doc/ikiwiki/blog.mdwn +++ b/doc/ikiwiki/blog.mdwn @@ -1,14 +1,14 @@ -[[if test="enabled(inline)" +[[!if test="enabled(inline)" then="This wiki has the inline plugin **enabled**." else="This wiki has the inline plugin **disabled**."]] -[[if test="enabled(inline)" +[[!if test="enabled(inline)" then="You can" else="If this wiki had the inline plugin enabled, you could"]] turn any page on this wiki into a weblog by using the `inline` [[PreProcessorDirective]]. For example: - \[[inline pages="blog/* and !*/Discussion" show="10" rootpage="blog"]] + \[[!inline pages="blog/* and !*/Discussion" show="10" rootpage="blog"]] Any pages that match the specified [[PageSpec]] (in the example, any [[SubPage]] of "blog") will be part of the blog, and the newest 10 @@ -23,23 +23,23 @@ top of the blog that can be used to add new items. If you want your blog to have an archive page listing every post ever made to it, you can accomplish that like this: - \[[inline pages="blog/* and !*/Discussion" archive="yes"]] + \[[!inline pages="blog/* and !*/Discussion" archive="yes"]] You can even create an automatically generated list of all the pages on the wiki, with the most recently added at the top, like this: - \[[inline pages="* and !*/Discussion" archive="yes"]] + \[[!inline pages="* and !*/Discussion" archive="yes"]] If you want to be able to add pages to a given blog feed by tagging them, you can do that too. To tag a page, just make it link to a page or pages that represent its tags. Then use the special `link()` [[PageSpec]] to match all pages that have a given tag: - \[[inline pages="link(life)"]] + \[[!inline pages="link(life)"]] Or include some tags and exclude others: - \[[inline pages="link(debian) and !link(social)"]] + \[[!inline pages="link(debian) and !link(social)"]] ## usage diff --git a/doc/ikiwiki/formatting.mdwn b/doc/ikiwiki/formatting.mdwn index 69e28913f..dc1fa77fd 100644 --- a/doc/ikiwiki/formatting.mdwn +++ b/doc/ikiwiki/formatting.mdwn @@ -1,4 +1,4 @@ -[[meta title="Formatting wiki pages"]] +[[!meta title="Formatting wiki pages"]] Text on this wiki is, by default, written in a form very close to how you might write text for an email message. This style of text formatting is @@ -59,36 +59,36 @@ you use the following additional features: * To link to another page on the wiki, place the page's name inside double square brackets. So you would use `\[[WikiLink]]` to link to [[WikiLink]]. -[[if test="enabled(smiley) and smileys" then=""" +[[!if test="enabled(smiley) and smileys" then=""" * Insert [[smileys]] and some other useful symbols. :-) """]] -[[if test="enabled(shortcut) and shortcuts" then=""" +[[!if test="enabled(shortcut) and shortcuts" then=""" * Use [[shortcuts]] to link to common resources. - \[[wikipedia War\_of\_1812]] + \[[!wikipedia War\_of\_1812]] """]] -[[if test="enabled(toc)" then=""" +[[!if test="enabled(toc)" then=""" * Add a table of contents to a page: - \[[toc ]] + \[[!toc ]] """]] -[[if test="enabled(meta)" then=""" +[[!if test="enabled(meta)" then=""" * Change the title of a page: - \[[meta title="full page title"]] + \[[!meta title="full page title"]] """]] -[[if test="enabled(inline) and blog" then=""" +[[!if test="enabled(inline) and blog" then=""" * Create a [[blog]] by inlining a set of pages: - \[[inline pages="blog/*"]] + \[[!inline pages="blog/*"]] """]] -[[if test="enabled(template) and templates" then=""" +[[!if test="enabled(template) and templates" then=""" * Create and fill out [[templates]] for repeated chunks of parameterized wiki text. """]] diff --git a/doc/ikiwiki/openid.mdwn b/doc/ikiwiki/openid.mdwn index f02a0a62c..d0f93a8a9 100644 --- a/doc/ikiwiki/openid.mdwn +++ b/doc/ikiwiki/openid.mdwn @@ -1,6 +1,6 @@ -[[meta title="OpenID"]] +[[!meta title="OpenID"]] -[[if test="enabled(openid)" +[[!if test="enabled(openid)" then="This wiki has OpenID **enabled**." else="This wiki has OpenID **disabled**."]] @@ -17,7 +17,7 @@ To sign up for an OpenID, visit one of the following identity providers: * or any of the [many others out there](http://openiddirectory.com/index.php?dir=1).. Your OpenID is the URL that you are given when you sign up. -[[if test="enabled(openid)" then=""" +[[!if test="enabled(openid)" then=""" To sign in to this wiki using OpenID, just enter it in the OpenID field in the signin form. You do not need to give this wiki a password or go through any registration process when using OpenID. @@ -28,5 +28,5 @@ registration process when using OpenID. It's also possible to make a page in the wiki usable as an OpenID url, by delegating it to an openid server. Here's an example of how to do that: - \[[meta openid="http://yourid.myopenid.com/" + \[[!meta openid="http://yourid.myopenid.com/" server="http://www.myopenid.com/server"]] diff --git a/doc/ikiwiki/preprocessordirective.mdwn b/doc/ikiwiki/preprocessordirective.mdwn index 1e2332c09..e8bf783a9 100644 --- a/doc/ikiwiki/preprocessordirective.mdwn +++ b/doc/ikiwiki/preprocessordirective.mdwn @@ -1,7 +1,7 @@ Preprocessor directives are similar to a [[WikiLink]] in form, except they -contain spaces and parameters. The general form is: +begin with `!` and may contain parameters. The general form is: - \[[directive param="value" param="value"]] + \[[!directive param="value" param="value"]] This gets expanded before the rest of the page is processed, and can be used to transform the page in various ways. @@ -9,25 +9,31 @@ to transform the page in various ways. The quotes around values can be omitted if the value is a simple word. Also, some directives may use parameters without values, for example: - \[[tag foo]] - -Note that if a preprocessor directive has no parameters, a space still must -be put after its name, to avoid confusion with a [[WikiLink]]. For example: - - \[[pagecount ]] + \[[!tag foo]] A preprocessor directive does not need to all be on one line, it can be wrapped to multiple lines if you like: - \[[directive foo="baldersnatch" + \[[!directive foo="baldersnatch" bar="supercalifragalisticexpealadocious" baz=11]] Also, multiple lines of *quoted* text can be used for a value. To allow quote marks inside the quoted text, delimit the block of text with triple-quotes: - \[[directive text=""" + \[[!directive text=""" 1. "foo" 2. "bar" 3. "baz" """]] + +ikiwiki also has an older syntax for preprocessor directives, which requires a +space in directives to distinguish them from [[wikilinks|wikilink]]. This +syntax has several disadvantages: it requires a space after directives with no +parameters (such as `\[[!pagecount ]]`), and it prohibits spaces in +[[wikilinks|wikilink]]. ikiwiki now provides the `!`-prefixed syntax shown +above as the preferred alternative. However, ikiwiki still supports wikis +using the older syntax, if their setup files disable the `prefix_directives` +option. For backward compatibility with existing wikis, this option currently +defaults to off, so ikiwiki uses the old directive syntax; however, future +versions of ikiwiki will turn this on by default. diff --git a/doc/ikiwiki/wikilink.mdwn b/doc/ikiwiki/wikilink.mdwn index 38df00f86..debbe7305 100644 --- a/doc/ikiwiki/wikilink.mdwn +++ b/doc/ikiwiki/wikilink.mdwn @@ -22,6 +22,14 @@ page, but the link will appear like this: [[foo_bar|SandBox]]. To link to an anchor inside a page, you can use something like `\[[WikiLink#foo]]` -**Note that you cannot use spaces in WikiLinks**. Replace spaces with -underscores. The presence of spaces is used to distinguish between a -[[PreprocessorDirective]] and a WikiLink. +## Preprocessor directives and wikilinks + +ikiwiki has two syntaxes for +[[preprocessor_directives|PreprocessorDirective]]. The older syntax +used spaces to distinguish between preprocessor directives and +wikilinks; as a result, with that syntax in use, you cannot use spaces +in WikiLinks, and must replace spaces with underscores. The newer +syntax, enabled with the `prefix_directives` option in an ikiwiki +setup file, prefixes directives with `!`, and thus does not prevent +links with spaces. Future versions of ikiwiki will turn this option +on by default. \ No newline at end of file diff --git a/doc/shortcuts.mdwn b/doc/shortcuts.mdwn index 62e06614b..e4e740897 100644 --- a/doc/shortcuts.mdwn +++ b/doc/shortcuts.mdwn @@ -1,58 +1,58 @@ -[[if test="enabled(shortcut)" +[[!if test="enabled(shortcut)" then="This wiki has shortcuts **enabled**." else="This wiki has shortcuts **disabled**."]] Some examples of using shortcuts include: - \[[google foo]] - \[[wikipedia War_of_1812]] - \[[debbug 12345]] + \[[!google foo]] + \[[!wikipedia War_of_1812]] + \[[!debbug 12345]] This page controls what shortcut links the wiki supports. -* [[shortcut name=google url="http://www.google.com/search?q=%s"]] -* [[shortcut name=archive url="http://web.archive.org/*/%S"]] -* [[shortcut name=gmap url="http://maps.google.com/maps?q=%s"]] -* [[shortcut name=gmsg url="http://groups.google.com/groups?selm=%s"]] -* [[shortcut name=wikipedia url="http://en.wikipedia.org/wiki/%s"]] -* [[shortcut name=wikitravel url="http://wikitravel.org/en/%s"]] -* [[shortcut name=debbug url="http://bugs.debian.org/%s" desc="bug #%s"]] -* [[shortcut name=deblist url="http://lists.debian.org/debian-%s" desc="debian-%s@lists.debian.org"]] -* [[shortcut name=debpkg url="http://packages.debian.org/%s"]] -* [[shortcut name=debpts url="http://packages.qa.debian.org/%s"]] -* [[shortcut name=debmsg url="http://lists.debian.org/msgid-search/%s"]] -* [[shortcut name=debrt url="https://rt.debian.org/Ticket/Display.html?id=%s"]] -* [[shortcut name=debss url="http://snapshot.debian.net/package/%s"]] - * Usage: `\[[debss package]]`, `\[[debss package#version]]`, or `\[[debss package/version]]`. See http://snapshot.debian.net for details. -* [[shortcut name=fdobug url="https://bugs.freedesktop.org/show_bug.cgi?id=%s" desc="freedesktop.org bug #%s"]] -* [[shortcut name=fdolist url="http://lists.freedesktop.org/mailman/listinfo/%s" desc="%s@lists.freedesktop.org"]] -* [[shortcut name=gnomebug url="http://bugzilla.gnome.org/show_bug.cgi?id=%s" desc="GNOME bug #%s"]] -* [[shortcut name=linuxbug url="http://bugzilla.kernel.org/show_bug.cgi?id=%s" desc="Linux bug #%s"]] -* [[shortcut name=mozbug url="https://bugzilla.mozilla.org/show_bug.cgi?id=%s" desc="Mozilla bug #%s"]] -* [[shortcut name=gnulist url="http://lists.gnu.org/mailman/listinfo/%s" desc="%s@gnu.org"]] -* [[shortcut name=marcmsg url="http://marc.info/?i=%s"]] -* [[shortcut name=marclist url="http://marc.info/?l=%s"]] -* [[shortcut name=gmane url="http://dir.gmane.org/gmane.%s" desc="gmane.%s"]] -* [[shortcut name=gmanemsg url="http://mid.gmane.org/%s"]] -* [[shortcut name=cpan url="http://search.cpan.org/search?mode=dist&query=%s"]] -* [[shortcut name=ctan url="http://tug.ctan.org/cgi-bin/ctanPackageInformation.py?id=%s"]] -* [[shortcut name=hoogle url="http://haskell.org/hoogle/?q=%s"]] -* [[shortcut name=iki url="http://ikiwiki.info/%S/"]] -* [[shortcut name=ljuser url="http://%s.livejournal.com/"]] -* [[shortcut name=rfc url="http://www.ietf.org/rfc/rfc%s.txt" desc="RFC %s"]] -* [[shortcut name=c2 url="http://c2.com/cgi/wiki?%s"]] -* [[shortcut name=meatballwiki url="http://www.usemod.com/cgi-bin/mb.pl?%s"]] -* [[shortcut name=emacswiki url="http://www.emacswiki.org/cgi-bin/wiki/%s"]] -* [[shortcut name=haskellwiki url="http://haskell.org/haskellwiki/%s"]] -* [[shortcut name=dict url="http://www.dict.org/bin/Dict?Form=Dict1&Strategy=*&Database=*&Query=%s"]] -* [[shortcut name=imdb url="http://imdb.com/find?q=%s"]] -* [[shortcut name=gpg url="http://pgpkeys.mit.edu:11371/pks/lookup?op=vindex&exact=on&search=0x%s"]] -* [[shortcut name=perldoc url="http://perldoc.perl.org/search.html?q=%s"]] -* [[shortcut name=whois url="http://reports.internic.net/cgi/whois?whois_nic=%s&type=domain"]] -* [[shortcut name=cve url="http://cve.mitre.org/cgi-bin/cvename.cgi?name=%s"]] -* [[shortcut name=cia url="http://cia.vc/stats/project/%s"]] -* [[shortcut name=ciauser url="http://cia.vc/stats/user/%s"]] -* [[shortcut name=flickr url="http://www.flickr.com/photos/%s"]] +* [[!shortcut name=google url="http://www.google.com/search?q=%s"]] +* [[!shortcut name=archive url="http://web.archive.org/*/%S"]] +* [[!shortcut name=gmap url="http://maps.google.com/maps?q=%s"]] +* [[!shortcut name=gmsg url="http://groups.google.com/groups?selm=%s"]] +* [[!shortcut name=wikipedia url="http://en.wikipedia.org/wiki/%s"]] +* [[!shortcut name=wikitravel url="http://wikitravel.org/en/%s"]] +* [[!shortcut name=debbug url="http://bugs.debian.org/%s" desc="bug #%s"]] +* [[!shortcut name=deblist url="http://lists.debian.org/debian-%s" desc="debian-%s@lists.debian.org"]] +* [[!shortcut name=debpkg url="http://packages.debian.org/%s"]] +* [[!shortcut name=debpts url="http://packages.qa.debian.org/%s"]] +* [[!shortcut name=debmsg url="http://lists.debian.org/msgid-search/%s"]] +* [[!shortcut name=debrt url="https://rt.debian.org/Ticket/Display.html?id=%s"]] +* [[!shortcut name=debss url="http://snapshot.debian.net/package/%s"]] + * Usage: `\[[!debss package]]`, `\[[!debss package#version]]`, or `\[[!debss package/version]]`. See http://snapshot.debian.net for details. +* [[!shortcut name=fdobug url="https://bugs.freedesktop.org/show_bug.cgi?id=%s" desc="freedesktop.org bug #%s"]] +* [[!shortcut name=fdolist url="http://lists.freedesktop.org/mailman/listinfo/%s" desc="%s@lists.freedesktop.org"]] +* [[!shortcut name=gnomebug url="http://bugzilla.gnome.org/show_bug.cgi?id=%s" desc="GNOME bug #%s"]] +* [[!shortcut name=linuxbug url="http://bugzilla.kernel.org/show_bug.cgi?id=%s" desc="Linux bug #%s"]] +* [[!shortcut name=mozbug url="https://bugzilla.mozilla.org/show_bug.cgi?id=%s" desc="Mozilla bug #%s"]] +* [[!shortcut name=gnulist url="http://lists.gnu.org/mailman/listinfo/%s" desc="%s@gnu.org"]] +* [[!shortcut name=marcmsg url="http://marc.info/?i=%s"]] +* [[!shortcut name=marclist url="http://marc.info/?l=%s"]] +* [[!shortcut name=gmane url="http://dir.gmane.org/gmane.%s" desc="gmane.%s"]] +* [[!shortcut name=gmanemsg url="http://mid.gmane.org/%s"]] +* [[!shortcut name=cpan url="http://search.cpan.org/search?mode=dist&query=%s"]] +* [[!shortcut name=ctan url="http://tug.ctan.org/cgi-bin/ctanPackageInformation.py?id=%s"]] +* [[!shortcut name=hoogle url="http://haskell.org/hoogle/?q=%s"]] +* [[!shortcut name=iki url="http://ikiwiki.info/%S/"]] +* [[!shortcut name=ljuser url="http://%s.livejournal.com/"]] +* [[!shortcut name=rfc url="http://www.ietf.org/rfc/rfc%s.txt" desc="RFC %s"]] +* [[!shortcut name=c2 url="http://c2.com/cgi/wiki?%s"]] +* [[!shortcut name=meatballwiki url="http://www.usemod.com/cgi-bin/mb.pl?%s"]] +* [[!shortcut name=emacswiki url="http://www.emacswiki.org/cgi-bin/wiki/%s"]] +* [[!shortcut name=haskellwiki url="http://haskell.org/haskellwiki/%s"]] +* [[!shortcut name=dict url="http://www.dict.org/bin/Dict?Form=Dict1&Strategy=*&Database=*&Query=%s"]] +* [[!shortcut name=imdb url="http://imdb.com/find?q=%s"]] +* [[!shortcut name=gpg url="http://pgpkeys.mit.edu:11371/pks/lookup?op=vindex&exact=on&search=0x%s"]] +* [[!shortcut name=perldoc url="http://perldoc.perl.org/search.html?q=%s"]] +* [[!shortcut name=whois url="http://reports.internic.net/cgi/whois?whois_nic=%s&type=domain"]] +* [[!shortcut name=cve url="http://cve.mitre.org/cgi-bin/cvename.cgi?name=%s"]] +* [[!shortcut name=cia url="http://cia.vc/stats/project/%s"]] +* [[!shortcut name=ciauser url="http://cia.vc/stats/user/%s"]] +* [[!shortcut name=flickr url="http://www.flickr.com/photos/%s"]] To add a new shortcut, use the `shortcut` [[ikiwiki/PreprocessorDirective]]. In the url, "%s" is replaced with the diff --git a/doc/templates.mdwn b/doc/templates.mdwn index 9ed9b838d..24da881c7 100644 --- a/doc/templates.mdwn +++ b/doc/templates.mdwn @@ -1,4 +1,4 @@ -[[if test="enabled(template)" +[[!if test="enabled(template)" then="This wiki has templates **enabled**." else="This wiki has templates **disabled**." ]] @@ -6,14 +6,14 @@ else="This wiki has templates **disabled**." Templates are files that can be filled out and inserted into pages in the wiki. -[[if test="enabled(template) and enabled(inline)" then=""" +[[!if test="enabled(template) and enabled(inline)" then=""" ## Available templates These templates are available for inclusion onto other pages in this wiki: -[[inline pages="templates/* and !*/discussion" feeds=no archive=yes +[[!inline pages="templates/* and !*/discussion" feeds=no archive=yes sort=title template=titlepage]] """]] @@ -21,7 +21,7 @@ sort=title template=titlepage]] Using a template works like this: - \[[template id=note text="""Here is the text to insert into my note."""]] + \[[!template id=note text="""Here is the text to insert into my note."""]] This fills out the [[note]] template, filling in the `text` field with the specified value, and inserts the result into the page. @@ -31,7 +31,7 @@ page outside the template. Triple-quoting the value even allows quotes to be included in it. Combined with multi-line quoted values, this allows for large chunks of marked up text to be embedded into a template: - \[[template id=foo name="Sally" color="green" age=8 notes=""" + \[[!template id=foo name="Sally" color="green" age=8 notes=""" * \[[Charley]]'s sister. * "I want to be an astronaut when I grow up." * Really 8 and a half. @@ -43,7 +43,7 @@ To create a template, simply add a template directive to a page, and page will provide a link that can be used to create the template. The template is a regular wiki page, located in the `templates/` directory. -The template uses the syntax used by the [[cpan HTML::Template]] perl +The template uses the syntax used by the [[!cpan HTML::Template]] perl module, which allows for some fairly complex things to be done. Consult its documentation for the full syntax, but all you really need to know are a few things: diff --git a/doc/todo/New_preprocessor_directive_syntax.mdwn b/doc/todo/New_preprocessor_directive_syntax.mdwn index 0302c4e38..b37985994 100644 --- a/doc/todo/New_preprocessor_directive_syntax.mdwn +++ b/doc/todo/New_preprocessor_directive_syntax.mdwn @@ -17,3 +17,5 @@ Making this transition would fix two major warts: with no arguments, such as `\[[toc ]]` --[[JoshTriplett]] + +[[done]] in version 2.21, using the '!'-prefixed syntax. --[[JoshTriplett]] \ No newline at end of file diff --git a/ikiwiki-prefix-directives b/ikiwiki-prefix-directives new file mode 100755 index 000000000..d35c41f30 --- /dev/null +++ b/ikiwiki-prefix-directives @@ -0,0 +1,44 @@ +#!/usr/bin/perl -i +undef $/; # process whole files at once + +my $regex = qr{ + (\\?) # 1: escape? + \[\[(!?) # directive open; 2: optional prefix + ([-\w]+) # 3: command + ( # 4: the parameters (including initial whitespace) + \s+ + (?: + (?:[-\w]+=)? # named parameter key? + (?: + """.*?""" # triple-quoted value + | + "[^"]+" # single-quoted value + | + [^\s\]]+ # unquoted value + ) + \s* # whitespace or end + # of directive + ) + *) # 0 or more parameters + \]\] # directive closed +}sx; + +sub handle_directive($$$$) { + my $escape = shift; + my $prefix = shift; + my $directive = shift; + my $args = shift; + + if (length $escape) { + return "${escape}[[${prefix}${directive}${args}]]" + } + if ($directive =~ m/^(if|more|table|template|toggleable)$/) { + $args =~ s{$regex}{handle_directive($1, $2, $3, $4)}eg; + } + return "[[!${directive}${args}]]" +} + +while (<>) { + s{$regex}{handle_directive($1, $2, $3, $4)}eg; + print; +} diff --git a/t/linkify.t b/t/linkify.t index 59af7bd4d..400e2e893 100755 --- a/t/linkify.t +++ b/t/linkify.t @@ -24,9 +24,17 @@ sub linkify ($$$$) { } %config=IkiWiki::defaultconfig(); $config{cgiurl}="http://somehost/ikiwiki.cgi"; + $config{srcdir}=$config{destdir}="/dev/null"; # placate checkconfig # currently coded for non usedirs mode (TODO: check both) $config{usedirs}=0; + # currently coded for prefix_directives=0 (TODO: check both) + # Not setting $config{prefix_directives}=0 explicitly; instead, let the + # tests break if the default changes, as a reminder to update the + # tests. + + IkiWiki::checkconfig(); + return IkiWiki::linkify($lpage, $page, $content); } diff --git a/t/preprocess.t b/t/preprocess.t index 9b029281f..7699f56ba 100755 --- a/t/preprocess.t +++ b/t/preprocess.t @@ -1,7 +1,7 @@ #!/usr/bin/perl use warnings; use strict; -use Test::More tests => 17; +use Test::More tests => 19; BEGIN { use_ok("IkiWiki"); } @@ -23,6 +23,8 @@ $IkiWiki::hooks{preprocess}{foo}{call}=sub { is(IkiWiki::preprocess("foo", "foo", "[[foo]]", 0, 0), "[[foo]]", "not wikilink"); is(IkiWiki::preprocess("foo", "foo", "[[foo ]]", 0, 0), "foo()", "simple"); +is(IkiWiki::preprocess("foo", "foo", "[[!foo ]]", 0, 0), "foo()", "prefixed"); +is(IkiWiki::preprocess("foo", "foo", "[[!foo]]", 0, 0), "[[!foo]]", "prefixed, no space"); is(IkiWiki::preprocess("foo", "foo", "[[foo a=1]]", 0, 0), "foo(a => 1)"); is(IkiWiki::preprocess("foo", "foo", "[[foo a=\"1 2 3 4\"]]", 0, 0), "foo(a => 1 2 3 4)"); is(IkiWiki::preprocess("foo", "foo", "[[foo ]] then [[foo a=2]]", 0, 0), diff --git a/underlays/basewiki/blog.mdwn b/underlays/basewiki/blog.mdwn index b4f171c97..c0c3ef5f2 100644 --- a/underlays/basewiki/blog.mdwn +++ b/underlays/basewiki/blog.mdwn @@ -1,4 +1,4 @@ -[[meta redir=ikiwiki/blog delay=10]] +[[!meta redir=ikiwiki/blog delay=10]] This page has moved to [[ikiwiki/blog|ikiwiki/blog]]. Please update your links, as this redirection page will be removed in a future ikiwiki diff --git a/underlays/basewiki/helponformatting.mdwn b/underlays/basewiki/helponformatting.mdwn index ca8e91908..437a2466d 100644 --- a/underlays/basewiki/helponformatting.mdwn +++ b/underlays/basewiki/helponformatting.mdwn @@ -1,4 +1,4 @@ -[[meta redir=ikiwiki/formatting delay=10]] +[[!meta redir=ikiwiki/formatting delay=10]] This page has moved to [[ikiwiki/formatting|ikiwiki/formatting]]. Please update your links, as this redirection page will be removed in a future diff --git a/underlays/basewiki/markdown.mdwn b/underlays/basewiki/markdown.mdwn index 96eba217c..03ce25745 100644 --- a/underlays/basewiki/markdown.mdwn +++ b/underlays/basewiki/markdown.mdwn @@ -1,4 +1,4 @@ -[[meta redir=ikiwiki/markdown delay=10]] +[[!meta redir=ikiwiki/markdown delay=10]] This page has moved to [[ikiwiki/markdown|ikiwiki/markdown]]. Please update your links, as this redirection page will be removed in a future ikiwiki diff --git a/underlays/basewiki/openid.mdwn b/underlays/basewiki/openid.mdwn index 26496fe1a..7fe832e11 100644 --- a/underlays/basewiki/openid.mdwn +++ b/underlays/basewiki/openid.mdwn @@ -1,4 +1,4 @@ -[[meta redir=ikiwiki/openid delay=10]] +[[!meta redir=ikiwiki/openid delay=10]] This page has moved to [[ikiwiki/openid|ikiwiki/openid]]. Please update your links, as this redirection page will be removed in a future ikiwiki diff --git a/underlays/basewiki/pagespec.mdwn b/underlays/basewiki/pagespec.mdwn index f42f41742..4a82eff84 100644 --- a/underlays/basewiki/pagespec.mdwn +++ b/underlays/basewiki/pagespec.mdwn @@ -1,4 +1,4 @@ -[[meta redir=ikiwiki/pagespec delay=10]] +[[!meta redir=ikiwiki/pagespec delay=10]] This page has moved to [[ikiwiki/pagespec|ikiwiki/pagespec]]. Please update your links, as this redirection page will be removed in a future ikiwiki diff --git a/underlays/basewiki/preprocessordirective.mdwn b/underlays/basewiki/preprocessordirective.mdwn index b0876ffe5..7c5d0c3e0 100644 --- a/underlays/basewiki/preprocessordirective.mdwn +++ b/underlays/basewiki/preprocessordirective.mdwn @@ -1,4 +1,4 @@ -[[meta redir=ikiwiki/preprocessordirective delay=10]] +[[!meta redir=ikiwiki/preprocessordirective delay=10]] This page has moved to [[ikiwiki/preprocessordirective|ikiwiki/preprocessordirective]]. Please diff --git a/underlays/basewiki/subpage.mdwn b/underlays/basewiki/subpage.mdwn index ac24a6fed..2de27a1ad 100644 --- a/underlays/basewiki/subpage.mdwn +++ b/underlays/basewiki/subpage.mdwn @@ -1,4 +1,4 @@ -[[meta redir=ikiwiki/subpage delay=10]] +[[!meta redir=ikiwiki/subpage delay=10]] This page has moved to [[ikiwiki/subpage|ikiwiki/subpage]]. Please update your links, as this redirection page will be removed in a future ikiwiki diff --git a/underlays/basewiki/wikilink.mdwn b/underlays/basewiki/wikilink.mdwn index c0c22aeae..ce5920a57 100644 --- a/underlays/basewiki/wikilink.mdwn +++ b/underlays/basewiki/wikilink.mdwn @@ -1,4 +1,4 @@ -[[meta redir=ikiwiki/wikilink delay=10]] +[[!meta redir=ikiwiki/wikilink delay=10]] This page has moved to [[ikiwiki/wikilink|ikiwiki/wikilink]]. Please update your links, as this redirection page will be removed in a future ikiwiki -- 2.39.5