aboutsummaryrefslogtreecommitdiffhomepage
path: root/devel/news2wiki.pl
diff options
context:
space:
mode:
Diffstat (limited to 'devel/news2wiki.pl')
-rwxr-xr-xdevel/news2wiki.pl102
1 files changed, 102 insertions, 0 deletions
diff --git a/devel/news2wiki.pl b/devel/news2wiki.pl
new file mode 100755
index 00000000..8066ba7f
--- /dev/null
+++ b/devel/news2wiki.pl
@@ -0,0 +1,102 @@
+#!/usr/bin/perl
+#
+# Author: Tomi Ollila
+# License: same as notmuch
+
+# This program is used to split NEWS file to separate (mdwn) files
+# for notmuch wiki. Example run:
+#
+# $ ./devel/news2wiki.pl NEWS ../notmuch-wiki/news
+#
+# In case taken into more generic use, modify these comments and examples.
+
+use strict;
+use warnings;
+
+unless (@ARGV == 2) {
+ warn "\n$0 <source-file> <destination-directory>\n\n";
+ warn "Example: ./devel/news2wiki.pl NEWS ../notmuch-wiki/news\n\n";
+ exit 1;
+}
+
+die "'$ARGV[0]': no such file\n" unless -f $ARGV[0];
+die "'$ARGV[1]': no such directory\n" unless -d $ARGV[1];
+
+open I, '<', $ARGV[0] or die "Cannot open '$ARGV[0]': $!\n";
+
+open O, '>', '/dev/null' or die $!;
+my @emptylines = ();
+my $cln;
+print "\nWriting to $ARGV[1]:\n";
+while (<I>)
+{
+ warn "$ARGV[0]:$.: tab(s) in line!\n" if /\t/;
+ warn "$ARGV[0]:$.: trailing whitespace\n" if /\s\s$/;
+ # The date part in regex recognizes wip version dates like: (201x-xx-xx).
+ if (/^Notmuch\s+(\S+)\s+\((\w\w\w\w-\w\w-\w\w)\)\s*$/) {
+ # open O... autocloses previously opened file.
+ open O, '>', "$ARGV[1]/release-$1.mdwn" or die $!;
+ print "+ release-$1.mdwn...\n";
+ print O "[[!meta date=\"$2\"]]\n\n";
+ @emptylines = ();
+ }
+
+ last if /^<!--\s*$/; # Local variables block at the end (as of now).
+
+ # Buffer "trailing" empty lines -- dropped at end of file.
+ push(@emptylines, $_), next if s/^\s*$/\n/;
+ if (@emptylines) {
+ print O @emptylines;
+ @emptylines = ();
+ }
+
+ # Convert '*' to '`*`' and "*" to "`*`" so that * is not considered
+ # as starting emphasis character there. We're a bit opportunistic
+ # there -- some single * does not cause problems and, on the other
+ # hand, this would not regognize already 'secured' *:s.
+ s/'[*]'/'`*`'/g; s/"[*]"/"`*`"/g;
+
+ # Convert nonindented lines that aren't already headers or
+ # don't contain periods (.) or '!'s to level 4 header.
+ if ( /^[^\s-]/ ) {
+ my $tbc = ! /[.!]\s/;
+ chomp;
+ my @l = $_;
+ $cln = $.;
+ while (<I>) {
+ last if /^\s*$/;
+ #$cln = 0 if /^---/ or /^===/; # used for debugging.
+ $tbc = 0 if /[.!]\s/ or /^---/ or /^===/;
+ chomp; s/^\s+//;
+ push @l, $_;
+ }
+ if ($tbc) {
+ print O "### ", (join ' ', @l), "\n";
+ }
+ else {
+ #print "$ARGV[0]:$cln: skip level 4 header conversion\n" if $cln;
+ print O (join "\n", @l), "\n";
+ }
+ @emptylines = ( "\n" );
+ next;
+ }
+
+ # Markdown doc specifies that list item may have paragraphs if those
+ # are indented by 4 spaces (or a tab) from current list item marker
+ # indentation (paragraph meaning there is empty line in between).
+ # If there is empty line and next line is not indented 4 chars then
+ # that should end the above list. This doesn't happen in all markdown
+ # implementations.
+ # In our NEWS case this problem exists in release 0.6 documentation.
+ # It can be avoided by removing 2 leading spaces in lines that are not
+ # list items and requiring all that indents are 0, 2, and 4+ (to make
+ # regexp below work).
+ # Nested lists are supported but one needs to be more careful with
+ # markup there (as the hack below works only on first level).
+
+ s/^[ ][ ]// unless /^[ ][ ](?:[\s*+-]|\d+\.)\s/;
+
+ print O $_;
+}
+print "\ndone.\n";
+close O;