From: Will Budic Date: Thu, 15 May 2025 08:23:11 +0000 (+1000) Subject: init X-Git-Url: https://lifelog.hopto.org/gitweb/?a=commitdiff_plain;h=6b28767dca880422c4d3879ff2d0dcc055423671;p=PerlCNFWEBServer.git init --- diff --git a/index.cgi b/index.cgi new file mode 100755 index 0000000..46a1fa7 --- /dev/null +++ b/index.cgi @@ -0,0 +1,116 @@ +#!/usr/bin/env perl +# A delegated CNFParser processed rendering of the Document Index Web page, a Model-View-Controller Pattern approuch. +# The index.cnf script contains the structure and page skeleton, +# all configuration as well as the HTMLIndexProcessorPlugin converting the CNF to final HTML. +# It is very convienient, as both style and script for the page is separated and developed in the index.cnf. +# Which then can be moved to a respective include file over there. +# This controller binds and provides to the parser to do its magic thing. +# +use v5.30; +use strict; +use warnings; +use Exception::Class ('LifeLogException'); +use Syntax::Keyword::Try; +## +# We use dynamic perl compilations. The following ONLY HERE required to carp to browser on +# system requirments or/and unexpected perl compiler errors. +## +use CGI::Carp qw(fatalsToBrowser set_message); + +BEGIN { + sub handle_errors { + my $err = shift; + say "

Server Error

Error: $err
"; + } + set_message(\&handle_errors); +} + +use lib "system/modules"; +require CNFParser; +require CNFNode; + +our $GLOB_HTML_SERVE = "'{}/*.cgi' '{}/*.htm' '{}/*.html' '{}/*.md' '{}/*.txt'"; +our $script_path = $0; $script_path =~ s/\w+.cgi$//; + +exit &HTMLPageBuilderFromCNF; + +sub HTMLPageBuilderFromCNF { + my $html = obtainDirListingHTML('docs'); + my $cnf = CNFParser -> new ( + $script_path."index.cnf",{ + DO_ENABLED => 1, HAS_EXTENSIONS=>1, + ANONS_ARE_PUBLIC => 1, + PAGE_HEAD => "

Index Page of Docs Directory

", + PAGE_CONTENT => $html, + PAGE_FOOT => "" + } + ); + my $ptr = $cnf->data(); + $ptr = $ptr->{'PAGE'}; + say $$ptr if $ptr; + return 0 +} + +sub obtainDirListingHTML { + my ($dir, $ret) = (shift,""); + my $html = listFiles($dir,$script_path,""); + if($html){ + $ret .=""; + } + return $ret; +} + +sub listFiles ($){ + my ($dir, $script_path, $ret) = @_; + my $path = $script_path.$dir; + my $spec = $GLOB_HTML_SERVE; $spec =~ s/{}/$path/gp; + my @files = glob ($spec); + @files = sort { + ( $a=~m/\w+[_-]*/ eq $b=~m/\w+[_-]*/ && length $a > length $b) || + $a <=> $b + } @files; + foreach my $file(@files){ + ($file =~ m/(\w+\.\w*)$/g); + my $name = $1; + if($file =~ /\.md$/){ + my @title = getDocTitle($file); + $ret .= qq(\t\t\t
  • $title[1] ‐ $name
  • \n); + }else{ + $ret .= qq(\t\t\t
  • $name
  • \n); + } + } + + return $ret; +} + +sub getDocTitle($){ + my ($file,$ret) = shift; + open(my $fh, '<', $file) or LifeLogException->throw("Can't open $file: $!"); + while (my $line = <$fh>) { + if($line =~ /^#+\s*(.*)/){ + $ret = $1; + last; + } + } + close $fh; + ($file =~ m/(\w+\.\w*)$/g); + return ($1,$ret) +} +1; +=begin copyright +Programed by : Will Budić +EContactHash : 990MWWLWM8C2MI8K (https://github.com/wbudic/EContactHash.md) +Source : https://github.com/wbudic/LifeLog +Open Source Code License -> https://github.com/wbudic/PerlCNF/blob/master/ISC_License.md +=cut copyright diff --git a/index.cnf b/index.cnf new file mode 100644 index 0000000..2f03cf0 --- /dev/null +++ b/index.cnf @@ -0,0 +1,575 @@ +!CNF3.3 + +<<@<%WEBAPP_SETTINGS> + $LOG_PATH = data + //TODO We are reading only the css property, old way is the following hash, preserved as reminder. + $THEME = css => wsrc/main.css, colBG => #c8fff8, colSHDW => #9baec8 +>> + + +<<@<%HTTP_HEADER> +-charset = "UTF8" +-expires = "+5s" +>> + +< + package : PreProcessorObtainThemeSettings + subroutine : process + property : THEME +>> + +< _HAS_PROCESSING_PRIORITY_ + +[JS[ + [@@[wsrc/main.js]@@] + [@@[wsrc/feeds.js]@@] + [@@[wsrc/jquery.js]@@] + [@@[wsrc/jquery-ui.js]@@] +]JS] +[CSS[ + [@@[wsrc/jquery-ui.css]@@] + [@@[wsrc/jquery-ui.theme.css]@@] + [@@[wsrc/jquery-ui.theme.css]@@] + [@@[wsrc/main.css]@@] + [@@[wsrc/effects.css]@@] + [@@[wsrc/feeds.css]@@] +]CSS] + + div { + border: none; + text-align:left !important; + padding: 0; + border-width: 0; + } + .no-top-border { + border-top: none; + } + .textual { + width: 40%; + } + .textual p::first-letter { + color: blueviolet; + initial-letter: 3 2; + padding-right: 5pt; + } + #content ul { + background: transparent; + color:black; + margin: 0; + padding:5px; + } + #content li { + padding: 0px; + margin-left:30px; + } + + #content li a:link { + font-weight: normal; + color:rgb(26, 96, 111); + } + + #content li:hover { + color: #ff4d21; + font-weight: bolder; + background: rgba(255,255,255,0.2); + } + + #content li a:visited { + color: rgb(150, 8, 8); + font-weight: bold; + } + + + #footer { + border: 1px solid gray; + background: rgba(128,128,128,0.2); + margin:5px; + } + + + .md_doc { + background: white; + border: 1px solid gray; + border-top: 0; + padding: 10px; margin: 5px; + text-align: left; + overflow-y:scroll; + color:black; + margin:0 auto; + } + + .md_doc ul{ + font-size: large; + } + + .md_doc p{ + margin: 0 auto; + padding: 5px; + text-align: left; + font-weight: normal; + } + + .md_doc blockquote { + margin-top: 0; + margin-bottom: 16px; + background:#b2f8ef; + border-left: 3px solid #94cde7; + border-top: 2px solid #94cde7; + border-right: 2px solid #94cde7; + } + .md_doc blockquote > :last-child{ + border-bottom: 2px solid #94cde7; + } + + .div_img{ + height:450px; + } + + .md_img{ + height:80%; + } + + code, pre{ + font-family: 'Droid Sans Mono', 'monospace', monospace; + } + + .pre { + border:1px solid black; + background: rgba(255,255,255,0.2); + padding:15px; + text-align: left; + } + .sh { + background: black; + color: lightgreen; + padding: 15px; + width: auto; + border-radius: .32em; + border: 2px solid lightgreen; + margin: inherit; + margin-right: 30px; + } + + div .html { + border:1px solid lightgray; + background: rgba(255,255,255,0.2); + padding:10px; + font-family:monospace; + text-align: left; + } + + div .cnf { + border:1px solid lightgray; + background: rgba(255,255,255,0.2); + padding:10px; + font-family:monospace; + text-align: left; + padding-bottom: 10px; + margin-right: 2px; + margin-top: 15px; + } + + dt{ + margin-right: 2px; + } + + .cnf h1{ + text-align: left; + padding-left: 15px; + margin-top: -20px; + height: 20px; + line-height: 20px; + font-size: 15px; + } + + .cnf h1 span{ + background-color: white; + border:1px solid lightgray; + color:lightgray; + font-size:small; + padding: 3px; + padding-left: 5px; + padding-right: 5px; + } + + + div .perl { + border:1px solid lightgray; + background: rgba(149, 215, 172, 0.2); + padding-left:15px; + font-family:monospace; + text-align: left; + padding-bottom: 20px; + margin-right: 2px; + margin-top: 15px; + } + + .mermaid{ + border:1px solid lightgray; + background: transparent; + padding-left:15px; + text-align: left; + padding-bottom: 20px; + margin-right: 2px; + margin-top: 15px; + } + + .perl h1{ + text-align: left; + padding-left: 15px; + margin-top: -10px; + height: 20px; + line-height: 20px; + font-size: 15px; + } + + .perl h1 span{ + background: rgba(170, 227, 191, 0.75); + border:1px solid lightgray; + color:black; + font-size:small; + padding: 3px; + padding-left: 5px; + padding-right: 5px; + } + + .span_status { + position: absolute; + /* top: 80px; + left:420px;*/ + border: 2px solid #94cde7; + padding: 5px; + text-align: center; + background: #ccffff; + text-decoration-style: wavy; + filter: drop-shadow( 10px 8px 5px #3e6f70); + z-index:10; + } + + div#tabs { + background:transparent; + border:0; + padding: 0; + } + + div#tabs ul { + background:transparent; + } + + div#tabs li { + font-style: normal; + font-weight: bolder; + padding:1px; + border-top-left-radius:15px; + border-top-right-radius:15px; + border-bottom: 0; + margin-top: 0; + + } + + + div#tabs .ui-tabs-anchor { + padding: .01em 1em; + color:black; + } + div#tabs ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header, .ui-state-active, a.ui-button:active, .ui-button:active, .ui-button.ui-state-active:hover { + border: 1px solid #050506; + background: transparent; + font-style: normal; + font-weight: normal; + margin-top: 0px; + border-bottom: 0; + } + + div#tabspanels .ui-state-active a { + color: #472f80; + text-decoration-line: underline; + } + + #menu_page .menu_head a { + background: rgba(255,255,255,.6) + } + .span-content{ + border: 1px solid black; + text-align: left; + background-color: #e6ffff; + vertical-align: top; + } + +]#] +>STYLE> + +*> +>STYLE> + +SCRIPT> + + + +>>HEADER>TREE> + + + +### +# We in plugin mainly access this PAGE property, <*
    *> is linked in for clarity, +# and/or if want to change from keeping the original \<\...\>\> above. +# +< __PROCESS_LAST__ + + <*
    *> + + Title: Index Page + OnLoad : onIndexBodyLoad() + + + + +   Page   + + + +
    + App

    + Index

    + < Listing >

    + < Display > +
    + Life Log
    + RSS Feeds +>#> + >div> +*> + a> + >div> + #> + >span> + +