diff options
author | Jonas Smedegaard <dr@jones.dk> | 2014-12-31 17:35:06 +0100 |
---|---|---|
committer | Jonas Smedegaard <dr@jones.dk> | 2014-12-31 17:49:14 +0100 |
commit | f89b78b463c108eed766a9ea7d930043e0a457d8 (patch) | |
tree | f505a518fe868ff81d367b8f1e3e70b0492d0e6a /pandoc-todo | |
parent | 83ff019b64e25bfb4895c525ba0fcc3ae514e32a (diff) |
Mark systematic issues (and compile LaTeX explicitly: Pandoc don't detect need for 3rd round).
Diffstat (limited to 'pandoc-todo')
-rwxr-xr-x | pandoc-todo | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/pandoc-todo b/pandoc-todo new file mode 100755 index 0000000..784b8fa --- /dev/null +++ b/pandoc-todo @@ -0,0 +1,59 @@ +#!/usr/bin/perl + +# TODO: support multi-match within word +# TODO: support multi-word match +# TODO: always count and allow expressing which (default: all) +# TODO: parse regex+commeent as definition in external markdown TODO file. +# TODO: normal hyphenation within note (keep quote with word in "word") + +use warnings; +use strict; + +use feature qw(switch); +no if $] >= 5.018, warnings => "experimental::smartmatch"; + +use Pandoc::Filter 0.05; +use Pandoc::Elements; + +my $breakable_chars = qr/[\&\;\/\.\?\!\=]/; +my $hyphen_chars = qr/[\x{2010}-\x{2015}\x{2053}\x{2212}]/; +my $doublequote_chars = qr/[\x{00AB}\x{00BB}\x{201C}-\x{201F}\x{300C}-\x{300F}\x{301D}-\x{301F}\x{FE41}-\x{FE44}\x{FF02}\x{FF62}\x{FF63}]/; +my $singlequote_chars = qr/[\x{0060}\x{2018}\x{2019}\x{201A}\x{201B}\x{2039}\x{203A}\x{FF07}]/; +my $odd_singlequote_chars = qr/[\x{2019}]/; + +pandoc_filter( + \&todo, +); + +sub latex_encode { + my $s = shift; + $s =~ s/(?<!\s|$breakable_chars)($breakable_chars])(?!\s)/$1\\-/g; + $s =~ s/$odd_singlequote_chars/'/g; #' + return $s; +} + +sub mark_inside { + my ( $before, $it, $after, $note ) = @_; + return [ RawInline( 'latex', sprintf( '%s\\todo{%s}\\hl{%s}%s', + latex_encode($before), + latex_encode($note), + latex_encode($it), + latex_encode($after), + ))]; +}; + +sub todo { + my $self = shift; + return unless ( $self->name eq 'Str' ); + given ($self->content) { + when (/^(-)$/) { + return mark_inside( '', $1, '', 'double dash?' ) }; + when ( /^(.*?)($hyphen_chars(?:.*$hyphen_chars)?)(.*?)$/ ) { + return mark_inside( $1, $2, $3, 'bad dash/hyphen' ) }; + when ( /^(.*?)($doublequote_chars(?:.*$doublequote_chars)?)(.*?)$/ ) { + return mark_inside( $1, $2, $3, 'bad quote' ) }; + when ( /^(.*?)($singlequote_chars(?:.*$singlequote_chars)?)(.*?)$/ ) { + return mark_inside( $1, $2, $3, 'Bad quote/apostrophe' ) }; + default { return }; + } +}; |