summaryrefslogtreecommitdiff
path: root/bbc
diff options
context:
mode:
authorJonas Smedegaard <dr@jones.dk>2024-05-26 17:24:27 +0200
committerJonas Smedegaard <dr@jones.dk>2024-05-26 17:24:27 +0200
commit82230670b111a8d28e6678cad43e3e3863f23b72 (patch)
treea46d82a29c924981c3b59123d08a87a22572a008 /bbc
parent3c3678573df42b7ca0b83d20ce5b88013b8692f4 (diff)
update
Diffstat (limited to 'bbc')
0 files changed, 0 insertions, 0 deletions
li id="n_54" class="hl"> $/
  • # FIXME: implement option to choose output diagram language
  • # "{mermaid}\n\%\%| fig-width: 100\%\n"
  • # . &mmd2mmd( $+{type}, $+{code} )
  • "{.plantuml}\n\%\%| fig-width: 100\%\n"
  • . &mmd2puml( $+{type}, $+{code} )
  • . $+{fence}
  • /gsmex;
  • if ($outfile) {
  • open( FH, '>', $outfile ) or die $!;
  • print FH $content;
  • }
  • else {
  • print $content;
  • }
  • sub mmd2mmd ( $type, $code )
  • {
  • # strip special comment marker '%%QUARTO%%'
  • $code =~ s/^\s*+\K%%QUARTO%%//gm;
  • return "$type\n$code";
  • }
  • sub mmd2puml ( $type, $code )
  • {
  • my @newcode;
  • # strip special comment marker '%%QUARTO%%'
  • $code =~ s/^\s*+\K%%QUARTO%%//gm;
  • open my $fh, '<', \$code or die $!;
  • while (<$fh>) {
  • /^\s*+$/
  • and push @newcode, ''
  • and next;
  • /^(\s*+)%%PLANTUML%%\K.*/
  • and push @newcode, "$1$&"
  • and next;
  • # convert comments markers
  • /^(\s*+)(?:[%]{2,}(?'comment'\s*+))?+\K.*/;
  • my $indent = defined( $+{comment} ) ? "$1'$2" : $1;
  • $_ = $&;
  • /^title\s/i
  • and push @newcode, "${indent}$_"
  • and next;
  • /^excludes\s+weekends\b/i
  • and push @newcode, "${indent}saturday are closed"
  • and push @newcode, "${indent}sunday are closed"
  • and next;
  • /^weekday\s+\K(?:mon|tues|wednes|thurs|fri|satur|sun)day\b/i
  • and push @newcode, "${indent}weeks start on $&"
  • and next;
  • /^(?:date|axis)Format\s/i
  • and push @newcode, "${indent}'UNSUPPORTED: $_"
  • and next;
  • /^todayMarker\s+(off|on)\b/i
  • and push @newcode, "${indent}'UNSUPPORTED' $_"
  • and next;
  • /^section\s+\K\S+(?:\s+\S+)*/i
  • and push @newcode, "${indent}-- $& --"
  • and next;
  • if (/^tickInterval\s+(?'tickAmount'\d+)(?'tickUnit'millisecond|second|minute|hour|day|week|month)\s*$/i
  • )
  • {
  • push @newcode, "${indent}projectscale daily"
  • and next
  • if $+{tickAmount} eq 1
  • and $+{tickUnit} eq 'day';
  • push @newcode, "${indent}projectscale weekly" and next
  • if $+{tickAmount} eq 1 and $+{tickUnit} eq 'week'
  • or $+{tickAmount} eq 7 and $+{tickUnit} eq 'day';
  • push @newcode, "${indent}projectscale monthly"
  • and next
  • if $+{tickAmount} eq 1
  • and $+{tickUnit} eq 'month';
  • push @newcode, "${indent}projectscale quarterly"
  • and next
  • if $+{tickAmount} eq 3
  • and $+{tickUnit} eq 'month';
  • push @newcode, "${indent}projectscale yearly"
  • and next
  • if $+{tickAmount} eq 12
  • and $+{tickUnit} eq 'month';
  • push @newcode, "${indent}'UNSUPPORTED' $&"
  • and next;
  • }
  • /^
  • (?'title'[^:\n]+)
  • \s*+:\s*+
  • # optional tags
  • (?:
  • (?:
  • (?'active'active)
  • |
  • (?'done'done)
  • |
  • (?'crit'crit)
  • |
  • (?'milestone'milestone)
  • )\s*+
  • ,\s*+
  • )?+
  • (?:
  • # optional tertiary item
  • (?:
  • (?'taskID'(?&id))\s*+
  • ,\s*+
  • (?=.*,) # several items must follow
  • )?+
  • # optional secondary item
  • (?:
  • (?'startDate'(?&date))
  • |
  • after
  • (?'afterTaskIDs'
  • (?:\s+(?&id))++
  • )
  • )\s*+
  • ,\s*+
  • )?+
  • # required main item
  • (?:
  • (?'endDate'(?&date))
  • |
  • until
  • (?'untilTaskIDs'
  • (?:\s+(?&id))++
  • )
  • |
  • (?'duration'\d+)
  • \s*+d
  • )\s*+
  • (?(DEFINE)
  • (?'id'[^\s\d,][^\s,]*+) # assume digit as lead caracter is illegal
  • (?'date'\d\d\d\d(?:-\d\d(?:-\d\d)?+)?+)
  • )
  • $/x
  • or defined( $+{comment} )
  • and push @newcode, "${indent}$_"
  • and next
  • or die "unhandled syntax on line $.: $_";
  • defined( $+{active} )
  • or defined( $+{done} )
  • or defined( $+{crit} )
  • and die "unhandled tag on line $.: $_";
  • my $task = "${indent}\[$+{title}]";
  • my $taskref = $task;
  • # optional 3rd item
  • if ( $+{taskID} ) {
  • $task .= " as [$+{taskID}]";
  • $taskref = "${indent}\[$+{taskID}]";
  • }
  • if ( defined( $+{afterTaskIDs} ) ) {
  • my @reqs = split ' ', $+{afterTaskIDs};
  • if ( $+{milestone} ) {
  • push @newcode, "$task happens at [$_]'s end" for @reqs;
  • }
  • elsif ( $+{endDate} ) {
  • push @newcode, "$task ends $+{endDate}";
  • push( @newcode, "$taskref starts at [$_]'s end" ) for @reqs;
  • }
  • elsif ( defined( $+{untilTaskIDs} ) ) {
  • my @reqsEnd = split ' ', $+{untilTaskIDs};
  • push @newcode, "$task ends at [$_]'s end" for @reqsEnd;
  • push( @newcode, "$taskref starts at [$_]'s end" ) for @reqs;
  • }
  • else {
  • push @newcode, "$task requires $+{duration} days";