started doc parsing model
authorDylan Lloyd <dylan@dylansserver.com>
Mon, 5 Aug 2013 23:17:59 +0000 (19:17 -0400)
committerDylan Lloyd <dylan@dylansserver.com>
Mon, 5 Aug 2013 23:17:59 +0000 (19:17 -0400)
.gitmodules [new file with mode: 0644]
dist.ini
lib/DuckDuckDocs/Controller/Root.pm
lib/DuckDuckDocs/Model/Docs.pm [new file with mode: 0644]
lib/DuckDuckDocs/View/HTML.pm
root/css/duckduckdocs.css
root/templates/index.tx
t/model_Docs.t [new file with mode: 0644]

diff --git a/.gitmodules b/.gitmodules
new file mode 100644 (file)
index 0000000..ea5b6fe
--- /dev/null
@@ -0,0 +1,3 @@
+[submodule "sources/DuckDuckGo-Documentation"]
+       path = sources/DuckDuckGo-Documentation
+       url = git@github.com:duckduckgo/DuckDuckGo-Documentation
index b910dad..f912ee0 100644 (file)
--- a/dist.ini
+++ b/dist.ini
@@ -6,3 +6,6 @@ copyright_year   = 2013
 
 [Prereqs]
 Catalyst::View::Xslate = 0.00017
+Text::Markdown = 1.000031
+IO::All = 0.46
+HTML::Tiny = 1.05;
index 1a5a141..e49a90e 100644 (file)
@@ -1,9 +1,19 @@
 package DuckDuckDocs::Controller::Root;
 use Moose;
 use namespace::autoclean;
+use DuckDuckDocs::Model::Docs;
 
 BEGIN { extends 'Catalyst::Controller' }
 
+#has docs => (
+#    is => 'ro',
+#    default => sub {
+#        DuckDuckDocs::Model::Docs->new(
+#            source_dir => 'sources/DuckDuckGo-Documentation'
+#        )
+#    },
+#);
+
 #
 # Sets the actions in this controller to be registered with no prefix
 # so they function identically to actions created in MyApp.pm
@@ -28,7 +38,8 @@ The root page (/)
 
 sub index :Path :Args(0) {
     my ( $self, $c ) = @_;
-    $c->stash(template => 'index.tx');
+    my $docs = $c->model('Docs')->docs;
+    $c->stash(template => 'index.tx', docs => $docs);
 }
 
 =head2 default
diff --git a/lib/DuckDuckDocs/Model/Docs.pm b/lib/DuckDuckDocs/Model/Docs.pm
new file mode 100644 (file)
index 0000000..48502bc
--- /dev/null
@@ -0,0 +1,75 @@
+package DuckDuckDocs::Model::Docs;
+use Moose;
+use namespace::autoclean;
+
+extends 'Catalyst::Model';
+
+use Text::Markdown;
+use IO::All;
+use Data::Dumper;
+
+use File::Find;
+use vars qw/*name *dir *prune/;
+
+*name   = *File::Find::name;
+*dir    = *File::Find::dir;
+*prune  = *File::Find::prune;
+
+has docs => (
+    is => 'ro',
+    builder => '_generate',
+);
+
+#has source_dir => (
+#    is => 'ro',
+#    required => 1,
+#);
+
+my $source_dir = 'sources/DuckDuckGo-Documentation';
+
+sub _generate {
+    #my ( $self ) = @_;
+    #warn $self->source_dir;
+    my %duckduckdocs;
+    find(sub {
+        return if not -f "$_" or not /^[^.].+\.md$/;
+        $dir =~ s:^$source_dir/?::;
+        my @dirs = split '/', $dir;
+        my $ref = \%duckduckdocs;
+        warn $dir if $_ eq 'fathead-overview';
+        warn Dumper \@dirs if $_ eq 'fathead-overview.md';
+        for (@dirs) {
+            $ref->{$_} = {} if (not exists $ref->{$_});
+            $ref = $ref->{$_};
+        }
+        my $markdown = io($_)->slurp;
+        my $html = Text::Markdown::markdown($markdown);
+        s/\.md$//;
+        $ref->{$_} = $html;
+    }, $source_dir);
+    #warn Dumper \%duckduckdocs;
+    return \%duckduckdocs;
+}
+
+=head1 NAME
+
+DuckDuckDocs::Model::Docs - Catalyst Model
+
+=head1 DESCRIPTION
+
+Catalyst Model.
+
+=head1 AUTHOR
+
+Dylan Lloyd <dylan@dylansserver.com>
+
+=head1 LICENSE
+
+This library is free software. You can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=cut
+
+__PACKAGE__->meta->make_immutable;
+
+1;
index 1997b3b..cc44f6d 100644 (file)
@@ -2,14 +2,43 @@ package DuckDuckDocs::View::HTML;
 
 use strict;
 use warnings;
+use Data::Dumper;
+use HTML::Tiny;
 
 use base 'Catalyst::View::Xslate';
 
+my $html = HTML::Tiny->new(mode => 'html');
+
+sub build_menu {
+    my %menu;
+    sub recurse {
+        my ( $docs, $menu ) = @_;
+        for (keys %{$docs}) {
+            if (ref $docs->{$_} eq 'HASH') {
+                $menu->{$_} = {};
+                recurse($docs->{$_}, $menu->{$_});
+            } else {
+                $menu->{$_} = $docs->{$_};
+            }
+        }
+    };
+    recurse shift, \%menu;
+    $html->ul({ id => 'menu' }, [map {
+        $html->li($html->a({ href => "#$_" }, $_))
+    } grep {
+        1#ref $menu{$_} eq 'HASH'
+    } keys %menu]);
+}
+
 __PACKAGE__->config(
     template_extension => '.tx',
     path => [ 'root/templates', ],
     header => [ 'header.tx', ],
     footer => [ 'footer.tx', ],
+    function => {
+        build_menu => \&build_menu,
+        build_docs => \&build_docs,
+    },
 );
 
 1;
index ca6cd6c..81f4353 100644 (file)
@@ -2,13 +2,21 @@
     width: 200px;
     border-right: 1px solid #BBBBBB;
     box-shadow: 0 0 20px #CCCCCC;
-    padding: 15px 0 30px 30px;
+    padding: 0 0 30px 30px;
     position: fixed;
     top: 0;
     bottom: 0;
     left: 0;
 }
 
+#sidebar ul {
+    padding-left: 0px;
+}
+
+#menu {
+    list-style: none;
+}
+
 #container {
-    margin: 15px 0 50px 260px;
+    margin: 0 0 50px 260px;
 }
index 6d043a1..a294c6e 100644 (file)
@@ -1,6 +1,12 @@
 <div id='sidebar'>
-    DuckDuck
+    <h1>DuckDuck</h1>
+    <: mark_raw(build_menu($docs)) :>
 </div>
 <div id='container'>
-    Docs
+    <h1>Docs</h1>
+    : for $docs.kv() -> $pair {
+        <div id='<: $pair.key :>'>
+            <: mark_raw($pair.value) :>
+        </div>
+    : }
 </div>
diff --git a/t/model_Docs.t b/t/model_Docs.t
new file mode 100644 (file)
index 0000000..913b85c
--- /dev/null
@@ -0,0 +1,8 @@
+use strict;
+use warnings;
+use Test::More;
+
+
+BEGIN { use_ok 'DuckDuckDocs::Model::Docs' }
+
+done_testing();