#FEATURE: distinguish ABBR and ACR =head1 NAME Konstrukt::Plugin::wiki::markup::acronym - Inline plugin to handle acronyms =head1 SYNOPSIS my $a = use_plugin 'wiki::markup::acronym'; my $rv = $a->process($tag); =head1 DESCRIPTION This one will look for acronyms with an explanation and replace it: IP(Internet Protocol) => IP Actually it will work for every "word" that does not contain spaces and is followed by some text in parenthesis. =head1 EXAMPLE TCP(Transmission Control Protocol)/IP(Internet Protocol) Foo-Bar(baz) =cut package Konstrukt::Plugin::wiki::markup::acronym; use strict; use warnings; use base 'Konstrukt::Plugin::wiki::markup::inlineplugin'; use Konstrukt::Plugin; #import use_plugin =head1 METHODS =head2 install Installs the templates. B none =cut sub install { my ($self) = @_; return $Konstrukt::Lib->plugin_file_install_helper($Konstrukt::Settings->get("wiki/template_path")); } # /install =head2 process This method will do the work. B: =over =item * $nodes - Container node (of type L) containing all (text-)nodes of this documents. =back =cut sub process { my ($self, $nodes) = @_; #container to collect the nodes. the type is arbitrary my $container = Konstrukt::Parser::Node->new({ type => 'wikinodecontainer' }); my $template = use_plugin 'template'; my $template_path = $Konstrukt::Settings->get("wiki/template_path"); #split all nodes into tokens. my $node = $nodes->{first_child}; #we will save the found acronym and its description nodes my $acronym; my $description; while (defined $node) { #save next node since $node->{next} might get overwritten #when moving this node around in the tree. my $next_node = $node->{next}; if (not $node->{wiki_finished} and $node->{type} eq 'plaintext') { my @tokens = split /([^\s\(\)\\\/:;=]{2,}\(|\))/o, $node->{content}; foreach my $token (@tokens) { if (not defined $acronym and $token =~ /^[^\s\(\)\\\/]+\(/) { #opening acronym description $acronym = substr($token, 0, length($token) - 1); $description = ''; } elsif (defined $acronym and $token eq ")") { #closing description. add acronym template my $template_node = $template->node("${template_path}markup/acronym.template", { acronym => $acronym, description => $description }); $container->add_child($template_node); $acronym = undef; $description = undef; } elsif (defined $acronym) { #append plaintext to the description $description .= $token; } else { #add as plaintext node $container->add_child(Konstrukt::Parser::Node->new({ wiki_finished => 0, type => 'plaintext', content => $token})); } } } else { #ignored node $container->add_child($node); } $node = $next_node; } #check if there is an unclosed acronym left $container->add_child($template->node("${template_path}markup/acronym.template", { acronym => $acronym, description => $description })) if defined $acronym; #move created nodes to the result node $nodes->{first_child} = $nodes->{last_child} = undef; #dirty hack... $container->move_children($nodes); return 1; } # /process 1; =head1 AUTHOR Copyright 2006 Thomas Wittek (mail at gedankenkonstrukt dot de). All rights reserved. This document is free software. It is distributed under the same terms as Perl itself. =head1 SEE ALSO L =cut __DATA__ -- 8< -- textfile: markup/acronym.template -- >8 -- <+$ acronym / $+>