-
-
-
-
diff --git a/lib/Hitomi.pm b/lib/Hitomi.pm
deleted file mode 100644
index 4ff145d..0000000
--- a/lib/Hitomi.pm
+++ /dev/null
@@ -1,7 +0,0 @@
-use v6;
-
-use Hitomi::XMLParser;
-use Hitomi::Markup;
-
-class Hitomi::DocType::HTML5 {
-}
diff --git a/lib/Hitomi/Attrs.pm b/lib/Hitomi/Attrs.pm
deleted file mode 100644
index 65ccb69..0000000
--- a/lib/Hitomi/Attrs.pm
+++ /dev/null
@@ -1,4 +0,0 @@
-use v6;
-
-class Hitomi::Attrs {
-}
diff --git a/lib/Hitomi/HTMLParser.pm b/lib/Hitomi/HTMLParser.pm
deleted file mode 100644
index f9a7349..0000000
--- a/lib/Hitomi/HTMLParser.pm
+++ /dev/null
@@ -1,9 +0,0 @@
-use v6;
-
-class Hitomi::HTMLParser {
- # RAKUDO: https://trac.parrot.org/parrot/ticket/536 makes the method
- # override the global 'list' sub if we call it 'list'
- method llist() {
- return ();
- }
-}
diff --git a/lib/Hitomi/Input.pm b/lib/Hitomi/Input.pm
deleted file mode 100644
index 2a0c6e3..0000000
--- a/lib/Hitomi/Input.pm
+++ /dev/null
@@ -1,11 +0,0 @@
-use v6;
-
-use Hitomi::Stream;
-use Hitomi::XMLParser;
-
-class ParseError {
-}
-
-sub XML($text) {
- return Hitomi::Stream.new(@(Hitomi::XMLParser.new($text)));
-}
diff --git a/lib/Hitomi/Interpolation.pm b/lib/Hitomi/Interpolation.pm
deleted file mode 100644
index 99f7cb2..0000000
--- a/lib/Hitomi/Interpolation.pm
+++ /dev/null
@@ -1,41 +0,0 @@
-use Hitomi::StreamEventKind;
-
-grammar Hitomi::Interpolation::Grammar {
- regex TOP { ^ * $ }
- regex chunk { || }
-
- regex plain { [ .]+ }
- regex expr { '$' [ | ] }
-
- regex ident { <.alpha> \w* }
- regex identifier { <.ident> [ <.apostrophe> <.ident> ]* }
- token apostrophe { <[ ' \- ]> }
-
- regex block { '{' '}' }
- regex content { <-[{}]>+ }
-}
-
-# Note: It _is_ possible for the above grammar to fail, even though it's
-# probably not very desirable that it can. An example of a failing
-# input is '$'. The way to fix this would likely be (1) see what
-# Genshi does about broken input, (2) write Hitomi tests to do the
-# same, (3) improve the grammar.
-
-sub interpolate($text, $filepath, $lineno = -1, $offset = 0,
- $lookup = 'strict') {
-
- # TODO: Make it impossible to fail here. See the above note.
- return $text
- unless Hitomi::Interpolation::Grammar.parse($text);
-
- return gather for @($ // []) -> $chunk {
- my $pos = [$filepath, $lineno, $offset];
- if $chunk -> $plain {
- take [Hitomi::StreamEventKind::text, ~$plain, $pos];
- }
- elsif $chunk -> $expr {
- my $data = $expr ?? $expr !! $expr;
- take [Hitomi::StreamEventKind::expr, ~$data, $pos];
- }
- }
-}
diff --git a/lib/Hitomi/Markup.pm b/lib/Hitomi/Markup.pm
deleted file mode 100644
index 4031237..0000000
--- a/lib/Hitomi/Markup.pm
+++ /dev/null
@@ -1,122 +0,0 @@
-use Hitomi::Stream;
-use Hitomi::XMLParser;
-use Hitomi::Interpolation;
-
-class Hitomi::Context {
- # I see from the Genshi source that %!vars will eventually be replaced by
- # @!frames. This suffices for now.
- has %!vars;
-
- method new(*%nameds, *@pairs) {
- my %vars = %nameds;
- for @pairs {
- %vars{.key} = .value;
- }
- return self.bless(*, :%vars);
- }
-
- method get($thing is copy) {
- if $thing ~~ /^ '$'/ {
- $thing .= substr(1);
- }
- %!vars{$thing};
- }
-}
-
-class Hitomi::Template {
- has $!source;
- has $!filepath;
- has $!filename;
- has $!loader;
- has $!encoding;
- has $!lookup;
- has $!allow_exec;
- has $!stream;
-
- submethod BUILD(:$source, :$filepath, :$filename, :$loader,
- :$encoding, :$lookup, :$allow_exec) {
-
- $!source = $source;
- $!filepath = $filepath;
- $!filename = $filename;
- $!loader = $loader;
- $!encoding = $encoding;
- $!loader = $loader;
- $!allow_exec = $allow_exec;
-
- $!filepath //= $!filename;
-
- $!stream = self._parse($!source, $!encoding);
- }
-
- method new($source, $filepath?, $filename?, $loader?,
- $encoding?, $lookup = 'strict', $allow_exec = True) {
- self.bless(*,
- :$source, :$filepath, :$filename, :$loader,
- :$encoding, :$lookup, :$allow_exec);
- }
-
- method _parse($source, $encoding) {
- ...
- }
-
- method generate(*%nameds, *@pairs) {
- my $context = Hitomi::Context.new(|%nameds, |@pairs);
- return self._flatten($!stream, $context);
- }
-
- method _flatten($stream, $context) {
- my @newstream = gather for $stream.llist -> $event {
- my ($kind, $data, $pos) = @($event);
- if ($kind ~~ Hitomi::StreamEventKind::expr) {
- take [Hitomi::StreamEventKind::text,
- self._eval($data, $context),
- $pos];
- }
- else {
- take [$kind, $data, $pos];
- }
- };
- return Hitomi::Stream.new(@newstream);
- }
-
- method _eval($data, $context) {
- # Well, this works for expressions which consist of one variable
- # and nothing more. Will expand later.
- $context.get($data);
- }
-}
-
-class Hitomi::MarkupTemplate is Hitomi::Template {
- submethod BUILD(:$!source, :$!filepath, :$!filename, :$!loader,
- :$!encoding, :$!lookup, :$!allow_exec) {
- }
-
- method _parse($source is copy, $encoding) {
- if $source !~~ Hitomi::Stream {
- $source = Hitomi::XMLParser.new($source, $!filename, $encoding);
- }
-
- my @stream;
-
- for $source.llist -> @event {
- my ($kind, $data, $pos) = @event;
-
- if $kind ~~ Hitomi::StreamEventKind::text {
- @stream.push:
- interpolate($data, $!filepath, $pos[1], $pos[2], $!lookup);
- }
- else {
- @stream.push( [$kind, $data, $pos] );
- }
- }
-
- return Hitomi::Stream.new(@stream);
- }
-}
-
-class Hitomi::Markup {
- method new($text) {
- return self.bless(*, :$text);
- }
-}
diff --git a/lib/Hitomi/Output.pm b/lib/Hitomi/Output.pm
deleted file mode 100644
index c794931..0000000
--- a/lib/Hitomi/Output.pm
+++ /dev/null
@@ -1,50 +0,0 @@
-use Hitomi::StreamEventKind;
-
-sub escape($text, :$quotes = True) {
- $text; # TODO
-}
-
-class Hitomi::XMLSerializer {
- has @!filters;
-
- method serialize($stream) {
- return join '', [~] gather for $stream.llist {
- my ($kind, $data, $pos) = @($_);
- if ($kind ~~ Hitomi::StreamEventKind::start
- | Hitomi::StreamEventKind::empty) {
- my ($tag, $attribs) = @($data);
- take '<';
- take $tag;
- for @($attribs) -> $attrib {
- my ($attr, $value) = @($attrib);
- take for ' ', $attr, q[="], escape($value), q["];
- }
- take $kind ~~ Hitomi::StreamEventKind::empty ?? '/>' !! '>';
- }
- elsif ($kind ~~ Hitomi::StreamEventKind::end) {
- take sprintf '%s>', $data;
- }
- else { # TODO More types
- take escape($data, :!quotes);
- }
- }
- }
-}
-
-class Hitomi::XHTMLSerializer is Hitomi::XMLSerializer {
-}
-
-class Hitomi::HTMLSerializer {
-}
-
-class Hitomi::TextSerializer {
-}
-
-sub get_serializer($method, *%_) {
- my $class = ( :xml( Hitomi::XMLSerializer),
- :xhtml( Hitomi::XHTMLSerializer),
- :html( Hitomi::HTMLSerializer),
- :text( Hitomi::TextSerializer) ){$method.lc};
- return $class.new(|%_);
-}
-
diff --git a/lib/Hitomi/Stream.pm b/lib/Hitomi/Stream.pm
deleted file mode 100644
index af15e55..0000000
--- a/lib/Hitomi/Stream.pm
+++ /dev/null
@@ -1,43 +0,0 @@
-use v6;
-use Hitomi::StreamEventKind;
-use Hitomi::Output;
-
-class Hitomi::Stream {
- has @!events;
- has $serializer;
-
- multi method new(@events, $serializer?) {
- return self.new(
- :events(@events),
- :serializer($serializer // Hitomi::XHTMLSerializer.new())
- );
- }
-
- # RAKUDO: We shouldn't have to provide this method. It should be handed
- # to us by C
';
- my @events = (HTMLParser.new($text)).llist;
- my ($kind, $data, $pos) = @events[0];
- is Hitomi::StreamEventKind::start, $kind, 'got a start event';
- $data //= [*, {}];
- is "\x[a0]", $data[1], 'the entity was turned into a character';
- $kind, $data, $pos = @events[1];
- is Hitomi::StreamEventKind::end, $kind, 'got an end event';
-}
-
-{ # test_html_entity_in_text
- my $text = '
';
- my @events = (HTMLParser.new($text)).llist;
- my ($kind, $data, $pos) = @events[1];
- is Hitomi::StreamEventKind::text, $kind, 'got a text event';
- is "\x[a0]", $data, 'the entity was turned into a character';
-}
-
-{ # test_processing_instruction
- my $text = '';
- my @events = (HTMLParser.new($text)).llist;
- my ($kind, $td, $pos) = @events[0];
- my ($target, $data) = $td;
- is Hitomi::StreamEventKind::pi, $kind, 'got a pi event';
- is 'php', $target, 'the target is "php"';
- is 'echo "Foobar"', $data, q[the data is 'echo "Foobar"'];
-}
-
-{ # test_xmldecl
- my $text = '';
- my @events = (HTMLParser.new($text)).llist;
- my ($kind, $data, $pos) = @events[0];
- my ($version, $encoding, $standalone) = $data;
- is Hitomi::StreamEventKind::xml-decl, $kind, 'got an xml-decl event';
- is '1.0', $version, 'the version is 1.0';
- ok !defined $encoding, 'no encoding';
- is -1, $standalone, 'not standalone';
-}
-
-{ # test_xmldecl_encoding
- my $text = '';
- my @events = (HTMLParser.new($text)).llist;
- my ($kind, $data, $pos) = @events[0];
- my ($version, $encoding, $standalone) = $data;
- is Hitomi::StreamEventKind::xml-decl, $kind, 'got an xml-decl event';
- is '1.0', $version, 'the version is 1.0';
- is 'utf-8', $encoding, 'the encoding is "utf-8"';
- is -1, $standalone, 'not standalone';
-}
-
-{ # test_xmldecl_standalone
- my $text = '';
- my @events = (HTMLParser.new($text)).llist;
- my ($kind, $data, $pos) = @events[0];
- my ($version, $encoding, $standalone) = $data;
- is Hitomi::StreamEventKind::xml-decl, $kind, 'got an xml-decl event';
- is '1.0', $version, 'the version is 1.0';
- ok !defined $encoding, 'no encoding';
- is 1, $standalone, 'standalone';
-}
-
-{ # test_processing_instruction_trailing_qmark
- my $text = '';
- my @events = (HTMLParser.new($text)).llist;
- my ($kind, $dt, $pos) = @events[0];
- my ($target, $data) = $dt;
- is Hitomi::StreamEventKind::pi, $kind, 'got a pi event';
- is 'php', $target, 'the target is "php"';
- is 'echo "Foobar" ?', $data, 'the data has one final "?"';
-}
-
-{ # test_out_of_order_tags
- my $text = 'Foobar';
- my @events = (HTMLParser.new($text)).llist;
- is 5, +@events, 'got 5 events';
- @events ||= [] xx 5;
- is [Hitomi::StreamEventKind::start, ['span', []]], @events[0][0,1], 'o1[1]';
- is [Hitomi::StreamEventKind::start, ['b', []]], @events[1][0,1], 'o1[2]';
- is [Hitomi::StreamEventKind::text, ['Foobar' ]], @events[2][0,1], 'o1[3]';
- is [Hitomi::StreamEventKind::end, ['b', ]], @events[3][0,1], 'o1[4]';
- is [Hitomi::StreamEventKind::end, ['span', ]], @events[4][0,1], 'o1[5]';
-}
-
-{ # test_out_of_order_tags2
- my $text = 'Foobar';
- my @events = (HTMLParser.new($text)).llist;
- is 7, +@events, 'got 7 events';
- @events ||= [] xx 7;
- is [Hitomi::StreamEventKind::start, ['span', Attrs.new(:class)]],
- @events[0][0,1], 'o2[1]';
- is [Hitomi::StreamEventKind::start, ['b', []]], @events[1][0,1], 'o2[2]';
- is [Hitomi::StreamEventKind::start, ['i', []]], @events[2][0,1], 'o2[3]';
- is [Hitomi::StreamEventKind::text, ['Foobar' ]], @events[3][0,1], 'o2[4]';
- is [Hitomi::StreamEventKind::end, ['i', ]], @events[4][0,1], 'o2[5]';
- is [Hitomi::StreamEventKind::end, ['b', ]], @events[5][0,1], 'o2[6]';
- is [Hitomi::StreamEventKind::end, ['span', ]], @events[6][0,1], 'o2[7]';
-}
-
-{ # test_out_of_order_tags3
- my $text = 'Foobar';
- my @events = (HTMLParser.new($text)).llist;
- is 5, +@events, 'got 5 events';
- @events ||= [] xx 5;
- is [Hitomi::StreamEventKind::start, ['span', []]], @events[0][0,1], 'o3[1]';
- is [Hitomi::StreamEventKind::start, ['b', []]], @events[1][0,1], 'o3[2]';
- is [Hitomi::StreamEventKind::text, ['Foobar' ]], @events[2][0,1], 'o3[3]';
- is [Hitomi::StreamEventKind::end, ['b', ]], @events[3][0,1], 'o3[4]';
- is [Hitomi::StreamEventKind::end, ['span', ]], @events[4][0,1], 'o3[5]';
-}
-
-{ # test_hex_charref
- my $text = ''';
- my @events = (HTMLParser.new($text)).llist;
- is 3, +@events, 'got 3 events';
- @events ||= [] xx 3;
- is [Hitomi::StreamEventKind::start, ['span', []]], @events[0][0,1], 'hc[1]';
- is [Hitomi::StreamEventKind::text, ["'" ]], @events[1][0,1], 'hc[2]';
- is [Hitomi::StreamEventKind::end, ['span' ]], @events[2][0,1], 'hc[3]';
-}
diff --git a/t/hitomi/06-markup.t b/t/hitomi/06-markup.t
deleted file mode 100644
index 027e887..0000000
--- a/t/hitomi/06-markup.t
+++ /dev/null
@@ -1,252 +0,0 @@
-use v6;
-
-# Copyright (C) 2006 Edgewall Software
-# All rights reserved.
-#
-# This software is licensed as described in the file licences/genshi/COPYING,
-# which you should have received as part of this distribution. The terms
-# are also available at http://genshi.edgewall.org/wiki/License.
-
-use Test;
-plan 22;
-
-use Hitomi::Stream;
-use Hitomi::Markup;
-use Hitomi::Input;
-
-constant Stream = Hitomi::Stream;
-constant MarkupTemplate
- = Hitomi::MarkupTemplate;
-constant Markup = Hitomi::Markup;
-
-## MarkupTemplateTestCase - Tests for markup template processing.
-
-{ # test_parse_string
- my $string = ' ${$var} $var';
- my $tmpl = MarkupTemplate.new($string);
- is ' 42 42',
- ~$tmpl.generate(:var(42)),
- 'markup from a string';
-}
-
-skip(1);
-# skip: unknown error in MarkupTemplate.new($stream)
-##{ # test_parse_stream
-## my Stream $stream = XML(' ${$var} $var');
-## my $tmpl = MarkupTemplate.new($stream);
-## is ' 42 42', ~$tmpl.generate(:var(42)), 'markup from a stream';
-##}
-
-skip(1);
-# skip: unknown error in MarkupTemplate.new($stream)
-##{ # test_pickle
-## # Not sure how we will want to do this.
-## my Stream $stream = XML('$var');
-## my $tmpl = MarkupTemplate.new($stream);
-## my $buf = $tmpl.perl;
-## my $unpickled = eval($buf);
-## is '42', ~$unpickled.?generate(:var(42)),
-## 'template survives pickling';
-##}
-
-{ # test_interpolate_mixed3
- my $tmpl = MarkupTemplate.new(' ${$var} $var');
- is ' 42 42', ~$tmpl.generate(:var(42)), 'mixed interpolation';
-}
-
-todo('not implemented yet', 2);
-{ # test_interpolate_leading_trailing_space
- my $tmpl = MarkupTemplate.new('${ $foo }');
- is 'bar', ~$tmpl.generate(:foo), 'leading/trailing space';
-}
-
-{ # test_interpolate_multiline
- my $tmpl = MarkupTemplate.new(q[${(
- bar => 'baz'
- ).hash{$foo}}]);
- is 'baz', ~$tmpl.generate(:foo), 'interpolate multiline';
-}
-
-skip(1);
-##{ # test_interpolate_non_string_attrs
-## my $tmpl = MarkupTemplate.new('');
-## is '', ~$tmpl.generate(), 'interpolate non-string attrs';
-##}
-
-todo('not implemented', 1);
-{ # test_interpolate_list_result
- my $tmpl = MarkupTemplate.new('@foo');
- is 'buzz', ~$tmpl.generate('@foo' => ['buzz']),
- 'interpolate lists';
-}
-
-skip(1);
-##{ # test_empty_attr
-## my $tmpl = MarkupTemplate.new('');
-## is '', ~$tmpl.generate(), 'empty attribute';
-##}
-
-skip(1);
-##{ # test_empty_attr_interpolated
-## my $tmpl = MarkupTemplate.new('');
-## is '', ~$tmpl.generate(:attr<>), 'empty attr, interpolated';
-##}
-
-todo('not implemented', 3);
-{ # test_bad_directive_error
- my $xml
- = '';
- my $died = True;
- try {
- my $tmpl = MarkupTemplate.new($xml, :filename);
- $died = False;
- }
- # RAKUDO: When we have CATCH, we will want to check the error type here
- ok $died, 'error on bad directive';
- # self.assertEqual('test.html', e.filename)
- # self.assertEqual(1, e.lineno)
-}
-
-{ # test_directive_value_syntax_error
- my $xml = q[];
- my $died = True;
- try {
- my $tmpl = MarkupTemplate.new($xml, :filename).generate();
- $died = False;
- }
- # RAKUDO: When we have CATCH, we will want to check the error type here
- ok $died, 'error on bad directive';
- # self.assertEqual('test.html', e.filename)
- # self.assertEqual(1, e.lineno)
-}
-
-{ # test_expression_syntax_error
- my $xml = q[
- Foo ${bar"}
-
];
- my $died = True;
- try {
- my $tmpl = MarkupTemplate.new($xml, :filename);
- $died = False;
- }
- # RAKUDO: When we have CATCH, we will want to check the error type here
- ok $died, 'template syntax error';
- # self.assertEqual('test.html', e.filename)
- # self.assertEqual(2, e.lineno)
-}
-
-{ # test_expression_syntax_error_multi_line
- my $xml = q[
-
- ${bar"}
-
-
];
- my $died = True;
- try {
- my $tmpl = MarkupTemplate.new($xml, :filename);
- $died = False;
- }
- # RAKUDO: When we have CATCH, we will want to check the error type here
- ok $died, 'template syntax error';
- # self.assertEqual('test.html', e.filename)
- # self.assertEqual(3, e.lineno)
-}
-
-skip(1);
-##{ # test_markup_noescape
-## # Verify that outputting context data that is a `Markup` instance is not
-## # escaped.
-## my $tmpl = MarkupTemplate.new(
-## '
-## $myvar
-##
');
-## is '
-## foo
-##
', ~$tmpl.generate(:myvar(Markup.new('foo'))),
-## 'no escaping of Markup variables';
-##}
-
-skip(1);
-##{ # test_text_noescape_quotes
-## # Verify that outputting context data in text nodes doesn't escape
-## # quotes.
-## my $tmpl = MarkupTemplate.new(
-## '
-## $myvar
-##
');
-## is '
-## "foo"
-##
', ~$tmpl.generate(:myvar<"foo">),
-## 'no escaping of quotes in text';
-##}
-
-skip(1);
-##{ # test_attr_escape_quotes
-## # Verify that outputting context data in attribtes escapes quotes.
-## my $tmpl = MarkupTemplate.new(
-## '
-##
-##
');
-## is '
-##
-##
', ~$tmpl.generate(:myvar<"foo">),
-## 'escaping of quotes in attrs';
-##}
-
-skip(1);
-##{ # test_directive_element
-## my $tmpl = MarkupTemplate.new(
-## '