#!/usr/bin/perl use Data::Dumper; use Time::Piece; my @day = qw(Sun Mon Tue Wed Thu Fri Sat); my $wiki = shift; open W, "<$wiki"; my $html = join '', ; close W; my %item; my $max; while ($html =~ /
]*)>\s*
(.+?)<\/pre>/gs) {
  my $at = $1;
  my $note = $2;

  next if ($at =~ /(systemConfig|systemServer)/); # ignore plugins

  # parse attributes
  $at =~ s/" /"\%/g;
  my @list = split /\%/, $at;

  my %tags;
  foreach my $item (@list) {
    $item =~ s/"//g;
    my($name, $val) = split /=/, $item, 2;
    $val =~ s/"/"/g;
    $tags{$name} = $val;
  }

  next if (! exists $tags{tags}); # ignore tiddlers without attributes
  next if ($tags{title} =~ /(DefaultTiddlers|TiddlerListMacroDocumentation|StorySaverPluginInfo|ExportTiddlersPluginInfo)/);

  # used to reverse sort tiddlers
  if (exists $tags{modified}) {
    $tags{ts} = $tags{modified};
  }
  else {
    $tags{ts} = $tags{created};
  }

  # tiddler tags => org tags
  $tags{tags} =~ s/ /:/g;
  $tags{tags} = ":$tags{tags}:";

  # parse timestamp
  if ($tags{ts} =~ /^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})/) {
    my $Y = $1;
    my $M = $2;
    my $D = $3;
    my $h = $4;
    my $m = $5;

    my $tp = Time::Piece->strptime("$Y$M$D", '%Y%m%d')->wday % 7;

    $tags{timestamp} = "[$Y-$M-$D $day[$tp] $h:$m]"; # org mode ts
    $tags{tags} .= "$Y$M$D:"; # use date as tag as well
  }

  $note =~ s/^\s*\*/-/gm;        # lists
  $note =~ s/\{\{\{//g;          # code
  $note =~ s/\}\}\}//g;
  $note =~ s/''([^']*)''/*$1*/g; # bold
  $note =~ s/^!!!!/*****/gm;     # headings
  $note =~ s/^!!!/****/gm;
  $note =~ s/^!!/***/gm;
  $note =~ s/^!/**/gm;
  $note =~ s/>/>/g;           # entities
  $note =~ s/</{note} = $note;

  if (length($tags{title}) > $max) {
    $max = length($tags{title});
  }
}

# output
foreach my $title (sort { $item{$b}->{ts} <=> $item{$a}->{ts} } keys %item) {
  my $spc = " " x ($max - length($title));
  print qq(* $title $spc $item{$title}->{tags}
  :PROPERTIES:
  :Timestamp: $item{$title}->{timestamp}
  :END:

  $item{$title}->{note}
);
}