New processes and updated codes

This commit is contained in:
Cyrille L 2023-04-02 15:59:06 +02:00
parent e43f2eaaa4
commit 29ee8cc704
18 changed files with 742 additions and 535 deletions

View File

@ -64,7 +64,7 @@ actions = {
'show-www' : show.manage,
'status' : status.check,
'template' : publish.manage_publish,
'wip' : wip.manage_wip,
'wip' : wip.manage,
}

View File

@ -1,11 +1,27 @@
#!/usr/bin/env python3
# Name: Tyto - Littérateur
# Type: Command arguments
# Description: Check arguments
# file: args.py
# Folder: /var/lib/tyto/program/
# By echolib (XMPP: im@echolib.re)
# License: GNU AFFERO GENERAL PUBLIC LICENSE Version 3, 19 November 2007
# Tyto - Littérateur
#
# Copyright (C) 2023 Cyrille Louarn <echolib+tyto@a-lec.org>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License
# as published by the Free Software Foundation, either version 3 of the
# License, or of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#----------------------------------------------------------------------
# XMPP: echolib (im@echolib.re)
#
# Description: Manage arguments from command line
# File: /var/lib/tyto/program/args.py
#----------------------------------------------------------------------
#------------
# funny stats
@ -20,6 +36,7 @@
import sys
import infos, logs
# Arguments from command line
# tyto [action] [target]
#----------------------------
@ -79,7 +96,7 @@ pass_targets = \
'template'
)
multi_chk = ('all', 'again')
multi_chk = ('all', 'again', 'newer')
action = ''
target = ''

View File

@ -38,7 +38,6 @@
import time, importlib, sys, os, re, datetime
from datetime import datetime
from time import gmtime, strftime
import args, dom, logs, status, db, form, tyto, langs
post_err = False
@ -53,27 +52,23 @@ def manage(target):
# target needed
if not target:
logs.out("5", args.action, True)
logs.out("5", '[target]', True)
elif target in args.multi_chk:
check_all(target)
elif not db.post:
logs.out("1", db.uri_file, True)
# Already check
elif not target in args.multi_chk \
and db.exists \
elif db.exists \
and not db.old_chk:
logs.out("20", '%s > %s'%(db.date_chk, db.uri_file), False)
answer = form.asking('%s%s '%(
langs.site.check_a, langs.site.q
), True)
check_process(target)
# All
elif target in args.multi_chk:
check_all(target)
# No file found
elif not db.post:
sys.exit(1)
else:
check_process(target)
@ -367,9 +362,10 @@ def check_needed_tags(post_header):
# Create False date_check #
#--------------------------------#
def check_date(date):
global post_err
global post_err, date_tr
# Check if article date is valid (True)
date_tr = date
fmt_article = "%Y-%m-%d"
try:
@ -388,9 +384,8 @@ def check_date(date):
# Set franch format in post DB
if dom.lang_site == 'fr':
date = date.rsplit('-')
date = date[2] + '/' + date[1] + '/' + date[0]
date = (date, date_check)
date_tr = date[2] + '/' + date[1] + '/' + date[0]
print("> Convert date in FR >", date_tr)
#===========================================#
@ -750,7 +745,7 @@ def create_database():
'about = "%s"\n'%about + \
'author = "%s"\n'%author + \
'tags = "%s"\n'%tags + \
'date = "%s"\n'%date + \
'date = "%s"\n'%date_tr + \
'snpic = "%s"\n'%snpic_url + \
'\n# Used files\n' + \
'uris = %s'%str(files_post)

View File

@ -18,7 +18,6 @@
#**********************************************************************
import os
import args, logs, dom, form, tyto
remove = exists = post = corrupt = False
@ -26,6 +25,7 @@ remove = exists = post = corrupt = False
try: in_dir = os.getcwd()
except: logs.out("13", '', True)
# target needs db (file).
# action like show, wip, edit-db
# not domain, all, again...
@ -52,9 +52,7 @@ if args.target \
post = True
hash_post = tyto.get_filesum(uri_file, True)
else:
post = False
remove = True
logs.out("1", uri_file, False)
# Check if database config is valid (contains values)
if exists:

View File

@ -1,11 +1,27 @@
#!/usr/bin/env python3
# Name: Tyto - Littérateur
# Type: DB for domain
# Description: Search domain datas and get statuses
# file: dom.py
# Folder: /var/lib/tyto/program/
# By echolib (XMPP: im@echolib.re)
# License: GNU AFFERO GENERAL PUBLIC LICENSE Version 3, 19 November 2007
# Tyto - Littérateur
#
# Copyright (C) 2023 Cyrille Louarn <echolib+tyto@a-lec.org>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License
# as published by the Free Software Foundation, either version 3 of the
# License, or of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#----------------------------------------------------------------------
# XMPP: echolib (im@echolib.re)
#
# Description: Manage domain configuration
# File: /var/lib/tyto/program/dom.py
#----------------------------------------------------------------------
#------------
# funny stats
@ -17,39 +33,17 @@
#**********************************************************************
import os, sys, importlib, locale
import os, sys, importlib, langs
lib = 'tyto_domain'
exists = incomplete = active = ready = shortname = False
local_user = articles_db = activated = False
local_user = articles_db_d = False
hole = False
# Set current directory
try: in_dir = os.getcwd()
except: hole = True
if not hole:
home_dir = os.path.expanduser('~')
# Set configuration domain directory
folder = in_dir
if '/articles' in in_dir:
folder = in_dir.rsplit('/articles')[0]
# Set configuration domain file
config = '%s/tyto_domain.py'%folder
# Set exists if configuration file
if os.path.exists(config):
exists = True
exec(open(config).read())
# For logs: show uri if not shortname known
try: shortname
except: shortname = config
if activated:
active = True
# Settings for domain, check if db is not corrupted
dom_values = \
(
@ -81,15 +75,17 @@ if not hole:
'srv_www_tpl_d',
'srv_www_images_d',
'srv_www_files_d',
'wip_css_f',
'wip_logo_f',
'wip_navbar_f',
'wip_sidebar_f',
'wip_metas_f',
'wip_footer_f',
'www_css_f',
'www_navbar_f',
'www_sidebar_f',
'www_metas_f',
'www_footer_f',
'wip_logo_f',
'www_logo_f',
'www_rss_f',
'logo',
@ -124,36 +120,78 @@ if not hole:
)
err_val = (()) # Make a list from values error
dir_new = (()) # Make a list for directories to create
file_new = (()) # Make a list for files to check
file_unu = (()) # Make a list for files to check
file_mod = (()) # male a list for modules files to create
dir_new = (()) # Make a list for directories created
dir_unu = (()) # Not created, unused
if not hole:
home_dir = os.path.expanduser('~')
# Set configuration domain directory
folder = in_dir
if '/articles' in in_dir:
folder = in_dir.rsplit('/articles')[0]
# Set configuration domain file
config = '%s/tyto_domain.py'%folder
# Set exists if configuration file
if os.path.exists(config):
exists = True
exec(open(config).read())
# For logs: show uri if not shortname known
try: shortname
except: shortname = config
try: active = activated
except: pass
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
if value.endswith('_d'):
if value_set:
if not os.path.exists(eval(str(value))):
try:
os.makedirs(eval(str(value)), exist_ok=True)
dir_new = dir_new + ((eval(str(value))),)
except:
dir_unu = dir_unu + ((eval(str(value))),)
elif value.endswith('_f'):
if value_set:
if not os.path.exists(eval(str(value))):
if value in create_files:
file_mod = file_mod + ((value),)
else:
file_unu = file_unu + ((eval(str(value))),)
#==============================================#
# When an active and complete domain is needed #
#----------------------------------------------#
if not incomplete and active:
if not incomplete:
wip_html_mods = \
(
eval(str('wip_navbar_f')),
eval(str('wip_sidebar_f')),
eval(str('wip_metas_f')),
eval(str('wip_footer_f'))
)
if active:
ready = True
for value in dom_values:
# Check if directory exists and create it
if value.endswith('_d') and \
not os.path.exists(eval(str(value))):
os.makedirs(eval(str(value)), exist_ok=True)
dir_new = dir_new + ((eval(str(value))),)
# Check if file exists
if value.endswith('_f') and \
not os.path.exists(eval(str(value))):
if value in create_files:
file_mod = file_mod + ((value),)
else:
file_new = file_new + ((eval(str(value))),)
#====================================#

View File

@ -36,7 +36,7 @@
#**********************************************************************
from datetime import datetime
import os, sys, locale, importlib
import os, sys, re, locale, importlib
import logs, dom, tyto, html, show, langs
@ -85,7 +85,6 @@ def asking(question, yes_no):
# target: 3rd argument #
#--------------------------#
def manage(target):
if not dom.exists:
logs.out("43", '', False)
create_domain(target)
@ -100,7 +99,10 @@ def manage(target):
# Create a new domain #
#---------------------#
def create_domain(target):
if target and not target.startswith('http'):
valid_url = ('http://', 'https://')
invalid = False
if target and not target.startswith(valid_url):
logs.out("51", '"%s" -> http(s)://...'%target, False)
target = ''
@ -108,8 +110,6 @@ def create_domain(target):
# Get complete URL from target or ask
#------------------------------------
valid_url = ('http://', 'https://')
try:
www_url = dom.www_url
except:
@ -176,7 +176,7 @@ def create_domain(target):
if answer:
if len(answer) == 2: lang_logs = answer.lower()
else: logs.out("3", answer, True)
else: logs.out("3", answer, False)
if not tyto.exists('%s/logs_%s.py'%(trans_dir, lang_logs)):
lang_logs = 'en'
@ -220,23 +220,37 @@ def create_domain(target):
# Get srv root
#-------------
try:
srv = dom.srv
except:
if tyto.exists('/var/www') : srv = '/var/www'
else: srv = ''
try: srv = dom.srv
except: srv = '/var/www'
answer = asking('%s%s {%s} '%(
langs.site.form_srv, langs.site.q, srv
), False)
if answer:
if tyto.exists(answer): srv = answer
else: logs.out("1", srv, True)
elif not srv:
logs.out("255", '', True)
if srvl[-1] == "/": srv = srv[:-1]
if answer: srv = answer
if not tyto.exists(srv):
logs.out("1", srv, False)
srv = ''
invalid = True
elif srv[-1] == "/":
srv = srv[:-1]
# Get logo's website
#-------------------
try: logo = dom.logo
except: logo = 'logo.png'
answer = asking('%s%s {%s} '%(
langs.site.form_logo, langs.site.q, logo
), False)
if answer: logo = answer
if not logo: logo='logo.png'
# Set config's directories for servers
#-------------------------------------
root_srv_dom = '%s/%s'%(srv, shortname)
srv_wip_tpl = "%s/wip/template/"%root_srv_dom
srv_www_tpl = "%s/www/template/"%root_srv_dom
@ -252,11 +266,17 @@ def create_domain(target):
'srv_www_images_d = "%s/www/images/"\n'%root_srv_dom + \
'srv_www_files_d = "%s/www/files/"\n'%root_srv_dom + \
'\n' + \
'# Servers files\n' + \
'# Servers files (wip)\n' + \
'wip_logo_f = "%s%s"\n'%(srv_wip_tpl, logo) + \
'wip_css_f = "%sstyles.css"\n'%srv_wip_tpl + \
'wip_navbar_f = "%snavbar.html"\n'%srv_wip_tpl + \
'wip_sidebar_f = "%ssidebar.html"\n'%srv_wip_tpl + \
'wip_metas_f = "%smetas.html"\n'%srv_wip_tpl + \
'wip_footer_f = "%sfooter.html"\n'%srv_wip_tpl + \
'\n' + \
'# Servers files (www)\n' + \
'www_logo_f = "%s%s"\n'%(srv_www_tpl, logo) + \
'www_css_f = "%sstyles.css"\n'%srv_www_tpl + \
'www_navbar_f = "%snavbar.html"\n'%srv_www_tpl + \
'www_sidebar_f = "%ssidebar.html"\n'%srv_www_tpl + \
'www_metas_f = "%smetas.html"\n'%srv_www_tpl + \
@ -265,23 +285,6 @@ def create_domain(target):
tyto.set_file(dom.config, False, set_f)
# Get logo's website
#-------------------
try: logo = dom.logo
except: logo = 'logo.png'
answer = asking('%s%s {%s} '%(
langs.site.form_logo, langs.site.q, logo
), False)
if answer: logo = answer
set_f = 'wip_logo_f = "%s%s"\n'%(srv_wip_tpl, logo) + \
'www_logo_f = "%s%s"'%(srv_www_tpl, logo)
tyto.set_file(dom.config, False, set_f)
# RSS/Atom filename
#------------------
try: rss = dom.rss
@ -304,15 +307,15 @@ def create_domain(target):
# RSS/Atom max items
#-------------------
try: rss_items = dom.rss_items
except: rss_items = "100"
except: rss_items = 100
answer = asking('%s%s {%s} '%(
langs.site.form_rss_i, langs.site.q, rss_items
), False)
if answer:
if answer.isdigit() and int(answer) > 1: rss_items = answer
else: logs.out("3", answer, True)
if answer: rss_items = answer
if not str(rss_items).isdigit() or not int(rss_items) > 1:
rss_items = 100
set_f = 'rss_items = %d'%int(rss_items)
tyto.set_file(dom.config, False, set_f)
@ -328,9 +331,8 @@ def create_domain(target):
), False)
if answer: title = answer
elif not title: logs.out("255", '', True)
if '"' in title: title = title.replace('"', '')
if not title: invalid = True
elif '"' in title: title = title.replace('"', '')
set_f = 'title = "%s"'%title
tyto.set_file(dom.config, False, set_f)
@ -361,9 +363,8 @@ def create_domain(target):
), False)
if answer: about = answer
elif not about: logs.out("255", '', True)
if '"' in about: about = about.replace('"', '')
if not about: invalid = True
elif '"' in about: about = about.replace('"', '')
set_f = 'about = "%s"'%about
tyto.set_file(dom.config, False, set_f)
@ -371,13 +372,16 @@ def create_domain(target):
# Get Lang domain for web pages
#------------------------------
try: lang_site
except: lang_site = lang_sys
answer = asking('%s%s {%s} '%(
langs.site.form_trsite, langs.site.q, lang_site
), False)
if answer:
if len(answer) == 2: lang_site = answer.lower()
else: logs.out("3", answer, True)
else: logs.out("3", answer, False)
if not tyto.exists('%s/site_%s.py'%(trans_dir, lang_site)):
lang_site = 'en'
@ -396,10 +400,9 @@ def create_domain(target):
), False)
if answer: mail = answer
elif not mail: logs.out("255", '', True)
if not re.search('^\w+@\w+.\w+$', mail):
logs.out("3", mail, True)
logs.out("3", mail, False)
invalid = True
set_f = 'mail = "%s"'%mail
tyto.set_file(dom.config, False, set_f)
@ -415,9 +418,8 @@ def create_domain(target):
), False)
if answer: tags = answer
elif not tags: logs.out("255", '', True)
if '"' in tags: tags = tags.replace('"', '')
if not tags: invalid = True
elif '"' in tags: tags = tags.replace('"', '')
set_f = 'tags = "%s"'%tags
tyto.set_file(dom.config, False, set_f)
@ -433,8 +435,6 @@ def create_domain(target):
), False)
if answer: domlicense = answer
elif not domlicense: logs.out("255", '', True)
if '"' in domlicense: domlicense = domlicense.replace('"', '')
set_f = 'license = "%s"'%domlicense
@ -451,9 +451,11 @@ def create_domain(target):
langs.site.q, licurl
), False)
if answer: licurl = answer
if not licurl.startswith(valid_url):
if answer:
if answer.startswith(valid_url): licurl = answer
else: logs.out("2", '"http(s)://%s"%s'%(answer, langs.site.q), True)
logs.out("2", '"http(s)://%s"%s'%(licurl, langs.site.q), False)
licurl = ''
set_f = 'license_url = "%s"'%licurl
tyto.set_file(dom.config, False, set_f)
@ -469,9 +471,11 @@ def create_domain(target):
langs.site.q, legalurl
), False)
if answer: legalurl = answer
if not legalurl.startswith(valid_url):
if answer:
if answer.startswith(valid_url): legalurl = answer
else: logs.out("2", '"http(s)://%s"%s'%(answer, langs.site.q), True)
logs.out("2", '"http(s)://%s"%s'%(legalurl, langs.site.q), False)
legalurl = ''
set_f = 'legal_url = "%s"'%legalurl
tyto.set_file(dom.config, False, set_f)
@ -487,9 +491,11 @@ def create_domain(target):
langs.site.q, termsurl
), False)
if answer: termsurl = answer
if not termsurl.startswith(valid_url):
if answer:
if answer.startswith(valid_url): termsurl = answer
else: logs.out("2", '"http(s)://%s"%s'%(answer, langs.site.q), True)
logs.out("2", '"http(s)://%s"%s'%(termsurl, langs.site.q), False)
termsurl = ''
set_f = 'terms_url = "%s"'%termsurl
tyto.set_file(dom.config, False, set_f)
@ -505,7 +511,9 @@ def create_domain(target):
), False)
if answer: css = answer.lower()
if not css.isalnum(): logs.out("3", css, True)
if not css.isalnum():
logs.out("3", css, False)
css = 'tyto'
set_f = 'css = "%s"'%css
tyto.set_file(dom.config, False, set_f)
@ -521,7 +529,9 @@ def create_domain(target):
), False)
if answer: sep = answer
if not len(sep) == 1: logs.out("3", answer, True)
if not len(sep) == 1:
logs.out("3", answer, False)
sep = "-"
set_f = 'sep = "%s"'%sep
tyto.set_file(dom.config, False, set_f)
@ -557,9 +567,11 @@ def create_domain(target):
langs.site.q, relme
), False)
if answer: relme = answer
if not relme.startswith(valid_url):
if answer:
if answer.startswith(valid_url): relme = answer
else: logs.out("2", '"http(s)://%s"%s'%(answer, langs.site.q), True)
logs.out("2", '"http(s)://%s"%s'%(relme, langs.site.q), False)
relmel = ''
set_f = 'relme = "%s"'%relme
tyto.set_file(dom.config, False, set_f)
@ -576,7 +588,10 @@ def create_domain(target):
), False)
if answer: sdb_title = answer
if '"' in sdb_title: sdb_title = sdb_title.replace('"', '')
if not sdb_title:
sdb_title = ''
invalid = True
elif '"' in sdb_title: sdb_title = sdb_title.replace('"', '')
set_f = 'sidebar_title = "%s"'%sdb_title
tyto.set_file(dom.config, False, set_f)
@ -585,22 +600,27 @@ def create_domain(target):
# Sidebar Items
#--------------
try: sdb_items = dom.sidebar_items
except: sdb_items = "6"
except: sdb_items = 6
answer = asking(' ├ [max=16] %s. %s%s {%s} '%(
langs.site.sidebar, langs.site.form_sdb_i,
langs.site.q, sdb_items
), False)
if answer:
if answer.isdigit() and int(answer) in range(1,17):
sdb_items = int(answer)
else: logs.out("3", answer, True)
if answer: sdb_items = answer
if not str(sdb_items).isdigit() or not int(sdb_items) in range(1,17):
sdb_items = 6
set_f = 'sidebar_items = %d'%int(sdb_items)
tyto.set_file(dom.config, False, set_f)
# Domain config invalid, do not activate
if invalid:
tyto.set_file(dom.config, False, '\nactivated = False')
print(langs.site.form_inv)
logs.out("2", dom.config, True)
# Resumed configuration
#-----------------------
try: active = dom.activated

View File

@ -19,7 +19,7 @@
# XMPP: echolib (im@echolib.re)
#
# Description: Create HTML page
# File: /var/lib/tyto/program/show.py
# File: /var/lib/tyto/program/html.py
#----------------------------------------------------------------------
#------------
@ -33,7 +33,6 @@
#**********************************************************************
import os, sys, importlib
import logs, db, dom, tyto, form, langs
# Publish option can be
@ -62,8 +61,7 @@ def create_metas_page():
metas_page = ''
scale = 'width=device-width, initial-scale=1.0'
all_tags = dom.tags + ',' + db.tags
css_file = 'styles.css'
css_ref = 'href="%stemplate/%s"'%(db.sub_uri, css_file)
css_ref = 'href="%stemplate/%s"'%(db.sub_uri, dom.css)
rss_ref = 'type="application/rss+xml" ' + \
'href="%s%s" title="RSS 2.0. %s %s %s"'%(
db.sub_uri, dom.rss,
@ -80,7 +78,7 @@ def create_metas_page():
)
# Create author and date publish section infos
create_html_infos_section('wip')
create_html_time_meta('wip')
# Set all raw HTML metas
#-----------------------
@ -117,19 +115,14 @@ def create_metas_page():
# Set main page, with all HTML sections #
#---------------------------------------#
def create_main_page(target, article_bottom):
global main_page
if not tyto.exists(dom.wip_footer_f):
logs.out("1", dom.wip_footer_f, True)
if not tyto.exists(dom.wip_metas_f):
logs.out("24", '(HTML metas): %s'%dom.wip_metas_f, False)
global main_page, post_html_code
# Create link for website's logo
#-------------------------------
logo_html = '<a href="/"\n' + \
logo_html = \
'<a href="/"\n' + \
'%stitle="%s %s logo: %s"\n'%(11 * " ",
tyto.trans[1][tyto.n], dom.sep, dom.title
langs.site.home, dom.sep, dom.title
) + \
'%sid="site_logo_link">\n'%(11 * " ") + \
'%s<img src="%stemplate/%s"\n'%(
@ -139,6 +132,17 @@ def create_main_page(target, article_bottom):
'%sid="site_logo_image" />\n'%(15 * " ") + \
'%s</a>'%(8 * " ")
post_html_code = ''
if dom.article_code:
post_html_code = \
' <span id="article_code"> ' + \
' <a id="article_code_link"\n' + \
' href="./%s"\n'%os.path.basename(db.short_src) + \
' title="%s">{%s}</a></span>\n'%(
langs.site.tyto_psrc,
langs.site.source_code
)
#-----------------------#
# Create main HTML Page #
#-----------------------#
@ -156,7 +160,7 @@ def create_main_page(target, article_bottom):
'\n' + \
' <div id="site_infos">\n' + \
' <a href="/"\n' + \
' title="%s"\n'%(tyto.trans[1][tyto.n]) + \
' title="%s"\n'%(langs.site.home) + \
' id="site_link">\n' + \
' <h1 id="site_title">%s</h1>\n'%dom.title + \
' </a>\n' + \
@ -167,7 +171,17 @@ def create_main_page(target, article_bottom):
'\n' + \
' <article id="article_main">\n' + \
' <section id="article_infos">\n' + \
'%s\n'%post_pub + \
' <p>\n' + \
' <span id="article_title"\n' + \
' title="%s %s %s %s %s">%s</span>\n'%(
title, langs.site.w_written, db.date, langs.site.by,
db.author,
langs.site.article
) + \
'%s'%post_html_code + \
'%s\n'%time_html_pub + \
' <span id="article_author">%s</span>\n'%db.author + \
' </p>\n' + \
' </section>\n' + \
'%s\n'%article_bottom + \
' </article>\n' + \
@ -182,11 +196,12 @@ def create_main_page(target, article_bottom):
# Create HTML line for article infos section #
# when wip, and publish #
#--------------------------------------------#
def create_html_infos_section(process):
def create_html_time_meta(process):
# Need to reload the DB to get last time updated
exec(open(db.config).read(), globals())
global post_pub, meta_pub, date_raw
global time_html_pub, meta_pub, date_raw
if process == 'wip':
date_raw = date_wip # <time datetime= / meta search_date
date_pub = date_wip.rsplit(' ')[0]
@ -196,47 +211,25 @@ def create_html_infos_section(process):
date_pub = date_www.rsplit(' ')[0]
time_pub = date_www.rsplit(' ')[1]
if tyto.n == 0: # fr
if dom.lang_site == 'fr':
date_new = date_pub.rsplit('-')
date_pub = date_new[2] + '/' + date_new[1] + '/' + date_new[0]
# Show source code in article-infos if True in DB
post_code = ''
if dom.article_code:
# Set HTML
post_code = \
'<span id="article_code"> ' + \
'<a id="article_code_link" href="./%s" title="%s">{%s}</a>'%(
os.path.basename(db.short_src),
tyto.trans[21][tyto.n],
tyto.trans[3][tyto.n]
) + \
' </span>'
# in <article> > section info : line with new date
post_pub = \
'%s<p>'%(8 * ' ') + \
'<span id="article_title" title="%s">Article%s</span> '%(title,
post_code
time_html_pub = \
' <!--TYTOPUB-->\n' + \
' <time datetime="%s">\n'%date_raw + \
' <span id="article_pub"\n' + \
' title="%s %s %s">%s %s (%s)</span>\n'%(
title, langs.site.w_published, date_pub,
langs.site.published, date_pub, time_pub
) + \
'<span title="%s %s">%s</span> '%(tyto.trans[10][tyto.n],
date[0],
tyto.trans[7][tyto.n]
) + \
'<span id="article_author">%s</span>. %s '%(author,
tyto.trans[8][tyto.n]
) + \
'<time datetime="%s">'%date_raw + \
'<span id="article_date">%s</span> %s '%(date_pub,
tyto.trans[9][tyto.n]
) + \
'<span id="article_time">%s</span>'%time_pub + \
'</time>' + \
'</p>'
' </time> %s\n'%langs.site.by + \
' <!--/TYTOPUB-->'
# meta search_date=
meta_pub = ' <meta name="search_date" content="%s" />\n'%(
meta_pub = \
' <meta name="search_date" content="%s" />\n'%(
date_raw.rsplit(' ')[0]
)
@ -271,15 +264,14 @@ def create_user_metas(option):
else: user_metas = '%s%s'%(tab, line)
tyto.set_file(target, True, user_metas)
logs.out("33", target, False)
logs.out("32", target, False)
#==================================#
# Create HTML navbar from config #
# If no index in src: STOP #
# For wip, create if no index.html #
# for publish all/navbar, STOP #
#----------------------------------#
#==============================================#
# Create HTML sidebar from file tyto.navbar #
# If no index file in src directory: pass # #
# Create empty file in template/ if not exists #
#----------------------------------------------#
def create_navbar(option):
dom.valid()
@ -297,7 +289,7 @@ def create_navbar(option):
'%s<nav id="site_menu">\n'%(6 * ' ') + \
'%s<ul id="site_menu_items">'%(8 * ' ')
navbar_lines = open(db.navbar_load, 'r').read()
navbar_lines = open(dom.navbar_f, 'r').read()
for line in navbar_lines.rsplit('\n'):
if not line or line.startswith(nolines): continue
@ -368,7 +360,6 @@ def create_navbar(option):
if not tyto.exists(target):
tyto.set_file(target, 'New', '')
logs.out("32", target, False)
return
logs.out('28', '%s'%langs.log.navbar, False)
return
@ -387,9 +378,10 @@ def create_navbar(option):
logs.out("32", target, False)
#============================================#
#==============================================#
# Create HTML sidebar from file tyto.sidebar #
#--------------------------------------------#
# Create empty file in template/ if not exists #
#----------------------------------------------#
def create_sidebar(option):
dom.valid()
@ -406,7 +398,7 @@ def create_sidebar(option):
# Set HTML sidebar
sidebar_list = ''
sidebar_html = \
'<aside>\n' + \
'<aside id="sidebar">\n' + \
' <h1 id="sidebar_title">%s</h1>\n' + \
' <ul id="sidebar_list">\n' + \
'%s' + \
@ -485,7 +477,6 @@ def create_sidebar(option):
if not tyto.exists(target):
tyto.set_file(target, 'New', '')
logs.out("32", target, False)
return
logs.out('28', '%s'%langs.log.sidebar, False)
return
@ -511,16 +502,14 @@ def create_sidebar(option):
#===================================================#
# Create footer.html from _configs/tyto.footer.html #
# Opiton 'pub' force create (when publish) #
#---------------------------------------------------#
#----------------------------------------------=====#
def create_user_footer(option):
dom.valid()
if option == 'wip': target = dom.wip_footer_f
elif option == 'www': target = dom.www_footer_f
elif option == 'pub': target = dom.www_footer_f
elif option in pub_opts: target = dom.www_footer_f
if not option == 'pub' and tyto.exists(target):
if option == 'www' and tyto.exists(target):
form.asking('%s. %s%s '%(
langs.site.footer, langs.site.form_rep, langs.site.q
), True)

View File

@ -17,7 +17,7 @@
#**********************************************************************
import os
import os, langs
def tyto(target):
noinfos = False
@ -46,51 +46,5 @@ def tyto(target):
noinfo = True
print(':< No .../.local/tyto')
# Show Usage
print(
'\n# New domain:\n'
' - Create your domain folder, and go in\n'
' - Create domain with "tyto new domain [URL]"\n'
' - Create article\'s file in articles/ directory\n'
' - Use these actions on article\'s file: Check > wip > publish\n'
' ! Config\'s files are in _configs/ directory\n'
' and used to create HTML file in your template\n'
' Your template files (css, logo...) go to wip/template/ server\n\n'
'# Usage: tyto [action] [target] \n'
' - [action] according to [target]:\n'
' edit : Edit article\'s file\n'
' edit-db : Edit article\'s database (TAKE CARE !)\n'
' edit-wip: Edit html file in wip server\n'
' edit_www: Edit html file in www server\n'
' new : Create new (domain, sidebar/footer... config\'s file)\n'
' show : Show content of config\'s file\n'
' show-about: Show content of custom footer config\n'
' show-db : Show content of article\'s database\n'
' show-wip: Show HTML file in wip server\n'
' show-www: Show HTML file in www server\n\n'
' check : Check if article is valid\n'
' wip : Create page in wip server\n'
' publish : Create page in www server\n\n'
' - [target] according to [action]\n'
' all : process (updated) valid articles\n'
' again : process ALL valid articles\n'
' newer : [wip/publish] convert only newer articles\n'
' template: - Create navbar/sidebar/metas/footer in www server\n'
' - Copy other wip/template/ files to www server\n'
' domain : Create/Show config file\n'
' [file] : URI of an article\'s file (autocompletion is your friend)\n'
' footer : Create/Show footer HTML config\'s file\n'
' metas : Create/Show metas HTML config\'s file\n'
' navbar : Create/Show navbar config\'s file\n'
' sidebar : Create/Show sidebar config\'s file\n'
' stats : Create statistics file in root srv\n\n'
'# Examples:\n'
' - Check article\'s syntax: tyto check mysubdir/index.tyto\n'
' - Create default _configs/tyto.sidebar: tyto new sidebar\n'
' - Edit _configs/tyto.navbar: tyto edit navbar\n'
' - Edit index.html in www server: tyto edit-www index.tyto\n'
' - Create sidebar.html in wip server: tyto wip sidebar\n'
' - Show sidebar.html in wip server: tyto show-wip sidebar\n'
' - Create navbar.html in www server: tyto publish navbar\n'
' - Show navbar.html in www server: tyto show-www navbar\n'
)
print(':', langs.site.args_helps)

View File

@ -39,7 +39,7 @@ def out(nbr, value, out):
'6' : '%s%s%s > %s'%(CR, langs.log.sep_inv, CS, value),
'7' : '%s%s%s > %s'%(CR, langs.log.post_inv, CS, value),
'8' : '%s%s%s %s'%(CR, langs.log.mark_np, CS, value),
'9' : 'Article %shas changed%s. Check it first'%(CR, CS),
'9' : '%s%s%s > %s'%(CR, langs.log.post_chg, CS, value),
'10' : '%s%s%s'%(CR, langs.log.dom_no, CS),
'11' : '%s%s%s > %s'%(CR, langs.log.err_arg, CS, value),
'12' : '%s%s%s > %s'%(CR, langs.log.post_inc, CS, value),
@ -49,8 +49,8 @@ def out(nbr, value, out):
'16' : '%s%s%s "%s = ?"'%(CR, langs.log.unused_c, CS, value),
'17' : '%s%s%s "%s ?"'%(CR, langs.log.unused_v, CS, value),
'18' : '%s%s%s > %s'%(CR, langs.log.unused_p, CS, value),
'19' : 'Article %swip%s on: %s'%(CG, CS, value),
'20' : '%s%s%s %s'%(CG, langs.log.check_on, CS, value),
'19' : '%s%s%s %s'%(CG, langs.log.was_wip, CS, value),
'20' : '%s%s%s %s'%(CG, langs.log.was_chk, CS, value),
'21' : '%s%s%s > %s'%(CG, langs.log.post_val, CS, value),
'22' : '%s%s%s %s'%(CY, langs.log.symb_np, CS, value),
'23' : '%s%s%s > %s'%(CY, langs.log.db_inv, CS, value),
@ -61,6 +61,7 @@ def out(nbr, value, out):
'28' : '%s (%s)'%(langs.log.ntd, value),
'29' : '%sEmpty configuration%s %s'%(CY, CS, value),
'30' : '%s%s%s > %s'%(CY, langs.log.nywip, CS, value),
'31' : '%s%s%s'%(CR, langs.log.nomods, CS),
'32' : ' ╞══ %s%s%s > %s'%(CG, langs.log.file_c, CS, value),
'33' : ' ╞══ %s%s%s > %s'%(CG, langs.log.dir_c, CS, value),
'34' : ' ╞══ %s%s%s > %s'%(CG, langs.log.file_n, CS, value),
@ -73,6 +74,7 @@ def out(nbr, value, out):
'43' : '%s%s%s'%(CY, langs.log.dom_no, CS),
'44' : '%s%s%s "tyto check %s"'%(CY, langs.log.check_m, CS, value),
'51' : '%s%s%s > %s'%(CY, langs.log.data_inc, CS, value),
'60' : '\n%s'%langs.log.status_r,
'255' : '%s'%langs.log.laterout
}

View File

@ -5,8 +5,8 @@
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License
# as published by the Free Software Foundation, either version 3 of the License, or
# of the License, or (at your option) any later version.
# as published by the Free Software Foundation, either version 3 of the
# License, or of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
@ -35,7 +35,7 @@
#**********************************************************************
import os, sys, importlib
import args, logs, dom, db, form, tyto, check, stats, langs
import args, logs, langs, dom, db, form, tyto, check, html, stats
#========================#
# Read lines from a file #
@ -62,7 +62,7 @@ def read_lines(f, alone):
else: decor = ''
print(' %s%s─┘'%(decor, sp_max * ''))
dom.valid()
if not f == dom.config: dom.valid()
#======================#
@ -178,9 +178,13 @@ def manage(target):
# If edit article and hash changed, ask to check
if args.action == "edit" and post_src:
if args.action == "edit":
new_hash = tyto.get_filesum(file, True)
if curr_hash != new_hash:
if curr_hash == new_hash: return
# Launch process for some changed file
#-------------------------------------
if file == post_src:
form.asking('%s%s '%(
langs.site.post_chg, langs.site.q
@ -190,3 +194,8 @@ def manage(target):
importlib.reload(db)
check.manage(post_src)
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')

View File

@ -23,14 +23,14 @@ def domain():
if dom.hole: logs.out("13", '', True)
elif not dom.shortname: return
elif dom.incomplete: logs.out("41", dom.shortname, False)
elif dom.activated: logs.out("42", dom.shortname, False)
elif not dom.activated: logs.out("40", dom.shortname, False)
elif dom.active: logs.out("42", dom.shortname, False)
elif not dom.active: logs.out("40", dom.shortname, False)
if dom.incomplete:
# Show unused values
for err_val in dom.err_val:
logs.out("16", err_val, False)
# Missing directories was created
# Missing directories (was created)
for dir_new in dom.dir_new:
logs.out("33", dir_new, False)
@ -47,11 +47,27 @@ def domain():
for value in dom.file_mod:
create_files[value]('form')
for file_mods in dom.wip_html_mods:
if not tyto.exists(file_mods):
logs.out("1", file_mods, False)
#==============================#
# On demand with status action #
#------------------------------#
def check(target):
conf_err = False
if target == "domain":
for file_new in dom.file_new:
logs.out("24", file_new, False)
if dom.dir_unu or dom.file_unu:
logs.out("60", '', False)
for dir_unu in dom.dir_unu:
logs.out("1", dir_unu, False)
conf_err = True
for file_unu in dom.file_unu:
logs.out("24", file_unu, False)
if conf_err:
logs.out("31", '', True)

View File

@ -1,11 +1,27 @@
#!/usr/bin/env python3
# Name: Tyto - Littérateur
# Type: Global functions for Tyto
# Description: Settings, Tools and
# file: tyto.py
# Folder: /var/lib/tyto/program/
# By echolib (XMPP: im@echolib.re)
# License: GNU AFFERO GENERAL PUBLIC LICENSE Version 3, 19 November 2007
# Tyto - Littérateur
#
# Copyright (C) 2023 Cyrille Louarn <echolib+tyto@a-lec.org>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License
# as published by the Free Software Foundation, either version 3 of the
# License, or of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#----------------------------------------------------------------------
# XMPP: echolib (im@echolib.re)
#
# Description: Tools and some seetings.
# File: /var/lib/tyto/program/tyto.py
#----------------------------------------------------------------------
#------------
# funny stats
@ -19,47 +35,14 @@
import os, sys, subprocess, locale, base64, datetime, shutil
from hashlib import blake2b
import args, dom, logs
# TEMP
lang = 'fr'
if lang.lower() == 'fr': n = 0
else: n = 1
#--
# :D
Tyto = 'Tyto - Littérateur'
Tytogit = 'https://git.a-lec.org/echolib/tyto-litterateur'
Tytoweb = 'https://tyto.echolib.re'
stats_f = 'tyto_statoolinfos.conf'
# Translations French/English
trans = [
('À l\'affiche !', 'Featured !'), # 0
('Accueil', 'Home'), # 1
('Licence', 'License'), # 2
('Code source', 'Source code'), # 3
('Dépôt officiel du code source de %s'%Tyto , '%s\'s official source code repository'%Tyto),
('Site web officiel du logiciel libre %s'%Tyto, '%s\'s official website'),
('L\'article', 'The article'), # 6
('écrit par', 'written by'), # 7
('Publié le', 'Published the'), # 8 date for section HTML (article_infos)
('à', 'at'), # 9 time format
('rédigé le', 'created the'), # 10
('À Propos de', 'About'), # 11
('Générateur :', 'Generator:'), # 12
('Contacter par courriel', 'Contact by mail'), # 13
('Courriel', 'Mail'), # 14
('C.G.U.', 'T.o.U'), # 15
('Mentions légales', 'Legal Notice'), # 16
('Conditions Générales d\'Utilisation', 'Terms of Use'), # 17
('Loi', 'Law'), # 18
('Articles de', 'Articles from'), # 19
('Lire l\'article:', 'Read the article:'), #20
('Voir le code source au format Tyto de cet article', 'See this article\'s source code in Tyto format') #21 (title)
]
# Needed header tags
needed_header_tags = \
@ -96,7 +79,8 @@ opt_tags_check_uri = \
)
# Set all tags used in article's header
headers = (
headers = \
(
'title:',
'about:',
'author:',
@ -206,8 +190,8 @@ def exists(uri):
# False = URI #
#-----------------------#
def get_filesum(path, src):
if not exists(path):
logs.out("1", path, True)
#if not src and not exists(path):
# logs.out("1", path, True)
file_sum = blake2b(digest_size=4)

View File

@ -38,50 +38,22 @@
import os, re, sys, locale, shutil, importlib, time
from pathlib import Path
import args, logs, dom, db, tyto, html, form, stats
# load locale translation
trans_dir = '/var/lib/tyto/translations'
sys.path.insert(0, trans_dir)
# System language
try: lang_sys = locale.getdefaultlocale()[0].split('_')[0]
except: lang_sys = 'en'
# Get default system language
# or set "en" (english) if no translation file
try:
lang_site = lang_sys
os.path.exists('%s/site_%s.py'%(trans_dir, lang_site))
except:
lang_site = 'en'
# 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))
tr = importlib.import_module('site_%s'%lang_site, package=None)
except:
tr = importlib.import_module('site_%s'%lang_site, package=None)
import args, logs, langs, dom, db, tyto, html, form, stats
#=========================================#
# Manage wip action with option as target #
#-----------------------------------------#
def manage_wip(target):
global post_db, hash_post, target_all
# Check if can process
def manage(target):
dom.valid()
global post_db, hash_post, target_all
# wip_article(db.post_src) ; return # Force wip without checking
# Target is footer, sidebar, navbar, metas
#-----------------------------------------
if target in args.pass_targets:
if not target:
logs.out("5", '[target]', True)
elif target in args.pass_targets:
do = {
'all' : wip_all,
'again' : wip_all,
@ -100,10 +72,14 @@ def manage_wip(target):
# Per article with target
#------------------------
# Exit with these conditions
if not target: logs.out("5", '', True)
if not db.exists: sys.exit(1)
if not db.config: logs.out("25", db.uri_file, True)
if db.old_chk: logs.out("9", db.uri_file, True)
if not db.post:
logs.out("1", db.uri_file, True)
elif not db.exists:
logs.out("28", '%s %s'%(args.action, args.target), True)
elif db.old_chk:
logs.out("9", db.uri_file, True)
# Article has changed or wip file missing
if db.old_wip or not db.file_wip:
@ -112,7 +88,7 @@ def manage_wip(target):
# wip is up-to-date: ask to wip again
else:
logs.out("19", db.date_wip, False)
form.asking(' ├ [%s] %s%s '%(db.title, tr.wip_new, tr.q), True)
form.asking(' ├ [%s] %s%s '%(db.title, langs.site.wip_new, langs.site.q), True)
wip_article(db.uri_file)
@ -819,7 +795,7 @@ def convert_list(markdown_str):
index = -1
# Cut string with \n's
strlist = markdown_str.split("\n")
strlist = markdown_slangs.site.split("\n")
# Find items
for i in range(len(strlist)):

View File

@ -22,25 +22,28 @@ unused_r = "Unused ressource"
unused_c = "Unused database value"
db_inv = "Corrupted article's database"
err_arg = "Argument error"
no_arg = "Unused argument with"
no_arg = "Unused argument"
no_fidi = "Black Hole: no file or directory here"
dom_ina = "Inactive domain"
dom_inc = "Incomplete domain"
dom_act = "Active domain"
data_inc = "Incomplete data"
data_inv = "Invalid data"
dom_no = "No domain found"
no_fidi = "Blask Hole: no file or directory here"
file_c = "File created"
file_n = "File changed"
file_e = "File exists"
dir_c = "Directory created"
dir_e = "Directory exists"
check_on = "Article was check the"
was_chk = "Article 'check'"
was_wip = "Article already 'wip'"
check_m = "Check manually"
post_inc = "Unused in article"
post_inv = "Article not valid"
post_val = "Article is valid"
post_chg = "Article changed: 'check' it first"
sep_inv = "Unused separator in article"
unused_v = "Unused value in article"
unused_p = "Empty article"
@ -52,5 +55,9 @@ nyfile = "file not yet created"
nycheck = "Article not yet checked"
nywip = "Article not yet wip"
add = "Add:"
nomods = "Create HTML modules first"
status_r = "Checking unused ressources..."
was_wip = "Article already 'wip'"
laterout = "Maybe later..."

View File

@ -23,25 +23,27 @@ unused_r = "Ressource manquante"
unused_c = "Valeur de la base de donnée manquante"
db_inv = "Base de donnée de l'article corrompue"
err_arg = "Erreur d'argument"
no_arg = "Argument manquant avec"
no_arg = "Argument manquant"
no_fidi = "Trou Noir: aucun fichier ou dossier ici"
dom_ina = "Domaine inactif"
dom_inc = "Domaine incomplet"
dom_act = "Domaine actif"
data_inc = "Donnée incomplète"
data_inv = "Donnée invalide"
dom_no = "Aucun domaine trouvé"
no_fidi = "Trou Noir: aucun fichier ou dossier ici"
file_c = "Fichier créé"
file_n = "Fichier modifié"
file_e = "Fichier présent"
dir_c = "Dossier créé"
dir_e = "Dossier présent"
check_on = "Article vérifié le"
was_chk = "Article déjà vérifié"
was_wip = "Article déjà 'wip'"
check_m = "Vérifier manuellement"
post_inc = "Donnée manquante dans l'article"
post_inv = "Article non valide"
post_val = "Article valide"
post_chg = "Article modifié : commencer par 'check'"
sep_inv = "Séparateur manquant dans l'article"
unused_v = "Valeur manquante dans l'article"
unused_p = "L'article est vide"
@ -53,6 +55,7 @@ nyfile = "Fichier pas encore créé"
nycheck = "Article pas encore 'check'"
nywip = "Article pas encore 'wip'"
add = "Ajout:"
nomods = "Créer d'abord les modules HTML"
status_r = "Vérification des ressources manquantes..."
laterout = "Pour plus tard..."

View File

@ -21,6 +21,7 @@ This is a python file, so... DO NOT REMOVE:
'''
# Generic
article = "Article"
sidebar = 'Sidebar'
navbar = 'Navbar'
metas = 'Metas Tags'
@ -28,6 +29,7 @@ footer = 'Footer'
title = 'Title'
File = 'File'
name = 'Name'
by = 'par'
q = '?'
i = '!'
pp = ":"
@ -39,6 +41,11 @@ source_code = "Source code"
home = "Home"
go_home = "Go to Homepage"
read = "Read"
tyto_psrc = "Show this article's source code in Tyto format"
w_written = "was written the"
w_published = "was published the"
written = "written the"
published = "wpublished the"
# Sidebar
site_sdb_t = "Featured..."
@ -83,6 +90,10 @@ form_ready = ' │\n' + \
' ├──────────────────────────────────────┐\n' + \
' │ Domain is ready. Have fun, writers ! │\n' + \
' └──────────────────────────────────────┘'
form_inv = '\n' + \
' ├─────────────────────────────────────┐\n' + \
' │ Domain is INVALID. Try form again ! │\n' + \
' └─────────────────────────────────────┘'
form_opt = "[Optional]"
form_url = "URL to official website?"
@ -215,3 +226,54 @@ footer_about_doc = \
'# - begin with "#"\n' + \
'# - Do NOT copy to template directory\n' + \
'# %s\n'%(20 * "-")
# Help with Tyto commands
args_helps = """\n# New domain:
- Create your domain folder, and go in
- Create domain with 'tyto new domain [URL]'
- Create article\'s file in articles/ directory
- Use these actions on article\'s file: Check > wip > publish
! Config\'s files are in _configs/ directory
and used to create HTML file in your template
Your template files (css, logo...) go to wip/template/ server\n
# Usage: tyto [action] [target]
- [action] > according to [target]:
edit : Edit a file (article, config's module)
edit-about: specific for (footer), or like [edit-db]
edit-db : Edit a config file (domain, article (TAKE CARE !))
edit-wip : Edit html file in wip server
edit_www : Edit html file in www server
new : Create new (domain, sidebar/footer... config's file)
show : Show content file (article, config's module)
show-about: specific for (footer), or like [show-db]
show-db : Show content of article\'s database
show-wip : Show content of HTML file in wip server
show-www : Show content of HTML file in www server\n
check : Check if article is valid and ready to convert
wip : Create HTML page in wip server
publish : Create HTML page in www server\n
- [target] > according to [action]
all : process (updated) valid articles
again : process again ALL valid articles
newer : [wip/publish] convert only newer articles
template : - Create new navbar/sidebar/metas/footer in www server
- Copy other wip/template/ files to www server
domain : Create/Show domain config's file
[file] : URI of an article's file (autocompletion's friend)
footer : Create/Show footer HTML config's file
metas : Create/Show metas HTML config's file
navbar : Create/Show navbar config's file
sidebar : Create/Show sidebar config's file
stats : Create statistics file in root server\n
# Examples:
- Check article's syntax: tyto check mysubdir/index.tyto
- Create default _configs/tyto.sidebar: tyto new sidebar
- Edit _configs/tyto.navbar: tyto edit navbar
(each edition launches process if file changed like:
- check
- (navbar, sidebar, metas, footer) : create file on wip server)
- Edit index.html in www server: tyto edit-www index.tyto
- Create sidebar.html in wip server: tyto wip sidebar
- Show footer.html in wip server: tyto show-wip footer
- Create metas.html in www server: tyto publish metas
- Show navbar.html in www server: tyto show-www navbar"""

View File

@ -21,13 +21,15 @@ Ceci est un fichier python, donc... NE PAS ENLEVER :
'''
# Generic
article = "Article"
sidebar = 'Barre Latérale'
navbar = 'Barre de navigation'
metas = 'Balises Metas'
footer = "Pied de Page"
footer = 'Pied de Page'
title = 'Titre'
File = 'Fichier'
name = 'Nom'
by = 'par'
q = ' ?'
i = ' !'
pp = " :"
@ -39,6 +41,11 @@ source_code = "Code source"
home = "Accueil"
go_home = "Aller à la page d'accueil"
read = "À lire"
tyto_psrc = "Voir le code source au format Tyto de cet article"
w_written = "a été écrit le"
w_published = "a été publié le"
written = "écrit le"
published = "publié le"
# Barre latérale
site_sdb_t = "À l'affiche..."
@ -84,6 +91,10 @@ form_ready = ' │\n' + \
' ├─────────────────────────────────────────┐\n' + \
' │ Le domaine est prêt. Amusez-vous bien ! │\n' + \
' └─────────────────────────────────────────┘'
form_inv = '\n' + \
' ├───────────────────────────────────────────┐\n' + \
' │ Le Domaine est INVALIDE. Essayez encore ! │\n' + \
' └───────────────────────────────────────────┘'
form_opt = "[Optionnel]"
form_url = "URL du site web officiel"
@ -216,3 +227,54 @@ footer_about_doc = \
'# - commencent par "#"\n' + \
'# - Ne PAS copier ce fichier dans le dossier template\n' + \
'# %s\n'%(20 * "-")
# Help with Tyto commands
args_helps = """\n# New domain:
- Create your domain folder, and go in
- Create domain with 'tyto new domain [URL]'
- Create article\'s file in articles/ directory
- Use these actions on article\'s file: Check > wip > publish
! Config\'s files are in _configs/ directory
and used to create HTML file in your template
Your template files (css, logo...) go to wip/template/ server\n
# Usage: tyto [action] [target]
- [action] > according to [target]:
edit : Edit a file (article, config's module)
edit-about: specific for (footer), or like [edit-db]
edit-db : Edit a config file (domain, article (TAKE CARE !))
edit-wip : Edit html file in wip server
edit_www : Edit html file in www server
new : Create new (domain, sidebar/footer... config's file)
show : Show content file (article, config's module)
show-about: specific for (footer), or like [show-db]
show-db : Show content of article\'s database
show-wip : Show content of HTML file in wip server
show-www : Show content of HTML file in www server\n
check : Check if article is valid and ready to convert
wip : Create HTML page in wip server
publish : Create HTML page in www server\n
- [target] > according to [action]
all : process (updated) valid articles
again : process again ALL valid articles
newer : [wip/publish] convert only newer articles
template : - Create new navbar/sidebar/metas/footer in www server
- Copy other wip/template/ files to www server
domain : Create/Show domain config's file
[file] : URI of an article's file (autocompletion's friend)
footer : Create/Show footer HTML config's file
metas : Create/Show metas HTML config's file
navbar : Create/Show navbar config's file
sidebar : Create/Show sidebar config's file
stats : Create statistics file in root server\n
# Examples:
- Check article's syntax: tyto check mysubdir/index.tyto
- Create default _configs/tyto.sidebar: tyto new sidebar
- Edit _configs/tyto.navbar: tyto edit navbar
(each edition launches process if file changed like:
- check
- (navbar, sidebar, metas, footer) : create file on wip server)
- Edit index.html in www server: tyto edit-www index.tyto
- Create sidebar.html in wip server: tyto wip sidebar
- Show footer.html in wip server: tyto show-wip footer
- Create metas.html in www server: tyto publish metas
- Show navbar.html in www server: tyto show-www navbar"""

View File

@ -0,0 +1,75 @@
# Home Domain
directory = ""
database = ""
# Local user configuration
lang_sys = "SYS"
local_user = ""
lang_logs = "SYS"
articles_db_d = ""
# Working directories
articles_d = ""
files_d = ""
images_d = ""
modules_d = ""
# Modules files
navbar_f = ""
sidebar_f = ""
metas_f = ""
footer_f = ""
footer_about_f = ""
# Domain
shortname = ""
www_url = ""
wip_url = ""
# Servers directories
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 = ""
# Servers files
wip_navbar_f = ""
wip_sidebar_f = ""
wip_metas_f = ""
wip_footer_f = ""
www_navbar_f = ""
www_sidebar_f = ""
www_metas_f = ""
www_footer_f = ""
wip_logo_f = ""
www_logo_f = ""
www_rss_f = ""
# Domain user's settings
logo = "logo.png"
rss = "rss.xml"
rss_items = 100
title = ""
date = ""
about = ""
lang_site = "SYS"
mail = ""
tags = ""
license = ""
license_url = ""
legal_url = ""
terms_url = ""
css = "tyto"
sep = "-"
article_code = False
relme = ""
sidebar_title = ""
sidebar_items = 6
activated = False