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]]
+ #