Added .include functionality to block elements (paragraph, pre, code). In the case of the former, the given file is fully parsed and all parsed elements are inserted in the place of the calling block element. In the case of the latter block elements, the file is included but not parsed. Options/formatters are now hashes rather than var=value strings.
parent
72761033d0
commit
17d095e78d
99
kettext.pm
99
kettext.pm
|
|
@ -23,6 +23,12 @@ sub parseFile {
|
||||||
my @elements = (); # our list of ALL distinct elements
|
my @elements = (); # our list of ALL distinct elements
|
||||||
my %block = (); # some block of data, such as paragraph, pre, etc.
|
my %block = (); # some block of data, such as paragraph, pre, etc.
|
||||||
my %settings = ();
|
my %settings = ();
|
||||||
|
# get dirname for includes
|
||||||
|
my $dir_name = $file_name;
|
||||||
|
$dir_name =~ s/\/(.*)$/\//g;
|
||||||
|
if ($dir_name eq $file_name) {
|
||||||
|
$dir_name = "./";
|
||||||
|
}
|
||||||
# create file handler and read into @lines
|
# create file handler and read into @lines
|
||||||
binmode STDOUT, ":utf8";
|
binmode STDOUT, ":utf8";
|
||||||
use utf8;
|
use utf8;
|
||||||
|
|
@ -49,16 +55,41 @@ sub parseFile {
|
||||||
# code
|
# code
|
||||||
if ($2 eq '#') {
|
if ($2 eq '#') {
|
||||||
if (!%block) {
|
if (!%block) {
|
||||||
if ($3 =~ m/^([^\s]*)(\..*\)(\s|))(.*)/) {
|
#if ($3 =~ m/^([^\s]*)(\..*\)(\s|))(.*)/) {
|
||||||
%block = (type => TYPE_CODE, text => $3, opts => parseOptions($2));
|
if ($3 =~ m/^(\..*?\)(?:\s|\n|))(.*?)/) {
|
||||||
|
%block = (type => TYPE_CODE, text => $2, opts => parseOptions($1));
|
||||||
|
if (exists ${$block{'opts'}}{'include'}) {
|
||||||
|
my $include = $dir_name.${$block{'opts'}}{'include'};
|
||||||
|
if (open(my $fh, '<:encoding(UTF-8)', $include)) {
|
||||||
|
while (my $row = <$fh>) {
|
||||||
|
chomp $row;
|
||||||
|
$block{'text'} .= "$row\n";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
print $file_name;
|
||||||
|
$block{'text'} .= "Could not read ".$include."\n";
|
||||||
|
}
|
||||||
|
delete ${$block{'opts'}}{'include'};
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
%block = (type => TYPE_CODE, text => $3);
|
%block = (type => TYPE_CODE, text => $3);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if ($block{"type"} != TYPE_CODE) {
|
if ($block{"type"} != TYPE_CODE) {
|
||||||
push @elements, {%block};
|
push @elements, {%block};
|
||||||
if ($3 =~ m/^([^\s*])(\..*\)(\s|))(.*)/) {
|
if ($3 =~ m/^(\..*?\)(?:\s|\n|))(.*?)/) {
|
||||||
%block = (type => TYPE_CODE, text => $3, opts => parseOptions($2));
|
%block = (type => TYPE_CODE, text => $3, opts => parseOptions($2));
|
||||||
|
if (${$block{'opts'}}{'include'}) {
|
||||||
|
if (open(my $fh, '<:encoding(UTF-8)', ${$block{'opts'}}{'include'})) {
|
||||||
|
while (my $row = <$fh>) {
|
||||||
|
chomp $row;
|
||||||
|
$block{'text'} .= "$row\n";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$block{'text'} .= "Could not read ".${$block{'opts'}}{'include'}."\n";
|
||||||
|
}
|
||||||
|
delete ${$block{'opts'}}{'include'};
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
%block = (type => TYPE_CODE, text => $3);
|
%block = (type => TYPE_CODE, text => $3);
|
||||||
}
|
}
|
||||||
|
|
@ -110,6 +141,19 @@ sub parseFile {
|
||||||
if (!%block) {
|
if (!%block) {
|
||||||
if ($2 eq '.' && $3 =~ m/^(.*\)(\s|))(.*)/) {
|
if ($2 eq '.' && $3 =~ m/^(.*\)(\s|))(.*)/) {
|
||||||
%block = (type => TYPE_PRE, text => $3, opts => parseOptions('.'.$1));
|
%block = (type => TYPE_PRE, text => $3, opts => parseOptions('.'.$1));
|
||||||
|
if (exists ${$block{'opts'}}{'include'}) {
|
||||||
|
my $include = $dir_name.${$block{'opts'}}{'include'};
|
||||||
|
if (open(my $fh, '<:encoding(UTF-8)', $include)) {
|
||||||
|
while (my $row = <$fh>) {
|
||||||
|
chomp $row;
|
||||||
|
$block{'text'} .= "$row\n";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
print $file_name;
|
||||||
|
$block{'text'} .= "Could not read ".$include."\n";
|
||||||
|
}
|
||||||
|
delete ${$block{'opts'}}{'include'};
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
%block = (type => TYPE_PRE, text => $2.$3);
|
%block = (type => TYPE_PRE, text => $2.$3);
|
||||||
}
|
}
|
||||||
|
|
@ -118,6 +162,19 @@ sub parseFile {
|
||||||
push @elements, {%block}; %block=();
|
push @elements, {%block}; %block=();
|
||||||
if ($2 eq '.' && $3 =~ m/^(.*\)(\s|))(.*)/) {
|
if ($2 eq '.' && $3 =~ m/^(.*\)(\s|))(.*)/) {
|
||||||
%block = (type => TYPE_PRE, text => $3, opts => parseOptions('.'.$1));
|
%block = (type => TYPE_PRE, text => $3, opts => parseOptions('.'.$1));
|
||||||
|
if (exists ${$block{'opts'}}{'include'}) {
|
||||||
|
my $include = $dir_name.${$block{'opts'}}{'include'};
|
||||||
|
if (open(my $fh, '<:encoding(UTF-8)', $include)) {
|
||||||
|
while (my $row = <$fh>) {
|
||||||
|
chomp $row;
|
||||||
|
$block{'text'} .= "$row\n";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
print $file_name;
|
||||||
|
$block{'text'} .= "Could not read ".$include."\n";
|
||||||
|
}
|
||||||
|
delete ${$block{'opts'}}{'include'};
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
%block = (type => TYPE_PRE, text => $2.$3);
|
%block = (type => TYPE_PRE, text => $2.$3);
|
||||||
}
|
}
|
||||||
|
|
@ -250,6 +307,13 @@ sub parseFile {
|
||||||
if (!%block) {
|
if (!%block) {
|
||||||
if ($lines[$i] =~ m/^(\..*\)(\s|))(.*)/) {
|
if ($lines[$i] =~ m/^(\..*\)(\s|))(.*)/) {
|
||||||
%block = (type => TYPE_PARAGRAPH, text => $2, opts => parseOptions($1));
|
%block = (type => TYPE_PARAGRAPH, text => $2, opts => parseOptions($1));
|
||||||
|
if (${$block{'opts'}}{'include'}) {
|
||||||
|
my %sub_file = kettext::parseFile($dir_name.${$block{'opts'}}{'include'}, \%cmd_settings);
|
||||||
|
for my $i (0 .. $#{$sub_file{'elements'}}) {
|
||||||
|
push @elements, ${$sub_file{'elements'}}[$i];
|
||||||
|
}
|
||||||
|
delete ${$block{'opts'}}{'include'};
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
%block = (type => TYPE_PARAGRAPH, text => $lines[$i]);
|
%block = (type => TYPE_PARAGRAPH, text => $lines[$i]);
|
||||||
}
|
}
|
||||||
|
|
@ -328,11 +392,11 @@ sub parseFile {
|
||||||
}
|
}
|
||||||
sub parseOptions {
|
sub parseOptions {
|
||||||
my $text = $_[0];
|
my $text = $_[0];
|
||||||
my $opts;
|
my %opts = ();
|
||||||
while ($text =~ m/(\.)([a-zA-Z]*[^\(])(\()([^\)]*)/g) {
|
while ($text =~ m/(\.)([a-zA-Z]*[^\(])(\()([^\)]*)/g) {
|
||||||
$opts.=" $2=\"$4\"";
|
$opts{$2} = $4;
|
||||||
}
|
}
|
||||||
return $opts;
|
return \%opts;
|
||||||
}
|
}
|
||||||
|
|
||||||
package kettext::convertTo;
|
package kettext::convertTo;
|
||||||
|
|
@ -373,7 +437,7 @@ sub HTML {
|
||||||
if ($_->{type} == kettext::TYPE_HEADER) {
|
if ($_->{type} == kettext::TYPE_HEADER) {
|
||||||
my $hid = $_->{text};
|
my $hid = $_->{text};
|
||||||
$hid =~ s/ /_/g;
|
$hid =~ s/ /_/g;
|
||||||
print("<h$_->{hsize}".($_->{opts} ? $_->{opts} : '').($settings{'header.ids'} ? " id=\"".$hid."\"" : '').">".convertText($_->{text})."</h$_->{hsize}>\n");
|
print("<h$_->{hsize}".($_->{opts} ? convertOpts($_->{opts}) : '').($settings{'header.ids'} ? " id=\"".$hid."\"" : '').">".convertText($_->{text})."</h$_->{hsize}>\n");
|
||||||
} elsif ($_->{type} == kettext::TYPE_BREAK) {
|
} elsif ($_->{type} == kettext::TYPE_BREAK) {
|
||||||
if ($previous_type == kettext::TYPE_BREAK) {
|
if ($previous_type == kettext::TYPE_BREAK) {
|
||||||
print("<br />\n");
|
print("<br />\n");
|
||||||
|
|
@ -381,13 +445,13 @@ sub HTML {
|
||||||
} elsif ($_->{type} == kettext::TYPE_PARAGRAPH) {
|
} elsif ($_->{type} == kettext::TYPE_PARAGRAPH) {
|
||||||
my $text = convertText($_->{text});
|
my $text = convertText($_->{text});
|
||||||
$text =~ s/\n/<br>\n/g;
|
$text =~ s/\n/<br>\n/g;
|
||||||
print("<p".($_->{opts} ? $_->{opts} : '').">$text</p>\n");
|
print("<p".($_->{opts} ? convertOpts($_->{opts}) : '').">$text</p>\n");
|
||||||
} elsif ($_->{type} == kettext::TYPE_PRE) {
|
} elsif ($_->{type} == kettext::TYPE_PRE) {
|
||||||
print("<pre".($_->{opts} ? $_->{opts} : '').">$_->{text}</pre>\n");
|
print("<pre".($_->{opts} ? convertOpts($_->{opts}) : '').">$_->{text}</pre>\n");
|
||||||
} elsif ($_->{type} == kettext::TYPE_CODE) {
|
} elsif ($_->{type} == kettext::TYPE_CODE) {
|
||||||
print("<pre><code".($_->{opts} ? $_->{opts} : '').">$_->{text}</code></pre>\n");
|
print("<pre><code".($_->{opts} ? convertOpts($_->{opts}) : '').">$_->{text}</code></pre>\n");
|
||||||
} elsif ($_->{type} == kettext::TYPE_BLOCKQUOTE) {
|
} elsif ($_->{type} == kettext::TYPE_BLOCKQUOTE) {
|
||||||
print("<blockquote".($_->{opts} ? $_->{opts} : '').">".($settings{'blockquote.parse'} ? convertText($_->{text}) : $_->{text})."</blockquote>\n");
|
print("<blockquote".($_->{opts} ? convertOpts($_->{opts}) : '').">".($settings{'blockquote.parse'} ? convertText($_->{text}) : $_->{text})."</blockquote>\n");
|
||||||
} elsif ($_->{type} == kettext::TYPE_SPACER) {
|
} elsif ($_->{type} == kettext::TYPE_SPACER) {
|
||||||
print("<hr />\n");
|
print("<hr />\n");
|
||||||
} elsif ($_->{type} == kettext::TYPE_LIST) {
|
} elsif ($_->{type} == kettext::TYPE_LIST) {
|
||||||
|
|
@ -455,7 +519,7 @@ sub HTML {
|
||||||
if ($4) {
|
if ($4) {
|
||||||
my $ts = substr($media[0], 0, -1);
|
my $ts = substr($media[0], 0, -1);
|
||||||
my $te = substr($media[0], -1);
|
my $te = substr($media[0], -1);
|
||||||
$converted_text = $ts.kettext::parseOptions($4).$te.$media[1];
|
$converted_text = $ts.convertOpts(kettext::parseOptions($4)).$te.$media[1];
|
||||||
} else {
|
} else {
|
||||||
$converted_text = $media[0].$media[1];
|
$converted_text = $media[0].$media[1];
|
||||||
}
|
}
|
||||||
|
|
@ -464,7 +528,7 @@ sub HTML {
|
||||||
if ($4) {
|
if ($4) {
|
||||||
my $ts = substr($text_replace[$i], 0, -1);
|
my $ts = substr($text_replace[$i], 0, -1);
|
||||||
my $te = substr($text_replace[$i], -1);
|
my $te = substr($text_replace[$i], -1);
|
||||||
$converted_text = $ts.kettext::parseOptions($4).$te.$2.$text_replace[$i+1];
|
$converted_text = $ts.convertOpts(kettext::parseOptions($4)).$te.$2.$text_replace[$i+1];
|
||||||
} else {
|
} else {
|
||||||
$converted_text = $text_replace[$i].$2.$text_replace[$i+1];
|
$converted_text = $text_replace[$i].$2.$text_replace[$i+1];
|
||||||
}
|
}
|
||||||
|
|
@ -494,6 +558,15 @@ sub HTML {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
sub convertOpts {
|
||||||
|
my $opts = $_[0];
|
||||||
|
my $string = "";
|
||||||
|
keys %{$opts};
|
||||||
|
while (my ($key, $value) = each %{$opts}) {
|
||||||
|
$string .= " $key=\"$value\"";
|
||||||
|
}
|
||||||
|
return $string;
|
||||||
|
}
|
||||||
# 2. check for (http(s)://)(www.)youtube/youtu.be/vimeo/etc.
|
# 2. check for (http(s)://)(www.)youtube/youtu.be/vimeo/etc.
|
||||||
my @media = urlToMedia($text);
|
my @media = urlToMedia($text);
|
||||||
if (!$media[0] eq "") { #"http://..."
|
if (!$media[0] eq "") { #"http://..."
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,23 @@
|
||||||
This file includes "spacer.ktx"
|
This file includes "spacer.ktx" using the following line:
|
||||||
|
|
||||||
.include(spacer.ktx).imply(header.depth=1,version.hide)
|
,,,,,,,,,,,,,,,,,,,,,,,,
|
||||||
|
Code include
|
||||||
|
````````````````````````
|
||||||
|
# .include(spacer.ktx)
|
||||||
|
|
||||||
|
#.include(spacer.ktx)
|
||||||
|
|
||||||
|
,,,,,,,,,,,,,,,,,,,,,,,,
|
||||||
|
Pre include
|
||||||
|
````````````````````````
|
||||||
|
.include(spacer.ktx)
|
||||||
|
|
||||||
|
.include(spacer.ktx)
|
||||||
|
|
||||||
|
,,,,,,,,,,,,,,,,,,,,,,,,
|
||||||
|
Paragraph include
|
||||||
|
````````````````````````
|
||||||
|
.include(spacer.ktx)
|
||||||
|
|
||||||
|
.include(spacer.ktx)
|
||||||
|
Yes.
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue