mirror of
https://git.notmuchmail.org/git/notmuch
synced 2024-12-24 18:34:52 +01:00
103 lines
3.2 KiB
Perl
103 lines
3.2 KiB
Perl
|
#!/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;
|