diff --git a/documentation/kettext_define.ktx b/documentation/kettext_define.ktx index d30b51e..a1042bf 100644 --- a/documentation/kettext_define.ktx +++ b/documentation/kettext_define.ktx @@ -3,6 +3,7 @@ kettext... ```````````````````````````````` * **is a markup language** + * **is a perl module and script** * **is for the design-inclined programmer** * **is easy to write with** * **looks nice in a terminal** diff --git a/kettext.pm b/kettext.pm index 7a24045..12e8781 100644 --- a/kettext.pm +++ b/kettext.pm @@ -341,6 +341,24 @@ sub HTML { my @elements = @{$data{elements}}; my %settings = %{$data{settings}}; my $file_name = $data{filename}; + + our @prefixes = (["img", "image"], ["aud", "audio"], ["vid", "video"], ["yt", "youtube"], ["vimeo"], ["twitter", "tweet"]); + our @urls = ([], [], [], ["youtube.com", "youtu.be"], ["vimeo.com"], ["twitter.com"]); + our @url_parse = ( + "(.*)", + "", + "", + "(?:.*)(?:v=)([a-zA-Z0-9]*)", + "(?:.*)(?:/)([0-9)*)\$", + ""); + our @embeds = ( + ['""',''], + ['"'], + ['"'], + ['"'], + ['"'], + ["", ""]); + # print 'em out if ($settings{'toc'}) { foreach (@elements) { @@ -409,28 +427,97 @@ sub HTML { } sub convertText { my $text = $_[0]; - my @text_patterns = ('\*\*','\*\*', '\/\/','\/\/', '\[\[','\]\]', '\(\(','\)\)', '``', '``'); - my @text_replace = ('','', '','', '','', '','', '',''); + my @text_patterns = ('\*\*','\*\*', '\/\/','\/\/', '\[\[','\]\]', '\(\(','\)\)', '``', '``', '__','__'); + my @text_replace = ('','', '','', '','', '','', '','', '',''); + my @char_patterns = ('&', '<', '>', '"', '\'', '--'); + my @char_replace = ('&', '<', '>', '"', ''', '—'); my $i = 0; my $new_text = $text; + # 1. replace character(s) + #for (my $ch = 0; $ch <= $#char_patterns; $ch++) { + # if ($new_text =~ m/(([^\\])$char_patterns[$ch])/g) { + # my $bzr = $2; + # $new_text =~ s/\Q$bzr$char_patterns[$ch]\E/\Q$bzr\E$char_replace[$ch]/g; + # } + # if ($new_text =~ m/(\\)($char_patterns[$ch])/g) { + # $new_text =~ s/\\$char_patterns[$ch]/$char_patterns[$ch]/g; + # } + #} + # 2. replace character pairs for (my $p = 0; $p <= $#text_patterns; $p+=2) { my $open = $text_patterns[$p]; my $close = $text_patterns[$p+1]; while ($new_text =~ m/($open)([^$close]*)($close)(\.\S*\(.*?\)|)/g) { #while ($new_text =~ m/($open)([^$close]*)($close)(\.\S*\(.*\)|)/g) { my $converted_text; - if ($4) { - my $ts = substr($text_replace[$i], 0, -1); - my $te = substr($text_replace[$i], -1); - $converted_text = $ts.kettext::parseOptions($4).$te.$2.$text_replace[$i+1]; + if ($p == 4) { + my @media = convertLink($2); + if ($4) { + my $ts = substr($media[0], 0, -1); + my $te = substr($media[0], -1); + $converted_text = $ts.kettext::parseOptions($4).$te.$media[1]; + } else { + $converted_text = $media[0].$media[1]; + } + $new_text =~ s/\Q$1$2$3$4\E/$converted_text/g; } else { - $converted_text = $text_replace[$i].$2.$text_replace[$i+1]; + if ($4) { + my $ts = substr($text_replace[$i], 0, -1); + my $te = substr($text_replace[$i], -1); + $converted_text = $ts.kettext::parseOptions($4).$te.$2.$text_replace[$i+1]; + } else { + $converted_text = $text_replace[$i].$2.$text_replace[$i+1]; + } + $new_text =~ s/\Q$1$2$3$4\E/$converted_text/g; } - $new_text =~ s/\Q$1$2$3$4\E/$converted_text/g; } $i +=2; } return $new_text; } + sub convertLink { + my $text = $_[0]; + my $find = $text; + # 1. check for prefix such as "image:", "audio:", etc. + if ($find =~ m/^(.*?)(?::)(.*)$/) { + for (my $prefix_group = 0; $prefix_group <= $#prefixes; $prefix_group++) { + for (my $prefix = 0; $prefix <= $#{${prefixes[$prefix_group]}}; $prefix++) { + if ($1 eq ${prefixes[$prefix_group]}[$prefix]) { + my @media = urlToMedia($2); #"prefix:http://..." + if ($media[0] eq "") { # "prefix:data" + $media[0] = $2; + $media[0] =~ s/(.*)/$embeds[$prefix_group][0]/ee; + $media[1] = $embeds[$prefix_group][1]; + } + return @media; + } + } + } + } + # 2. check for (http(s)://)(www.)youtube/youtu.be/vimeo/etc. + my @media = urlToMedia($text); + if (!$media[0] eq "") { #"http://..." + return @media; + } + # 3. Finally, check file extension + + # 4. Just an anchor + return ("","$text"); + } + sub urlToMedia { + my $find = $_[0]; + if ($find =~ m/^(?:http(?:s|):\/\/(?:www.|)|)(.*)\/(.*)/) { + for (my $urls_i = 0; $urls_i <= $#urls; $urls_i++) { + for (my $url_i = 0; $url_i <= $#{${urls[$urls_i]}}; $url_i++) { + if ($1 eq ${urls[$urls_i]}[$url_i]) { + my $match = $2; + $match =~ s/$url_parse[$urls_i]/$embeds[$urls_i][0]/ee; # the ee is qqing + return ($match,$embeds[$urls_i][1]); + } + } + } + } + return ("",""); + } } 1; diff --git a/test/chars.ktx b/test/chars.ktx new file mode 100644 index 0000000..37b0956 --- /dev/null +++ b/test/chars.ktx @@ -0,0 +1,24 @@ +HTML conversions: + +Signs: < > < > < > < > +Quote: " " " " +Apostrophe: ' ' ' ' +Ampersand: & & & & +Em-dash: -- -- -- -- +---- +Escaped: + +Signs: \< \> \< \> \< \> \< \> +Quote: \" \" \" \" +Apostrophe: \' \' \' \' +Ampersand: \& \& \& \& +Em-dash: \-- \-- \-- \-- +---- +Mixed: + +Signs: \< \> < > \< \> < > +Quote: \" " \" " +Apostrophe: \' ' \' ' +Ampersand: \& & \& & +Em-dash: \-- -- \-- -- + diff --git a/test/include.ktx b/test/include.ktx new file mode 100644 index 0000000..f78e69d --- /dev/null +++ b/test/include.ktx @@ -0,0 +1,3 @@ +This file includes "spacer.ktx" + +.include(spacer.ktx).imply(header.depth=1,version.hide) diff --git a/test/media.ktx b/test/media.ktx new file mode 100644 index 0000000..165cceb --- /dev/null +++ b/test/media.ktx @@ -0,0 +1,59 @@ +Media syntax uses the anchor-style as the encapsulator for the media. This was chosen due to the logical similarity of a link relating to an external location. + +* images + +[[image:my_image.png]] + #[[image:my_image.png]] + # + +Audio and video rely on HTML5 video support. + +* audio + +[[audio:my_audio.ogg]] + #[[audio:my_audio.ogg]] + #