From f2664bb296503f85ab822e8760217101ffaa910c Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Wed, 20 Apr 2022 11:01:45 +0100 Subject: refactor --- lib/Katana/HTML/Page.rakumod | 39 +++++++++++++++++++++++++++++++++++++++ lib/Katana/HTML/Tag.rakumod | 26 ++++++++++++++++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 lib/Katana/HTML/Page.rakumod create mode 100644 lib/Katana/HTML/Tag.rakumod diff --git a/lib/Katana/HTML/Page.rakumod b/lib/Katana/HTML/Page.rakumod new file mode 100644 index 0000000..9026731 --- /dev/null +++ b/lib/Katana/HTML/Page.rakumod @@ -0,0 +1,39 @@ +use v6.d; +use Katana::HTML::Tag; +unit class Katana::HTML::Page:api<1> is export; + +has Str $!doctype = ''; +has @!body-tags is required; +has Str $!title is required; + +submethod BUILD(:@!body-tags where *.elems > 0, Str :$!title where * ne '') { } + +method generate { + my @tags; + push @tags, Tag.new: name => 'html', + params => ( + xmlns => 'http://www.w3.org/1999/xhtml', + lang => 'en', + 'xml:lang' => 'en' + ); + + push @tags, Tag.new: name => 'head', succ => @!body-tags; + push @tags, Tag.new: name => 'title', text => $!title; + + say $!doctype; + self.recurse(@tags); +} + +method recurse(@tags) { + my @sgat; # tags spelled in reverse. + for @tags -> $tag { + say $tag.open; + say $tag.text if $tag.has-text; + unshift @sgat, $tag; + } + for @sgat -> $tag { + say $tag.close unless $tag.is-mono; + self.recurse($tag.succ) if $tag.has-succ; + } +} + diff --git a/lib/Katana/HTML/Tag.rakumod b/lib/Katana/HTML/Tag.rakumod new file mode 100644 index 0000000..50d5585 --- /dev/null +++ b/lib/Katana/HTML/Tag.rakumod @@ -0,0 +1,26 @@ +use v6.d; +unit class Katana::HTML::Tag is export; + +has Str $.name; +has Str $.text; +has Str %.params; +has Bool $.is-mono = False; +has Katana::HTML::Tag @.succ; + +method has-text returns Bool { defined $.text } +method has-succ returns Bool { defined $.succ } + +method open returns Str { + return "<{$.name}{self.params} />" if $!is-mono; + return "<{$.name}{self.params}>" +} +method close returns Str { "" } + +method params returns Str { + return '' unless defined %!params; + my @params; + for %!params.kv -> $key, $val { + push @params, " $key='$val'"; + } + return @params.join; +} -- cgit v1.2.3