From 22ce2f0aedbbff32e13dcd8652e188a5d9283a80 Mon Sep 17 00:00:00 2001 From: Cyrille L Date: Sun, 7 May 2023 09:14:15 +0200 Subject: [PATCH] [0.10.5] --- src/usr/bin/tyto | 32 +- .../share/bash-completion/completions/tyto | 66 ++- src/var/lib/tyto/help/CHANGELOG.md | 12 +- src/var/lib/tyto/help/styles.css | 10 + .../lib/tyto/{ => help}/tyto_domain.default | 1 - src/var/lib/tyto/program/args.py | 256 +++++---- src/var/lib/tyto/program/check.py | 34 +- src/var/lib/tyto/program/creators.py | 203 ++++--- src/var/lib/tyto/program/db.py | 129 +++-- src/var/lib/tyto/program/dom.py | 527 +++++++++--------- src/var/lib/tyto/program/form.py | 46 +- src/var/lib/tyto/program/html.py | 24 +- src/var/lib/tyto/program/infos.py | 16 +- src/var/lib/tyto/program/langs.py | 93 ++-- src/var/lib/tyto/program/logs.py | 33 +- src/var/lib/tyto/program/new.py | 20 +- src/var/lib/tyto/program/publish.py | 41 +- src/var/lib/tyto/program/rss.py | 19 +- src/var/lib/tyto/program/show.py | 176 +++--- src/var/lib/tyto/program/stats.py | 16 +- src/var/lib/tyto/program/status.py | 83 ++- src/var/lib/tyto/program/tyto.py | 160 ++---- src/var/lib/tyto/program/wip.py | 101 +++- src/var/lib/tyto/translations/site_en.py | 12 +- src/var/lib/tyto/translations/site_fr.py | 12 +- 25 files changed, 1169 insertions(+), 953 deletions(-) rename src/var/lib/tyto/{ => help}/tyto_domain.default (98%) diff --git a/src/usr/bin/tyto b/src/usr/bin/tyto index e8dd46f..ebc212b 100755 --- a/src/usr/bin/tyto +++ b/src/usr/bin/tyto @@ -24,28 +24,26 @@ # File: /usr/bin/tyto #---------------------------------------------------------------------- -#------------ -# funny stats -#------------ -# scripts files: -# app lines: -# app comments: -# app functions: -# lines: -# functions: -# comments: -#---------------------------------------------------------------------- - -#********************************************************************** +#------------------------- +# Funny Stats Project +#------------------------- +# Project files : 20 +# Project lines : 7479 +# Project comments : 1131 +# Project functions: 108 +# +# file lines : 91 +# file comments : 31 +# file functions: 0 +#-------------------------- import sys sys.path.insert(0, '/var/lib/tyto/program') - #====================# # MAIN # # Treat Arguments # -#--------------------#------------------------------------------------- +#--------------------# import logs if not __name__ == "__main__": @@ -65,15 +63,16 @@ status.domain() import check, form, html, new, publish, show, wip, infos, creators actions = { "check" : check.manage, - "create" : creators.manage, "help" : infos.tyto, "edit" : show.manage, "edit-about" : show.manage, "edit-db" : show.manage, "edit-wip" : show.manage, "edit-www" : show.manage, + "force-wip" : wip.manage, "new" : new.manage, "publish" : publish.manage, + "preview" : show.manage, "quick-pub" : publish.manage, "show" : show.manage, "show-about" : show.manage, @@ -81,7 +80,6 @@ actions = { "show-wip" : show.manage, "show-www" : show.manage, "status" : status.check, - "template" : publish.manage, "wip" : wip.manage, } diff --git a/src/usr/share/bash-completion/completions/tyto b/src/usr/share/bash-completion/completions/tyto index abe8e36..f600106 100755 --- a/src/usr/share/bash-completion/completions/tyto +++ b/src/usr/share/bash-completion/completions/tyto @@ -23,10 +23,18 @@ # File: /usr/share/bash-completion/completions/tyto #---------------------------------------------------------------------- +#------------------------- +# Funny Stats Project +#------------------------- +# file lines : 310 +# file comments : 44 +# file functions: 0 +#-------------------------- -#=====================================================================# -# Actions section # -#=====================================================================# + +#=================# +# Actions section # +#=================#============================================================ # Actions: argument 1 # #---------------------# @@ -39,6 +47,7 @@ edit-about edit-db edit-wip edit-www +force-wip help new show @@ -46,6 +55,7 @@ show-about show-db show-wip show-www +preview publish quick-pub status @@ -96,12 +106,12 @@ EOL } -#=====================================================================# -# Targets section # -#=====================================================================# +#=================# +# Targets section # +#=================#============================================================ -# Targets with wip or publish -#---------------------------- +# Targets for articles and modules +#-------------------------------- _tyto_targets_wp() { cat <_(.*?)_<", line) @@ -812,7 +811,7 @@ def check_anchors(): anchor_name = anchor.rsplit(':')[0].lstrip() if not anchor_name in anchors_names: logs.out("12", 'L=%s. anchor "%s" > %s'%( - ln + 1 + ln_header, anchor_name, db.uri_file + ln, anchor_name, db.uri_file ), False) post_err = True @@ -844,7 +843,7 @@ def check_titles(): def check_words_tags(): global post_err, post_bottom - for tag in tyto.words_tags: + for tag in tyto.markers_tags: c_opened = c_closed = 0 c_opened = post_bottom.count(tag[0]) @@ -896,7 +895,9 @@ def check_contents_list(): if post_lists > 0: inlist = False for ln, line in enumerate(post_bottom.rsplit('\n'), 1): - if line.startswith(tyto.block_tags[3][0]): + ln = ln + ln_header + 1 + + if line.startswith(tyto.block_tags[3][0]): inlist = True continue elif line.startswith(tyto.block_tags[3][1]): @@ -907,13 +908,14 @@ def check_contents_list(): if inlist and not line or not line[0] in tyto.markers_lists: logs.out("3", 'L=%s. %s %s > %s'%( - ln + ln_header, + ln, tyto.block_tags[3][4], tyto.markers_lists, db.uri_file ), False) post_err = True + #==================================# # Legacy HTML Tags, check if aired # #----------------------------------# diff --git a/src/var/lib/tyto/program/creators.py b/src/var/lib/tyto/program/creators.py index 903dc4f..100b2fa 100644 --- a/src/var/lib/tyto/program/creators.py +++ b/src/var/lib/tyto/program/creators.py @@ -24,15 +24,14 @@ # File: /var/lib/tyto/program/creators.py #---------------------------------------------------------------------- -#------------ -# funny stats -#------------ -# lines: -# functions: -# comments: -#---------------------------------------------------------------------- +#------------------------- +# Funny Stats Project +#------------------------- +# file lines : 240 +# file comments : 40 +# file functions: 3 +#-------------------------- -#********************************************************************** import os, importlib, datetime, subprocess import args, dom, db, langs, tyto, check, wip, logs @@ -42,16 +41,14 @@ import args, dom, db, langs, tyto, check, wip, logs # Manage action [create] # #------------------------# def manage(target): + target = args.target creators = { "sitemap" : create_sitemap, } - try: - creators[target](target) - except: - logs.out("28", "%s + %s"%(args.action, args.target), True) - + try: creators[target](target) + except: logs.out("28", "%s + %s"%(args.action, args.target), True) #=====================# @@ -73,7 +70,7 @@ def create_sitemap(target): # Define sitemap.tyto sitemap_tyto = \ - '# %s Tyto - Littérateur [tyto create sitemap]\n'%langs.site.sitemap_gen + \ + '# %s Tyto - Littérateur [tyto new sitemap]\n'%langs.site.sitemap_gen + \ '# NoSitemap\n' + \ 'title: %s (%s %s)\n'%(langs.site.sitemap_t, '%s', langs.site.links) + \ 'about: %s Tyto - Littérateur\n'%langs.site.sitemap_gen + \ @@ -85,14 +82,23 @@ def create_sitemap(target): '-----\n' + \ '\n' + \ '%s\n' + \ - '-)' - - print(sitemap_tyto) + '|\n' + \ + '
\n' + \ + '|\n' + \ + '\n' + \ + '%s\n' tab = 8 uri_dir_set = "" + + # Contents in article's Header links = "" - contents = "#1 /\n-( sitemap" + + # Index of all links in article + index_l = '-( index\n= /' + + # All links in sitemap + contents = '-( sitemap\n= / ' # Not real articles folder forbid_dir = ( @@ -107,79 +113,128 @@ def create_sitemap(target): if r.startswith(forbid_dir): continue + # Take only .tyto files for f in files: - if f.endswith(".tyto"): + if not f.endswith(".tyto"): + continue + + try: + uri_file = r.rsplit(dom.articles_d)[1] + uri_file = os.path.join(uri_file, f) + except: + uri_file = f + + uri_dir = uri_file.rsplit(f)[0] + if not uri_dir: + uri_dir = "~/" + + # Try to load Article Database + args.action = "check" + args.target = uri_file + importlib.reload(db) + if not db.exists: + continue + else: try: - uri_file = r.rsplit(dom.articles_d)[1] - uri_file = os.path.join(uri_file,f) - except: - uri_file = f - - uri_dir = uri_file.rsplit(f)[0] - if not uri_dir: - uri_dir = "~/" - - # Try to load Article Database - args.action = "check" - args.target = uri_file - importlib.reload(db) - if not db.exists: - continue - else: - try: - db.hash_www - db.sitemap - if not db.sitemap: - continue - except: + db.hash_www + db.sitemap + if not db.sitemap: continue - - # Count - nbr_files += 1 - - # create defined link - if not links: - links = \ - "link: %s\n%s%s\n%s%s\n"%( - db.title, tab * " ", db.short_srv, tab * " ", db.about - ) - else: - links = \ - "%s\nlink: %s\n%s%s\n%s%s\n"%( - links, - db.title, tab * " ", - db.short_srv, tab * " ", db.about - ) - - - # Create list link line - if not uri_dir.startswith(uri_dir_set): - root_dir = uri_dir.rsplit("/")[0] - contents = "%s\n-)\n\n#1 %s\n-( sitemap"%(contents, root_dir) - uri_dir_set = uri_dir.rsplit("/")[0] - - uls = uri_dir.count("/") - contents = \ - "%s\n%s [%s] _%s (%s)"%( - contents, - uls * "=", db.date, db.title, db.author + except: + continue + + # Count + nbr_files += 1 + + # create defined link + if not links: + links = \ + "link: %s\n%s%s\n%s%s\n"%( + db.title, tab * " ", db.short_srv, tab * " ", db.about ) + else: + links = \ + "%s\nlink: %s\n%s%s\n%s%s\n"%( + links, + db.title, tab * " ", + db.short_srv, tab * " ", db.about + ) + + + # Create list link line + curr_dir = uri_dir.count("/") + root_dir = uri_dir.rsplit("/")[0] + ranc_dir = root_dir.replace(" ", "_") + + try: prev_dir + except: prev_dir = curr_dir + + try: name_dir + except: name_dir = root_dir + + #print(":",prev_dir, name_dir, curr_dir, root_dir) + #print(": %s"%(uri_dir.rsplit("/")[int(curr_dir - 1)])) + #print(">", subdirs, uri_dir.rsplit("/")) + #print(":", prev_dir, curr_dir) + if name_dir != root_dir: + index_l = '%s\n= %s'%( + index_l, + ranc_dir, + root_dir + ) + contents = '%s\n%s [%s] '%( + contents, + int(curr_dir) * "=", + root_dir, + ranc_dir + ) + name_dir = root_dir + prev_dir = curr_dir + + if prev_dir != curr_dir: + sanc_dir = uri_dir.rsplit("/")[int(curr_dir - 1)].replace(" ", "_") + index_l = '%s\n%s %s'%( + index_l, + int(curr_dir) * "=", + sanc_dir, + uri_dir.rsplit("/")[int(curr_dir - 1)] + ) + contents = '%s\n%s [%s] '%( + contents, + int(curr_dir) * "=", + uri_dir.rsplit("/")[int(curr_dir - 1)], + sanc_dir + ) + prev_dir = curr_dir + + contents = "%s\n%s _%s"%( + contents, + int(curr_dir + 1) * '=', + db.title + ) + + # Ending markers + index_l = "%s\n-)"%index_l + contents = "%s\n-)"%contents + + # Fill new sitemap.tyto and create sitemap_tyto = \ sitemap_tyto%( nbr_files, links, + index_l, contents ) sitemap_file = "%ssitemap.tyto"%dom.articles_d tyto.set_file(sitemap_file, "New", sitemap_tyto) # Check and wip + print() www = subprocess.run( [ '/usr/bin/tyto', - 'wip', - 'sitemap.tyto', - '--force' + 'force-wip', + 'sitemap.tyto' ], ) diff --git a/src/var/lib/tyto/program/db.py b/src/var/lib/tyto/program/db.py index c50f3f9..5ce2d30 100644 --- a/src/var/lib/tyto/program/db.py +++ b/src/var/lib/tyto/program/db.py @@ -23,15 +23,14 @@ # File: /var/lib/tyto/program/db.py #---------------------------------------------------------------------- -#------------ -# funny stats -#------------ -# lines: -# functions: -# comments: -#---------------------------------------------------------------------- +#------------------------- +# Funny Stats Project +#------------------------- +# file lines : 195 +# file comments : 35 +# file functions: 0 +#-------------------------- -#********************************************************************** import os import args, logs, dom, form, tyto, check, publish @@ -79,63 +78,63 @@ if args.target \ # Check if database config is valid (contains values) if exists: values = \ - ( - 'post_id', - 'post_src', - 'post_wip', - 'static_wip', - 'post_www', - 'static_www', - 'direc_src', - 'short_src', - 'short_srv', - 'sub_uri', - 'http_wip', - 'http_www', - 'date_chk', - 'hash_chk', - 'date_wip', - 'hash_wip', - 'date_www', - 'hash_www', - 'title', - 'about', - 'author', - 'meta_tags', - 'date', - 'snpic', - 'sitemap', - 'uris', - 'uniq_anchors', - 'uniq_abbrs', - 'uniq_links', - 'uniq_images', - 'uniq_files', - 'uniq_raws', - 'comments', - 'tags', - 'words', - 'titles', - 'paragraphs', - 'links', - 'images', - 'anchors', - 'abbrs', - 'strongs', - 'bolds', - 'emphasis', - 'italics', - 'dels', - 'underlines', - 'cites', - 'customs', - 'icodes', - 'bcodes', - 'quotes', - 'lists', - 'files', - 'raws', - 'codes', + ( + 'post_id', + 'post_src', + 'post_wip', + 'static_wip', + 'post_www', + 'static_www', + 'direc_src', + 'short_src', + 'short_srv', + 'sub_uri', + 'http_wip', + 'http_www', + 'date_chk', + 'hash_chk', + 'date_wip', + 'hash_wip', + 'date_www', + 'hash_www', + 'title', + 'about', + 'author', + 'meta_tags', + 'date', + 'snpic', + 'sitemap', + 'uris', + 'uniq_anchors', + 'uniq_abbrs', + 'uniq_links', + 'uniq_images', + 'uniq_files', + 'uniq_raws', + 'comments', + 'tags', + 'words', + 'titles', + 'paragraphs', + 'links', + 'images', + 'anchors', + 'abbrs', + 'strongs', + 'bolds', + 'emphasis', + 'italics', + 'dels', + 'underlines', + 'cites', + 'customs', + 'icodes', + 'bcodes', + 'quotes', + 'lists', + 'files', + 'raws', + 'codes', ) # Set exist for wip and www files diff --git a/src/var/lib/tyto/program/dom.py b/src/var/lib/tyto/program/dom.py index e0c32c7..5739d2d 100644 --- a/src/var/lib/tyto/program/dom.py +++ b/src/var/lib/tyto/program/dom.py @@ -23,285 +23,290 @@ # File: /var/lib/tyto/program/dom.py #---------------------------------------------------------------------- -#------------ -# funny stats -#------------ -# lines: -# functions: -# comments: -#---------------------------------------------------------------------- +#------------------------- +# Funny Stats Project +#------------------------- +# file lines : 317 +# file comments : 30 +# file functions: 1 +#-------------------------- -#********************************************************************** import os, sys, importlib, langs import args -lib = 'tyto_domain' -exists = incomplete = active = ready = shortname = corrupt = False -local_user = articles_db_d = False -hole = False -# Set current directory try: - user_dir + ready + except: - try: - user_dir = os.getcwd() + "/" - except: - hole = True -# Set current user name -try: - user -except: - try: - user = os.environ.get('USER') - except: - user = '' - - -# Settings for domain, check if db is not corrupted -dom_values = \ - ( - 'directory', - 'database', - 'local_user', - 'lang_sys', - 'lang_logs', - 'articles_db_d', - 'articles_d', - 'files_d', - 'images_d', - 'modules_d', - 'navbar_f', - 'sidebar_f', - 'metas_f', - 'footer_f', - 'shortname', - 'www_url', - 'wip_url', - 'srv_root', - 'srv_domain', - 'srv_wip', - 'srv_wip_tpl_d', - 'srv_wip_images_d', - 'srv_wip_files_d', - 'srv_www', - 'srv_www_tpl_d', - 'srv_www_images_d', - 'srv_www_files_d', - 'wip_favicon_f', - 'wip_css_f', - 'wip_logo_f', - 'wip_navbar_f', - 'wip_sidebar_f', - 'wip_metas_f', - 'wip_footer_f', - 'wip_stats_f', - 'www_navbar_f', - 'www_sidebar_f', - 'www_metas_f', - 'www_footer_f', - 'www_stats_f', - 'www_logo_f', - 'www_css_f', - 'www_rss_f', - 'www_favicon_f', - 'favicon', - 'logo', - 'styles', - 'rss', - 'rss_items', - 'title', - 'date', - 'about', - 'lang_site', - 'mail', - 'tags', - 'license', - 'license_url', - 'legal_url', - 'terms_url', - 'css', - 'sep', - 'article_code', - 'relme', - 'sidebar_title', - 'sidebar_items', - 'activated' - ) - -create_files = \ - ( - 'navbar_f', - 'sidebar_f', - 'metas_f', - 'footer_f', - ) - -wip_html_mods = () -err_val = (()) # Make a list from values error - -if not hole: - home_dir = os.path.expanduser('~') + lib = 'tyto_domain' + exists = incomplete = active = ready = shortname = corrupt = False + local_user = articles_db_d = False + hole = False - # Set configuration domain directory - root_dir = user_dir - if '/articles' in user_dir: - root_dir = user_dir.rsplit('/articles')[0] + "/" - - # Set configuration domain file - config = '%styto_domain.py'%root_dir - shortname = config - - # Set exists if configuration file - if os.path.exists(config): - exists = True + # Set current directory + try: + user_dir + except: try: - exec(open(config).read()) - try: - os.path.exists(articles_d) - if '/articles' in user_dir: - user_uri_dir = user_dir.rsplit(articles_d)[1] - else: - user_uri_dir = '' - os.chdir(articles_d) - except: corrupt = True + user_dir = os.getcwd() + "/" except: - corrupt = True - - if not args.target in args.pass_targets: - if args.target.startswith("articles/"): - args.target = args.target.rsplit("articles/")[1] - args.target = user_uri_dir + args.target + hole = True + + # Set current user name + try: + user + except: + try: + user = os.environ.get('USER') + except: + user = '' + + + # Settings for domain, check if db is not corrupted + dom_values = \ + ( + 'directory', + 'database', + 'local_user', + 'lang_sys', + 'lang_logs', + 'articles_db_d', + 'articles_d', + 'files_d', + 'images_d', + 'modules_d', + 'navbar_f', + 'sidebar_f', + 'metas_f', + 'footer_f', + 'shortname', + 'www_url', + 'wip_url', + 'srv_root', + 'srv_domain', + 'srv_wip', + 'srv_wip_tpl_d', + 'srv_wip_images_d', + 'srv_wip_files_d', + 'srv_www', + 'srv_www_tpl_d', + 'srv_www_images_d', + 'srv_www_files_d', + 'wip_favicon_f', + 'wip_css_f', + 'wip_logo_f', + 'wip_navbar_f', + 'wip_sidebar_f', + 'wip_metas_f', + 'wip_footer_f', + 'wip_stats_f', + 'www_navbar_f', + 'www_sidebar_f', + 'www_metas_f', + 'www_footer_f', + 'www_stats_f', + 'www_logo_f', + 'www_css_f', + 'www_rss_f', + 'www_favicon_f', + 'favicon', + 'logo', + 'styles', + 'rss', + 'rss_items', + 'title', + 'date', + 'about', + 'lang_site', + 'mail', + 'tags', + 'license', + 'license_url', + 'legal_url', + 'terms_url', + 'css', + 'sep', + 'article_code', + 'relme', + 'sidebar_title', + 'sidebar_items', + 'activated' + ) + + create_files = \ + ( + 'navbar_f', + 'sidebar_f', + 'metas_f', + 'footer_f', + ) + + wip_html_mods = () + err_val = (()) # Make a list from values error + + if not hole: + home_dir = os.path.expanduser('~') - # For logs: show uri if not shortname known - try: shortname - except: pass + # Set configuration domain directory + root_dir = user_dir + if '/articles' in user_dir: + root_dir = user_dir.rsplit('/articles')[0] + "/" + + # Set configuration domain file + config = '%styto_domain.py'%root_dir + shortname = config - try: active = activated - except: pass - - # Check set values configuration - if not corrupt: - for value in dom_values: + # Set exists if configuration file + if os.path.exists(config): + exists = True + try: + exec(open(config).read()) try: - eval(str(value)) - value_set = True - except: - err_val = err_val + ((value),) - value_set = False - incomplete = True - active = False - - - #==============================================# - # When an active and complete domain is needed # - #----------------------------------------------# - if exists and not incomplete and not corrupt: - if active: - ready = True - - wip_html_mods = \ - ( - eval(str('wip_navbar_f')), - eval(str('wip_sidebar_f')), - eval(str('wip_metas_f')), - eval(str('wip_footer_f')) - ) - www_html_mods = \ - ( - eval(str('www_navbar_f')), - eval(str('www_sidebar_f')), - eval(str('www_metas_f')), - eval(str('www_footer_f')) - ) - metas = \ - ( - eval(str('metas_f')), - eval(str('wip_metas_f')), - eval(str('www_metas_f')) - ) - navbars = \ - ( - eval(str('navbar_f')), - eval(str('wip_navbar_f')), - eval(str('www_navbar_f')) - ) - sidebars = \ - ( - eval(str('sidebar_f')), - eval(str('wip_sidebar_f')), - eval(str('www_sidebar_f')) - ) - footers = \ - ( - eval(str('footer_f')), - eval(str('wip_footer_f')), - eval(str('www_footer_f')), - ) - - templates = \ - ( - eval(str('wip_logo_f')), - eval(str('wip_favicon_f')), - eval(str('wip_css_f')), - eval(str('wip_navbar_f')), - eval(str('wip_sidebar_f')), - eval(str('wip_metas_f')), - eval(str('wip_footer_f')), - eval(str('wip_stats_f')), - eval(str('www_favicon_f')), - eval(str('www_logo_f')), - eval(str('www_css_f')), - eval(str('www_navbar_f')), - eval(str('www_sidebar_f')), - eval(str('www_metas_f')), - eval(str('www_footer_f')), - eval(str('www_stats_f')), - eval(str('www_rss_f')), - ) - - statistics = \ - ( - eval(str('wip_stats_f')), - eval(str('www_stats_f')), - ) + os.path.exists(articles_d) + if '/articles' in user_dir: + user_uri_dir = user_dir.rsplit(articles_d)[1] + else: + user_uri_dir = '' + os.chdir(articles_d) + except: corrupt = True + except: + corrupt = True - modules = \ - { - "metas" : metas, - "navbar" : navbars, - "sidebar" : sidebars, - "footer" : footers, - "template": templates, - "stats" : statistics, - } + if not args.target in args.pass_targets: + if args.target.startswith("articles/"): + args.target = args.target.rsplit("articles/")[1] + args.target = user_uri_dir + args.target + + # For logs: show uri if not shortname known + try: shortname + except: pass + + try: active = activated + except: pass + + # Check set values configuration + if not corrupt: + for value in dom_values: + try: + eval(str(value)) + value_set = True + except: + err_val = err_val + ((value),) + value_set = False + incomplete = True + active = False - templates_files_wip = \ - ( - eval(str('wip_favicon_f')), - eval(str('wip_logo_f')), - eval(str('wip_css_f')), - eval(str('wip_navbar_f')), - eval(str('wip_sidebar_f')), - eval(str('wip_metas_f')), - eval(str('wip_footer_f')), - eval(str('wip_stats_f')), - ) + + #==============================================# + # When an active and complete domain is needed # + #----------------------------------------------# + if exists and not incomplete and not corrupt: + if active: + ready = True + + wip_html_mods = \ + ( + eval(str('wip_navbar_f')), + eval(str('wip_sidebar_f')), + eval(str('wip_metas_f')), + eval(str('wip_footer_f')) + ) + www_html_mods = \ + ( + eval(str('www_navbar_f')), + eval(str('www_sidebar_f')), + eval(str('www_metas_f')), + eval(str('www_footer_f')) + ) + metas = \ + ( + eval(str('metas_f')), + eval(str('wip_metas_f')), + eval(str('www_metas_f')) + ) + navbars = \ + ( + eval(str('navbar_f')), + eval(str('wip_navbar_f')), + eval(str('www_navbar_f')) + ) + sidebars = \ + ( + eval(str('sidebar_f')), + eval(str('wip_sidebar_f')), + eval(str('www_sidebar_f')) + ) + footers = \ + ( + eval(str('footer_f')), + eval(str('wip_footer_f')), + eval(str('www_footer_f')), + ) + + templates = \ + ( + eval(str('wip_logo_f')), + eval(str('wip_favicon_f')), + eval(str('wip_css_f')), + eval(str('wip_navbar_f')), + eval(str('wip_sidebar_f')), + eval(str('wip_metas_f')), + eval(str('wip_footer_f')), + eval(str('wip_stats_f')), + eval(str('www_favicon_f')), + eval(str('www_logo_f')), + eval(str('www_css_f')), + eval(str('www_navbar_f')), + eval(str('www_sidebar_f')), + eval(str('www_metas_f')), + eval(str('www_footer_f')), + eval(str('www_stats_f')), + eval(str('www_rss_f')), + ) + + statistics = \ + ( + eval(str('wip_stats_f')), + eval(str('www_stats_f')), + ) - templates_files_www = \ - ( - eval(str('www_favicon_f')), - eval(str('www_logo_f')), - eval(str('www_css_f')), - eval(str('www_navbar_f')), - eval(str('www_sidebar_f')), - eval(str('www_metas_f')), - eval(str('www_footer_f')), - eval(str('www_stats_f')), - eval(str('www_rss_f')) - ) + modules = \ + { + "metas" : metas, + "navbar" : navbars, + "sidebar" : sidebars, + "footer" : footers, + "template": templates, + "stats" : statistics, + } + + templates_files_wip = \ + ( + eval(str('wip_favicon_f')), + eval(str('wip_logo_f')), + eval(str('wip_css_f')), + eval(str('wip_navbar_f')), + eval(str('wip_sidebar_f')), + eval(str('wip_metas_f')), + eval(str('wip_footer_f')), + eval(str('wip_stats_f')), + ) + + templates_files_www = \ + ( + eval(str('www_favicon_f')), + eval(str('www_logo_f')), + eval(str('www_css_f')), + eval(str('www_navbar_f')), + eval(str('www_sidebar_f')), + eval(str('www_metas_f')), + eval(str('www_footer_f')), + eval(str('www_stats_f')), + eval(str('www_rss_f')) + ) #====================================# # Check if domain is ready and ready # diff --git a/src/var/lib/tyto/program/form.py b/src/var/lib/tyto/program/form.py index 013a40d..6c4f6fa 100644 --- a/src/var/lib/tyto/program/form.py +++ b/src/var/lib/tyto/program/form.py @@ -25,36 +25,42 @@ # File: /var/lib/tyto/program/form.py #---------------------------------------------------------------------- -#------------ -# funny stats -#------------ -# lines: -# functions: -# comments: -#---------------------------------------------------------------------- +#------------------------- +# Funny Stats Project +#------------------------- +# file lines : 1096 +# file comments : 103 +# file functions: 7 +#-------------------------- -#********************************************************************** from datetime import datetime import os, sys, shutil, re, locale, importlib import logs, dom, tyto, html, show, langs -# locale translation directory -trans_dir = '/var/lib/tyto/translations' - -# Get default System language try: - lang_sys = locale.getdefaultlocale()[0].split('_')[0] - os.path.exists('%s/site_%s.py'%(trans_dir, lang_sys)) + lang_site except: - lang_sys = 'en' - -lang_site = lang_sys + # locale translation directory + trans_dir = '/var/lib/tyto/translations' + + # Get default System language + try: + lang_sys = locale.getdefaultlocale()[0].split('_')[0] + os.path.exists('%s/site_%s.py'%(trans_dir, lang_sys)) + except: + lang_sys = 'en' + + lang_site = lang_sys # Generic answer +""" answer_yes = ('y', 'Y', 'yes', 'Yes', 'YES', 'o', 'O', 'oui', 'Oui', 'Oui' ) +""" +try: answer_yes +except: answer_yes = langs.answer_yes #=======================================# @@ -72,7 +78,11 @@ def asking(question, yes_no): logs.out("255", '', True) if yes_no: - if not answer in answer_yes: + go = False + for yes_names in answer_yes: + if answer.lower() in yes_names: + go = True + if not go: logs.out("255", '', True) else: diff --git a/src/var/lib/tyto/program/html.py b/src/var/lib/tyto/program/html.py index 927fd2b..5f082e7 100644 --- a/src/var/lib/tyto/program/html.py +++ b/src/var/lib/tyto/program/html.py @@ -22,19 +22,19 @@ # File: /var/lib/tyto/program/html.py #---------------------------------------------------------------------- -#------------ -# funny stats -#------------ -# lines: -# functions: -# comments: -#---------------------------------------------------------------------- +#------------------------- +# Funny Stats Project +#------------------------- +# file lines : 543 +# file comments : 70 +# file functions: 8 +#-------------------------- -#********************************************************************** import os, sys, importlib import logs, db, dom, tyto, form, langs + # Publish option can be wip_opts = ('wip', 'new') pub_opts = ('www', 'pub') @@ -163,6 +163,7 @@ def create_main_page(target, article_bottom): '%s\n'%metas + \ ' \n\n' + \ ' \n' + \ + '
\n' + \ '
\n' + \ ' \n' + \ '
\n' + \ tags_html_mods[dom.wip_navbar_f] + '\n' + \ + '
\n' + \ '
\n' + \ '

%s

\n'%( @@ -199,7 +201,9 @@ def create_main_page(target, article_bottom): '
\n' + \ '\n' + \ tags_html_mods[dom.wip_sidebar_f] + '\n' + \ + '
\n' + \ tags_html_mods[dom.wip_footer_f] + '\n' + \ + '
\n' + \ ' \n' + \ '' @@ -484,10 +488,10 @@ def create_sidebar(option): ' \n' diff --git a/src/var/lib/tyto/program/infos.py b/src/var/lib/tyto/program/infos.py index cf592a9..ddf7b69 100644 --- a/src/var/lib/tyto/program/infos.py +++ b/src/var/lib/tyto/program/infos.py @@ -23,20 +23,20 @@ # File: /var/lib/tyto/program/infos.py #---------------------------------------------------------------------- -#------------ -# funny stats -#------------ -# lines: -# functions: -# comments: -#---------------------------------------------------------------------- +#------------------------- +# Funny Stats Project +#------------------------- +# file lines : 130 +# file comments : 26 +# file functions: 3 +#-------------------------- -#********************************************************************** import os, sys, importlib import langs importlib.reload(langs) + # Set colors CS = '\033[0;0m' CR = '\033[1;31m' diff --git a/src/var/lib/tyto/program/langs.py b/src/var/lib/tyto/program/langs.py index d0d9afa..8256ff5 100644 --- a/src/var/lib/tyto/program/langs.py +++ b/src/var/lib/tyto/program/langs.py @@ -23,50 +23,67 @@ # File: /var/lib/tyto/program/langs.py #---------------------------------------------------------------------- -#------------ -# funny stats -#------------ -# lines: -# functions: -# comments: -#---------------------------------------------------------------------- +#------------------------- +# Funny Stats Project +#------------------------- +# file lines : 89 +# file comments : 27 +# file functions: 0 +#-------------------------- -#********************************************************************** import locale, sys, os, importlib import dom -# Import translation directory -trans_dir = '/var/lib/tyto/translations' -sys.path.insert(0, trans_dir) - -# Get default system language -# or set "en" (english) if no translation file try: - lang_sys = locale.getdefaultlocale()[0].split('_')[0] - os.path.exists('%s/logs_%s.py'%(trans_dir, lang_sys)) + site.yes + except: - lang_sys = 'en' + # Import translation directory + trans_dir = '/var/lib/tyto/translations' + sys.path.insert(0, trans_dir) + + # Create yes array with all yes languages + try: + answer_yes + except: + answer_yes = (()) + for lang_file in os.listdir(trans_dir): + if lang_file.startswith("site_") and lang_file.endswith(".py"): + lang_file = lang_file.replace(".py", "") + + lang = importlib.import_module(lang_file) + answer_yes = answer_yes + ((lang.yes),) + + + # Get default system language + # or set "en" (english) if no translation file + try: + lang_sys = locale.getdefaultlocale()[0].split('_')[0] + os.path.exists('%s/logs_%s.py'%(trans_dir, lang_sys)) + except: + lang_sys = 'en' + + + # Set language logs from configuration domain + # or set default english if not known + try: + dom.exists + lang_logs = dom.lang_logs + os.path.exists('%s/logs_%s.py'%(trans_dir, lang_logs)) + log = importlib.import_module('logs_%s'%lang_logs, package=None) + except: + log = importlib.import_module('logs_%s'%lang_sys, package=None) + + + # Set language site/form from configuration domain + # or set default english if not known + try: + dom.exists + lang_site = dom.lang_site + os.path.exists('%s/site_%s.py'%(trans_dir, lang_site)) + site = importlib.import_module('site_%s'%lang_site, package=None) + except: + site = importlib.import_module('site_%s'%lang_sys, package=None) - -# Set language logs from configuration domain -# or set default english if not known -try: - dom.exists - lang_logs = dom.lang_logs - os.path.exists('%s/logs_%s.py'%(trans_dir, lang_logs)) - log = importlib.import_module('logs_%s'%lang_logs, package=None) -except: - log = importlib.import_module('logs_%s'%lang_sys, package=None) - - -# Set language site/form from configuration domain -# or set default english if not known -try: - dom.exists - lang_site = dom.lang_site - os.path.exists('%s/site_%s.py'%(trans_dir, lang_site)) - site = importlib.import_module('site_%s'%lang_site, package=None) -except: - site = importlib.import_module('site_%s'%lang_sys, package=None) diff --git a/src/var/lib/tyto/program/logs.py b/src/var/lib/tyto/program/logs.py index fdb7247..be3ca43 100644 --- a/src/var/lib/tyto/program/logs.py +++ b/src/var/lib/tyto/program/logs.py @@ -23,27 +23,30 @@ # File: /var/lib/tyto/program/logs.py #---------------------------------------------------------------------- -#------------ -# funny stats -#------------ -# lines: -# functions: -# comments: -#---------------------------------------------------------------------- +#------------------------- +# Funny Stats Project +#------------------------- +# file lines : 126 +# file comments : 22 +# file functions: 1 +#-------------------------- -#********************************************************************** import os, sys import langs -# Use to mark new article -shebang = "#!/NEW" -# Set colors -CS = '\033[0;0m' -CR = '\033[1;31m' -CY = '\033[1;33m' -CG = '\033[1;32m' +try: + shebang +except: + # Use to mark new article + shebang = "#!/NEW" + + # Set colors + CS = '\033[0;0m' + CR = '\033[1;31m' + CY = '\033[1;33m' + CG = '\033[1;32m' # Exit from program with message # diff --git a/src/var/lib/tyto/program/new.py b/src/var/lib/tyto/program/new.py index f50ead2..f4a1a3c 100644 --- a/src/var/lib/tyto/program/new.py +++ b/src/var/lib/tyto/program/new.py @@ -23,19 +23,18 @@ # File: /var/lib/tyto/program/new.py #---------------------------------------------------------------------- -#------------ -# funny stats -#------------ -# lines: -# functions: -# comments: -#---------------------------------------------------------------------- +#------------------------- +# Funny Stats Project +#------------------------- +# file lines : 93 +# file comments : 26 +# file functions: 1 +#-------------------------- -#********************************************************************** import sys from unidecode import unidecode -import args, dom, logs, langs, form, html, tyto, show +import args, dom, logs, langs, form, html, tyto, show, creators #===============================================# @@ -56,7 +55,8 @@ def manage(target): 'sidebar' : html.create_sidebar, 'navbar' : html.create_navbar, 'metas' : html.create_user_metas, - 'footer' : html.create_user_footer + 'footer' : html.create_user_footer, + 'sitemap' : creators.manage } actions[target](option) diff --git a/src/var/lib/tyto/program/publish.py b/src/var/lib/tyto/program/publish.py index 179022c..52eca07 100644 --- a/src/var/lib/tyto/program/publish.py +++ b/src/var/lib/tyto/program/publish.py @@ -23,20 +23,20 @@ # File: /var/lib/tyto/program/publish.py #---------------------------------------------------------------------- -#------------ -# funny stats -#------------ -# lines: -# functions: -# comments: -#---------------------------------------------------------------------- +#------------------------- +# Funny Stats Project +#------------------------- +# file lines : 293 +# file comments : 49 +# file functions: 6 +#-------------------------- -#********************************************************************** -import os, sys, shutil, importlib +import os, sys, shutil, importlib, subprocess from pathlib import Path import logs, args, dom, db, wip, html, tyto, form, stats, rss, langs, check + #==============================# # Manage action, get post db # # check if publish can be done # @@ -46,15 +46,17 @@ def manage(target): # Specific QUICK processes: check > wip > publish if args.action == "quick-pub": - try: - db.uri_file - except: - logs.out("28", "%s + %s"%(args.action, args.target), True) - - print(" ! Quick Publish") - check.check_process(target) - importlib.reload(db) - wip.wip_article(db.uri_file) + try: db.uri_file + except: logs.out("28", "%s + %s"%(args.action, args.target), True) + + wip = subprocess.run( + [ + '/usr/bin/tyto', + 'force-wip', + target + ], + ) + print() importlib.reload(db) check_to_publish('one') publish_article() @@ -280,6 +282,9 @@ def publish_template(option): logs.out("32", item_dst, False) # Create new file from _configs/ files + if args.option == "--no-mods": + return + html.create_sidebar('pub') html.create_navbar('pub') html.create_user_metas('pub') diff --git a/src/var/lib/tyto/program/rss.py b/src/var/lib/tyto/program/rss.py index add7c84..84df4ec 100644 --- a/src/var/lib/tyto/program/rss.py +++ b/src/var/lib/tyto/program/rss.py @@ -23,15 +23,14 @@ # File: /var/lib/tyto/program/rss.py #---------------------------------------------------------------------- -#------------ -# funny stats -#------------ -# lines: -# functions: -# comments: -#---------------------------------------------------------------------- +#------------------------- +# Funny Stats Project +#------------------------- +# file lines : 128 +# file comments : 27 +# file functions: 1 +#-------------------------- -#********************************************************************* import os from pathlib import Path @@ -86,6 +85,10 @@ def create_feed(): if not hash_www or hash_chk != hash_www: continue + # NoSitemap + if not db.sitemap: + continue + rss_item = True nbr_item += 1 diff --git a/src/var/lib/tyto/program/show.py b/src/var/lib/tyto/program/show.py index 8c5ba8a..7aae839 100644 --- a/src/var/lib/tyto/program/show.py +++ b/src/var/lib/tyto/program/show.py @@ -24,19 +24,19 @@ # File: /var/lib/tyto/program/show.py #---------------------------------------------------------------------- -#------------ -# funny stats -#------------ -# lines: -# functions: -# comments: -#---------------------------------------------------------------------- +#------------------------- +# Funny Stats Project +#------------------------- +# file lines : 215 +# file comments : 38 +# file functions: 3 +#-------------------------- -#********************************************************************** -import os, sys, importlib +import os, sys, importlib, subprocess import args, logs, langs, dom, db, form, tyto, check, html, stats + #========================# # Read lines from a file # # alone: True/False # @@ -93,80 +93,85 @@ def manage(target): try: post_www = db.post_www except: pass - - # Except for show-about > Show post DB - if args.action == "show-about": - target = 'post' + # Convert command action to do[] # as edit* &nd show* [action] have same target file actions = \ - { - "show" : 'src', - "edit" : 'src', - "post" : 'src', - "show-db" : 'db', - "edit-db" : 'db', - "show-wip" : 'wip', - "edit-wip" : 'wip', - "show-www" : 'www', - "edit-www" : 'www' - } + { + "show" : 'src', + "edit" : 'src', + "post" : 'src', + "preview" : 'wip', + "show-db" : 'db', + "edit-db" : 'db', + "show-wip" : 'wip', + "edit-wip" : 'wip', + "show-www" : 'www', + "edit-www" : 'www' + } action = actions[args.action] # Set target file from "new" [action] do = \ - { - 'src' : { - "domain" : dom.config, - "footer" : dom.footer_f, - "metas" : dom.metas_f, - "navbar" : dom.navbar_f, - "sidebar" : dom.sidebar_f, - "post" : post_src - }, - 'db' : { - "domain" : dom.config, - "footer" : dom.footer_f, - "metas" : dom.metas_f, - "navbar" : dom.navbar_f, - "sidebar" : dom.sidebar_f, - "post" : post_db - }, - 'wip' : { - "domain" : dom.config, - "footer" : dom.wip_footer_f, - "metas" : dom.wip_metas_f, - "navbar" : dom.wip_navbar_f, - "sidebar" : dom.wip_sidebar_f, - "post" : post_wip, - "stats" : dom.wip_stats_f, - }, - 'www' : { - "domain" : dom.config, - "footer" : dom.www_footer_f, - "metas" : dom.www_metas_f, - "navbar" : dom.www_navbar_f, - "sidebar" : dom.www_sidebar_f, - "post" : post_www, - "stats" : dom.www_stats_f, - }, - } - + { + 'src' : { + "domain" : dom.config, + "footer" : dom.footer_f, + "metas" : dom.metas_f, + "navbar" : dom.navbar_f, + "sidebar" : dom.sidebar_f, + "post" : post_src + }, + 'db' : { + "domain" : dom.config, + "footer" : dom.footer_f, + "metas" : dom.metas_f, + "navbar" : dom.navbar_f, + "sidebar" : dom.sidebar_f, + "post" : post_db + }, + 'wip' : { + "domain" : dom.config, + "footer" : dom.wip_footer_f, + "metas" : dom.wip_metas_f, + "navbar" : dom.wip_navbar_f, + "sidebar" : dom.wip_sidebar_f, + "post" : post_wip, + "sitemap" : '%ssitemap.html'%dom.srv_wip, + "stats" : dom.wip_stats_f, + }, + 'www' : { + "domain" : dom.config, + "footer" : dom.www_footer_f, + "metas" : dom.www_metas_f, + "navbar" : dom.www_navbar_f, + "sidebar" : dom.www_sidebar_f, + "post" : post_www, + "stats" : dom.www_stats_f, + }, + } + # Read or edit file, according to legacy args.action - try: - file = do[action][target] - - if args.action in actions_read: - read_lines(file, True) - - elif args.action in actions_edit: - curr_hash = tyto.get_filesum(file, True) - tyto.edit_file(file) + file = do[action][target] + if not file: + logs.out("28", '%s + %s'%(args.action, args.target), True) + + if not file or not tyto.exists(file): + logs.out("1", file, True) + + # Except for show-about > Show post DB + if args.action == "preview": + preview_wip(file) + return + + elif args.action in actions_read: + read_lines(file, True) - except: - logs.out("28", '%s + %s'%(args.action, target), True) + elif args.action in actions_edit: + curr_hash = tyto.get_filesum(file, True) + tyto.edit_file(file) # If edit article and hash changed, ask to check @@ -178,16 +183,33 @@ def manage(target): # Launch process for some changed file #------------------------------------- if file == post_src: - form.asking(' ├ %s%s '%( - langs.site.post_chg, langs.site.q - ), True) - # Reload post DB (if edited article, and check it if ask "y") importlib.reload(db) - check.manage(post_src) + check = subprocess.run( + [ + '/usr/bin/tyto', + 'check', + args.target + ] + ) elif file == dom.sidebar_f: html.create_sidebar('wip') elif file == dom.navbar_f: html.create_navbar('wip') elif file == dom.metas_f: html.create_user_metas('wip') + +#=====================================# +# Preview in browser wip page # +# Ensure xdg-open (useless in server) # +#-------------------------------------# +def preview_wip(file): + try: + xdg = subprocess.run( + [ + '/usr/bin/xdg-open', + file, + ], + ) + except: + logs.out("28", "/usr/bin/xdg-open %s"%file, True) diff --git a/src/var/lib/tyto/program/stats.py b/src/var/lib/tyto/program/stats.py index 19f34b2..0a26042 100644 --- a/src/var/lib/tyto/program/stats.py +++ b/src/var/lib/tyto/program/stats.py @@ -23,19 +23,19 @@ # File: /var/lib/tyto/program/stats.py #---------------------------------------------------------------------- -#------------ -# funny stats -#------------ -# lines: -# functions: -# comments: -#---------------------------------------------------------------------- +#------------------------- +# Funny Stats Project +#------------------------- +# file lines : 225 +# file comments : 37 +# file functions: 4 +#-------------------------- -#********************************************************************** import os, importlib import args, dom, logs, form, tyto, show, langs + sti_articles = 0 #=======================# diff --git a/src/var/lib/tyto/program/status.py b/src/var/lib/tyto/program/status.py index 1e1d4d9..e0d2fa4 100644 --- a/src/var/lib/tyto/program/status.py +++ b/src/var/lib/tyto/program/status.py @@ -23,40 +23,73 @@ # File: /var/lib/tyto/program/status.py #---------------------------------------------------------------------- -#------------ -# funny stats -#------------ -# lines: -# functions: -# comments: -#---------------------------------------------------------------------- +#------------------------- +# Funny Stats Project +#------------------------- +# file lines : 238 +# file comments : 50 +# file functions: 3 +#-------------------------- -#********************************************************************** import os -import args, dom, logs, tyto, html, db +import args, dom, logs + +#=====================# +# Check domain status # +#---------------------# def domain(): - if dom.hole: logs.out("13", '', True) - elif args.action == 'new' and args.target == "domain": return - elif args.act_err: logs.out("11", args.action, True) - elif not dom.exists: logs.out("10", '', True) - elif dom.corrupt: logs.out("39", dom.shortname, True) + if dom.hole: + logs.out("13", '', True) - print("") - if dom.incomplete: logs.out("41", dom.shortname, False) - elif dom.active: logs.out("42", dom.shortname, False) - elif not dom.active: logs.out("40", dom.shortname, False) + # Only condition to not check domain status here + if args.action == 'new' and \ + args.target == "domain": + return + + # As subprocesses, avoid show domain status each time + if args.action in args.quicks: + return - # No backward in target + # [action] not in list + if args.act_err: + logs.out("11", args.action, True) + + # No domain found + if not dom.exists: + logs.out("10", '', True) + + # Domain id corrupted + if dom.corrupt: + logs.out("39", dom.shortname, True) + + # Domain is incomplete + if dom.incomplete: + logs.out("41", dom.shortname, False) + # Show unused values + for err_val in dom.err_val: + logs.out("16", err_val, True) + + # Domain not activated + if not dom.active: + logs.out("40", dom.shortname, True) + + # Domain is activated + if dom.active: + logs.out("42", dom.shortname, False) + + + # No backward in [target] if "../" in args.target: logs.out("11", '"../"', True) - # Show unused values - for err_val in dom.err_val: - logs.out("16", err_val, True) - # Create unused directories + #===========================# + # Create unused directories # + #---------------------------# + import tyto + srv_show_wip = srv_show_www = local_show = dom_err = False for value in dom.dom_values: set_value = eval(str('dom.%s'%value)) @@ -103,6 +136,8 @@ def domain(): # Create missing modules files + import html + if not tyto.exists(dom.metas_f) or \ not tyto.exists(dom.wip_metas_f): html.create_user_metas('new') @@ -124,6 +159,8 @@ def domain(): # On demand with status action # #------------------------------# def check(target): + import db + # target needed if not target: logs.out("5", '[target]', True) diff --git a/src/var/lib/tyto/program/tyto.py b/src/var/lib/tyto/program/tyto.py index 5d23f87..40aa755 100644 --- a/src/var/lib/tyto/program/tyto.py +++ b/src/var/lib/tyto/program/tyto.py @@ -23,20 +23,20 @@ # File: /var/lib/tyto/program/tyto.py #---------------------------------------------------------------------- -#------------ -# funny stats -#------------ -# lines: -# functions: -# comments: -#---------------------------------------------------------------------- +#------------------------- +# Funny Stats Project +#------------------------- +# file lines : 724 +# file comments : 120 +# file functions: 14 +#-------------------------- -#********************************************************************** import os, sys, re, subprocess, locale, base64, datetime, shutil from hashlib import blake2b import args, dom, logs, langs + # :D Tyto = 'Tyto - Littérateur' Tytogit = 'https://git.a-lec.org/echolib/tyto-litterateur' @@ -103,50 +103,6 @@ headers = \ # ! As base64 is used, do NOT set marker: =_ _= # [5] = name for stats and log. #------------------------------------------------------------- -words_tags = [ - ( - '*_', '_*', - ''%dom.css, '', - 'strongs' - ), - ( - '+_', '_+', - ''%dom.css, '', - 'bolds' - ), - ( - ';_', '_;', - ''%dom.css, '', - 'emphasis' - ), - ( - ':_', '_:', - ''%dom.css, '', - 'italics' - ), - ( - '~_', '_~', - ''%dom.css, '', - 'dels' - ), - ( - '._', '_.', ''%dom.css, - '', - 'underlines' - ), - ( - '[_', '_]', - ''%dom.css, '', - 'cites' - ), - ( - '%_', '_%', - '', '', - 'customs' - ), -] - - icode_tags = \ ( '{_', '_}', @@ -154,6 +110,7 @@ icode_tags = \ 'icodes', '\\{_', '\\_}' ) + strong_tags = \ ( '*_', '_*', @@ -162,6 +119,7 @@ strong_tags = \ '\\*_', '\\_*', '-S1-', '-S2-' ) + bold_tags = \ ( '+_', '_+', @@ -170,6 +128,7 @@ bold_tags = \ '\\+_', '\\_+', '-B1-', '-B2-' ) + em_tags = \ ( ';_', '_;', @@ -178,6 +137,7 @@ em_tags = \ '\\;_', '\\_;', '-EM1-', '-EM2-' ) + i_tags = \ ( ':_', '_:', @@ -186,6 +146,7 @@ i_tags = \ '\\:_', '\\_:', '-I1-', '-I2-' ) + u_tags = \ ( '._', '_.', ''%dom.css, @@ -194,6 +155,7 @@ u_tags = \ '\\._', '\\_.', '-U1-', '-U2-' ) + del_tags = \ ( '~_', '_~', @@ -202,6 +164,7 @@ del_tags = \ '\\~_', '\\_~', '-DE1-', '-DE2-' ) + cite_tags = \ ( '[_', '_]', @@ -210,6 +173,7 @@ cite_tags = \ '\\[_', '\\_]', '-CI1-', '-CI2-' ) + custom1_tags = \ ( '%_', '_%', @@ -219,7 +183,6 @@ custom1_tags = \ '-CU1-', '-CU2-' ) - markers_tags = \ [ strong_tags, @@ -344,7 +307,7 @@ date: %s Texte-alternatif #link: lien 1 - URi/URL + URI/URL Text-alternatif ----- @@ -361,48 +324,6 @@ date: %s nbr_icodes = 0 -#==============================# -# Replace escaped markers # -# check: with "" # -# wip: with altternate # -# (recover when wip done) # -#------------------------------# -def protect_escaped(post_bottom, reverse): - for m1, m2, h1, h2, n, e1, e2, r1, r2 in markers_tags: - - # In check mode, No need to keep escaped markers - if args.action == "check": - r1 = r2 = '' - - if reverse: - post_bottom = post_bottom.replace(r1, m1) - post_bottom = post_bottom.replace(r2, m2) - else: - post_bottom = post_bottom.replace(e1, r1) - post_bottom = post_bottom.replace(e2, r2) - - return post_bottom - - -# -- tests -def find_between( s, first, last ): - try: - start = s.index( first ) + len( first ) - end = s.index( last, start ) - return s[start:end] - except ValueError: - return "" - -def find_between_r( s, first, last ): - try: - start = s.rindex( first ) + len( first ) - end = s.rindex( last, start ) - return s[start:end] - except ValueError: - return "" -# -- tests - - #=======# # TOOLS # #=======#-------------------------------------------------------------- @@ -432,9 +353,6 @@ def convert_altname(altname): # False = URI # #-----------------------# def get_filesum(path, src): - #if not src and not exists(path): - # logs.out("1", path, True) - file_sum = blake2b(digest_size=4) if src: file_sum.update(open(path, 'rb').read()) @@ -506,6 +424,29 @@ def get_css(line): return css +#==============================# +# Replace escaped markers # +# check: with "" # +# wip: with altternate # +# reverse: True/False # +#------------------------------# +def protect_escaped(post_bottom, reverse): + for m1, m2, h1, h2, n, e1, e2, r1, r2 in markers_tags: + + # In check mode, No need to keep escaped markers + if args.action == "check": + r1 = r2 = '' + + if reverse: + post_bottom = post_bottom.replace(r1, m1) + post_bottom = post_bottom.replace(r2, m2) + else: + post_bottom = post_bottom.replace(e1, r1) + post_bottom = post_bottom.replace(e2, r2) + + return post_bottom + + #=============================================# # First check process to protect contents # # Protect block-Codes, quotes # @@ -580,11 +521,14 @@ def protect_bcodes_quotes(process, post_bottom): if not bcode: bcode = line else: bcode = '%s\n%s'%(bcode, line) line = '' + continue + elif in_quote: # Convert lines to b64 if not quote: quote = line else: quote = '%s\n%s'%(quote, line) line = '' + continue # Set new content @@ -614,27 +558,27 @@ def protect_icodes(post_bottom): # Get only lines that contains code in_icode = ok_icode = go_icode = False for ln, line in enumerate(post_bottom.rsplit('\n')): - if not "{_" in line or not "_}" in line: + if not icode_tags[0] in line or \ + not icode_tags[1] in line: continue code = "" for i, c in enumerate(line): if c == "_": try: - if line[i-1] == "{" and line[i-2] != "\\": + # {_ + if line[i-1] == icode_tags[0][0] and line[i-2] != "\\": in_icode = True ok_icode = False - go_icode = True - elif line[i+1] == "}" and line[i-2] != "\\": + #go_icode = True + continue + # _} + elif line[i+1] == icode_tags[1][1] and line[i-2] != "\\": in_icode = False ok_icode = True go_icode = False except: continue - - if go_icode : - go_icode = False - continue if in_icode: ok_icode = False @@ -650,7 +594,7 @@ def protect_icodes(post_bottom): post_bottom = post_bottom.replace(tyto_code , '') elif args.action == "wip": - code = convert_altname(code) + code = convert_altname(code) # HTML sympbols html_code = "%s%s%s"%( icode_tags[2], code, icode_tags[3]) b64_code = b64('Encode', html_code, 'I64.', '.I64') diff --git a/src/var/lib/tyto/program/wip.py b/src/var/lib/tyto/program/wip.py index 21cc0b4..e410fa9 100644 --- a/src/var/lib/tyto/program/wip.py +++ b/src/var/lib/tyto/program/wip.py @@ -26,17 +26,16 @@ # File: /var/lib/tyto/program/wip.py #---------------------------------------------------------------------- -#------------ -# funny stats -#------------ -# lines: -# functions: -# comments: -#---------------------------------------------------------------------- +#------------------------- +# Funny Stats Project +#------------------------- +# file lines : 1112 +# file comments : 166 +# file functions: 26 +#-------------------------- -#********************************************************************** -import os, re, sys, locale, shutil, importlib, time +import os, re, sys, locale, shutil, importlib, time, subprocess from pathlib import Path import args, logs, langs, dom, db, tyto, html, form, stats, check @@ -53,13 +52,28 @@ def manage(target): logs.out("5", '[target]', True) # option --force to check and wip processes - if args.option == '--force': + if args.action == 'force-wip': if args.target in args.pass_targets: logs.out("28", "%s + %s"%(args.target, args.option), True) - check.manage(target) - #importlib.reload(db) - wip_article(target) + + chk = subprocess.run( + [ + '/usr/bin/tyto', + 'check', + target, + '--force' + ], + ) + + print() + wip = subprocess.run( + [ + '/usr/bin/tyto', + 'wip', + target, + ], + ) return # Modules and multi-articles @@ -323,7 +337,7 @@ def wip_single_tags(): #----------------------------------# def wip_words_tags(): # Strongs, italics... - for tag in tyto.words_tags: + for tag in tyto.markers_tags: # Open tag replace_in_post(tag[0], tag[2] @@ -375,23 +389,54 @@ def wip_words_tags(): ) -#========================# -# Convert links set inDB # -# - file_%i # -# - link_%i # -# from marker to HTML # -#------------------------# +#============================# +# from wip_links # +# Get arrays, in DB # +# sort all links by length # +# (avoic abcd to target abc) # +# return db.NAME_i array # +#----------------------------# +def wip_return_link_nbr(marker, nbr): + items = [()] + links = (()) + + # Get length link and i (from all arrays ) in new array + for i in range(1, nbr + 1): + item = 'db.%s_%s'%(marker, i) + len_link = len(eval(item)[1]) + items = items + [(len_link, i),] + + # Sort length by bigger in new array + for i in sorted(items,reverse=True): + try: + print(i[1]) + links = links + ((i[1]),) + except: + pass + + return links + +#=========================# +# Convert links set in DB # +# - file_%i # +# - link_%i # +#-------------------------# def wip_links(): if db.uniq_files == 0 and db.uniq_links == 0: return - + link_tb = 'target="_blank"' link_ts = 'target="_self"' link_html = '%s' # ! Doing link files, first, becase of similar marker #---------------------------------------------------- - if db.uniq_files > 0: - for i in range(1, db.uniq_files + 1): + if db.uniq_files > 0: + + links = wip_return_link_nbr("file", db.uniq_files) + for i in links: + if not i: + return + flink = 'db.file_%s'%i flink_css = "link_file" flink_name = eval(flink)[0][2:] @@ -408,7 +453,12 @@ def wip_links(): # Convert simple links #--------------------- if db.uniq_links > 0: - for i in range(1, db.uniq_links + 1): + + links = wip_return_link_nbr("link", db.uniq_links) + for i in links: + if not i: + return + link = 'db.link_%s'%i link_css = "link" link_name = eval(link)[0][1:] @@ -417,6 +467,7 @@ def wip_links(): link_set = link_html%( link_css, link_anc, link_title, "%s", link_name ) + print(">", eval(link)[1]) replace_in_post(eval(link)[0]+'+', link_set%link_tb) replace_in_post(eval(link)[0], link_set%link_ts) @@ -514,7 +565,7 @@ def wip_images(): else: style = '' - # set from parameter + # set from parameter image_target = eval(image)[1] image_target = db.sub_uri + image_target[1:] image_src = image_show%( diff --git a/src/var/lib/tyto/translations/site_en.py b/src/var/lib/tyto/translations/site_en.py index 0a24eab..786f33a 100644 --- a/src/var/lib/tyto/translations/site_en.py +++ b/src/var/lib/tyto/translations/site_en.py @@ -18,6 +18,9 @@ # - "\n" # - "+ \" +# Keep array ! ('','',) +yes = ("y", "yes",) + # Generic article = "Article" links = "links" @@ -268,6 +271,7 @@ args_helps = """\n# New domain : [sidebar, navbar, footer, metas] Create and replace with default module configuration file [filename] (no .tyto) Create article in current folder + [sitemap], create new website sitemap # Show contents file (with line number) show : Show source file, source configuration module @@ -280,8 +284,10 @@ args_helps = """\n# New domain : # Create HTML page check : Check the validity of a tyto format file wip : Create article HTML page in server 'wip' + force-wip : [file], check, and then, wip + preview : [module]/[file], open 'wip' file on default browser publish : Create article HTML page in server 'www' - quick-pub : Do check, wip, publish ([file] only) + quick-pub : [file], check, wip, publish # [target] > According to [action] # Multiple articles @@ -306,10 +312,12 @@ args_helps = """\n# New domain : navbar : Navbar configuration file sidebar : Sidebar configuration file stats : Stats file (server 'wip' er 'www') + sitemap : sitemap.tyto/.html file # [option] : --static : Créer une page HTML entièrement statique - --force : Avec [wip], vérifier l'article et créer la page HTML""" + --no-mods : With [publish template], do not recreate modules + """ ex_helps = """# Examples : # Check article (according to sub-folder) diff --git a/src/var/lib/tyto/translations/site_fr.py b/src/var/lib/tyto/translations/site_fr.py index c2c1e3d..d13e49a 100644 --- a/src/var/lib/tyto/translations/site_fr.py +++ b/src/var/lib/tyto/translations/site_fr.py @@ -18,6 +18,9 @@ # - "\n" # - "+ \" +# Garder ! ('','',) +yes = ("o", "oui",) + # Generic article = "Article" links = "liens" @@ -267,6 +270,7 @@ args_helps = """\n# Nouveau domaine : fichier de configuration du module par le défaut [filename] (sans .tyto) Créer un article dans le dossier actuel + [sitemap], créer le plan du site (sitemap) # Afficher un fichier (avec numéros de ligne) show : Fichier source, module de configuration @@ -277,8 +281,10 @@ args_helps = """\n# Nouveau domaine : # Processus de création / Mise en ligne check : Vérifier la validité d'un article au format tyto wip : Créer une page HTML de l'article dans le serveur 'wip' + force-wip : [file], check, wip + preview : [module]/[file], ouvre le fichier 'wip' dans le navigateur par défaut publish : Créer une page HTML de l'article dans le serveur 'www' - quick-pub : Faire check, wip, publish ([file] seulement) + quick-pub : [file] , check, wip, publish # [target] > Selon l'action [action] # Traitement en masse @@ -303,10 +309,12 @@ args_helps = """\n# Nouveau domaine : navbar : Fichier de configuration du menu de navigation sidebar : Fichier de configuration de la barre latérale stats : Fichier de statistiques (serveur 'wip' ou 'www') + sitemap : Fichier sitemap.tyto/.html # [option] --static : Créer une page HTML entièrement statique - --force : Avec [wip], vérifier l'article et créer la page HTML""" + --no-mods : Avec [publish template], ne pas recréer les modules + """ ex_helps = """# Exemples : # Vérifier l'article dans le sous dossier (suivant l'emplacement)