#!/usr/bin/perl
use Modern::Perl;
my $knownCmds = '(use|conf|qd)';
$_ = qq@
site_title
some orphan text
orphan a
@;
#tokenise negatable marker
s@`@@gs;
#any text before first knownCmd
s@(.*?)<$knownCmds>@'$1',\n\n<$2>@s;
#put negatable marker next to knownCmds
s@<$knownCmds>@<$1>`@gs;
s@$knownCmds>@`$1>@gs;
#any text between any two opens
s@<$knownCmds>`([^`]*?)<$knownCmds>`@<$1>`\n'$2',\n\n<$3>`@gs;
#any text between any two closes
s@`$knownCmds>([^`]*?)`$knownCmds>@`$1>\n'$2',\n\n`$3>@gs;
#any text between a close and an open
s@$knownCmds>([^`]*?)<$knownCmds>@$1>\n\n'$2',\n\n<$3>@gs;
#any text after last known close
s@(.*)$knownCmds>(.*)@$1$2>\n'$3'@s;
#remove remaining negatable markers
s@`@@gs;
#de-tokenise negatable marker
s@@`@gs;
#convert non-nested tags to node calls
s@<$knownCmds>([^<>]*?)\1>@Node->new ( $1 => '$2' ),@gs;
#convert everything else
s@<$knownCmds>(.*?)\1>@Node->new ( \[ $2 \] ),@gs;
#get rid of comma before end of array
s@,(\s+?)\]@]@gs;
say 'my @nodes = (';
say;
say ');';