1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
| #!/usr/bin/env perl6
use v6;
use Data::Dump;
use Grammar::Tracer;
my $level;
grammar OrgMode {
rule TOP { ^ <tasks> $ }
rule tasks { \n?<task>+ %% \n}
token task { <content> <tasks>? {$level=""}}
# token task { <content> <tasks>? {$level=$level.substr(0, *-1)}}
token content { ^^ ($level "*"+)" " .+? $$ {$level=$0.Str}}
}
class OM-actions {
method TOP($/) {
make $<tasks>.made;
}
method tasks($/) {
make $<task>».made ;
}
method task($/) {
my %task;
%task{"task"}=$<content>.made;
%task{"sub-task"}=$<tasks>.made if $<tasks>.made;
make %task;
}
method content($/) {
make $/.Str ;
}
}
my $file =
"* juste un header 1
* juste deux header 1
* header 2
* juste 3 header 1
* header 2
* header 3
* juste un header 1 et un sub
** sub-header 1
* juste un header 1 et deux sub *
** sub-header 1
** sub-header 2
* juste un header 1 et un sub et un sub-sub
** sub-header 1
*** sub-sub-header 1
* 2 header 1 et un sub au milieu
** sub-header 1
* header 2"
;
say "\n" x 10;
sub parse_file($file) {
say $file;
say "";
$level="";
# say OrgMode.parse($file);
say Dump OrgMode.parse($file,:actions(OM-actions)).made;
say "---------------------------------------------------------------------------------------";
}
parse_file($_) for split("\n\n",$file); |