[1.9.27] - See changelog

This commit is contained in:
Cyrille L 2023-10-26 18:59:56 +02:00
parent 3406954067
commit b9a41bb8bb
9 changed files with 400 additions and 152 deletions

View File

@ -9,6 +9,15 @@ Tyto - Littérateur
# CURRENTLY IN DEV !
## [1.9.27]
- fix when target article .tyto is missing
- Nearly all stats are added in DB from modules
- Only used tags and stats (or nearly) are added to DB
- cleaner code
- check:
- - added words_tags (strong, italics...)
- - "all" target now ready
## [1.9.26]
- user can indent titles in text
- prepared words markers (strong, bolds) (some to add soon)

106
README.md
View File

@ -16,3 +16,109 @@ tyto
- stats for article words
- Translate logs in english !
## Exemple d'article
```
Pour ne pas inclure cet article dans les sitemaps :
! NoSitemap
title: tests d'un article
about: À propos de cet article de test
tags: hello, my big world,here
author: echolib
date: 2023-09-30
logo: /testimg/hi.png
link: Lien à reprendre
https://
Text alternatif
link: Réservez ici
https://
Billets
file: voir l'image
PNGs/hi.png
Un png !
image: MyCar
PNGs/hi.png
Un png !
file: télécharger ce fichier
@PDFs/hello.pdf
Un PDF !
abbr: css
Cascading StyleSheet
CSS
abbr: HTML
Hyper Text Markup Langage
HTML
code: test
@RAWS/test.py
Du code à afficher en HTML
-----
# La ligne suivante est un commentaire HTML "<!-- Commentaire -->"
;; Commentaire
-> top
#1 Titre en h2
((
;; HTML comment
# Show logo set in header, using '_image:logo'
_image:logo tyto_logo w=120
))
-> newtitle
#2 Titre en h3 décalé dans le texte
((
Parce que c'est *_bien_* comme /_présentation_/ *_erreur
ou pas, si fermé_*
/_ ;_echolib_; _/
))
((
Il /_faut_/ ce __Lien à reprendre et __Réservez ici et --télécharger ce fichier
ou encore faire une ::css pour du ::HTML. __Réservez ici et --voir l'image
icode 1 : {_hello(_world_)_}, icode 2 : {_print("")_}
icode 3 : {_{__}_}, icode 4 : {_echo "Hello"_}
))
((
_image:MyCar
<: mylist
+ Item 1
++ Sub-Item 1
+++ Sub-Sub-item 1
==== >_top: Go to Top_<
==== >_top: Another anchor_<
:>
))
_code:test
{{
# Du code brut pour Tyto
{{
Un exemple de code
}}
}}
[[
["
;; A great quote here !
cite: Someone
date: 2023-10-13
book: A History
lang: EN
link: https://...
((
Here, i am
))
"]
]]
```

View File

@ -1,5 +1,5 @@
#!/usr/bin/env python3
# Version: 1.9.26
# Version: 1.9.27
# Updated: 2023-10-18 1697613100
# Tyto - Littérateur

View File

@ -58,7 +58,7 @@ def ready():
def manage(action, target):
# target is "all"
if args.targets:
multiple_targets
multiple_targets()
return
# target is not "all"
@ -71,7 +71,9 @@ def manage(action, target):
# Also used with multiple (loop) #
#--------------------------------#
def is_article(target):
valid(target) or tools.exit(targets, post.error)
if not valid(target):
if targets: return
else: sys.exit(post.error)
# When all is OK
# Will create post database, but now, show some values
@ -83,7 +85,7 @@ def is_article(target):
print()
"""
# Write to post database
cf_update_values()
cf_update_values("after")
#===========================================#
@ -95,7 +97,9 @@ def valid(target):
targets = args.targets
# Target is a tyto article format
post.is_article(target) or tools.exit(targets, post.error)
if not post.is_article(target):
return False
if not post.do_chk:
post.error = debug.out(210, post.chk_date, post.uri, True, 0, False)
return False
@ -104,6 +108,9 @@ def valid(target):
tools.create_file(post.cf_uri, post.ini_template)
post.cf_load()
# Add statistics to post database
cf_update_values("before")
global css
css = domain.css
@ -141,6 +148,10 @@ def valid(target):
post.error == 0 and anchors_links() \
or tools.exit(targets, post.error)
# Words Tags (Strong, bold...)
post.error == 0 and words_tags() \
or tools.exit(targets, post.error)
# Quotes
post.error == 0 and sl_ptags(post.ptags[1]) \
or tools.exit(targets, post.error)
@ -165,6 +176,7 @@ def valid(target):
#-------------------------------------------#
def multiple_targets():
ready()
post.find_tyto_article()
#=====================#
@ -174,16 +186,22 @@ def multiple_targets():
# One Line needed tags #
#----------------------#
def ol_tags():
global sitemap, src_uri
global sitemap, src_uri, stats_tyto_head_coms
global stats_total_files
stats_total_files = 0
sitemap = "True"
stats_tyto_head_coms = 0
for ln, line in enumerate(headers, 1):
# Optional one line markers
if line.startswith("#"):
post.stats_tyto_head_coms += 1
stats_tyto_head_coms += 1
post.cf_set("STATS_HEADERS", "tyto_coms", str(stats_tyto_head_coms))
elif line.startswith(post.nositemap):
sitemap = "False"
post.cf_set("HEADERS", "sitemap", "False")
elif line.startswith(post.logo[0]):
if not post.logo[1]:
post.logo = (post.logo[0], ol_tag_value(line, False))
@ -197,29 +215,36 @@ def ol_tags():
# ===========================
elif not post.title[1] and line.startswith(post.title[0]):
post.title = (post.title[0], ol_tag_value(line, False))
if not is_ol_tag(post.title[0], post.title[1]):
return False
post.cf_set("HEADERS", "title", post.title[1])
elif not post.about[1] and line.startswith(post.about[0]):
post.about = (post.about[0], ol_tag_value(line, False))
if not is_ol_tag(post.about[0], post.about[1]):
return False
post.cf_set("HEADERS", "about", post.about[1])
elif not post.date[1] and line.startswith(post.date[0]):
post.date = (post.date[0], ol_tag_value(line, False))
if not is_ol_tag(post.date[0], post.date[1]):
return False
elif not is_valid_date(post.date[1]):
return False
post.date = ("date:", tools.local_date(post.date[1]))
post.cf_set("HEADERS", "date", post.date[1])
elif not post.author[1] and line.startswith(post.author[0]):
post.author = (post.author[0], ol_tag_value(line, True))
if not is_ol_tag(post.author[0], post.author[1]):
return False
post.cf_set("HEADERS", "authors", post.author[1])
elif not post.tags[1] and line.startswith(post.tags[0]):
post.tags = (post.tags[0], ol_tag_value(line, True))
# Sets are done from loop
# Check if tag value exists
# =========================
if not is_ol_tag(post.date[0], post.date[1]): return False
if not is_valid_date(post.date[1]): return False
if not is_ol_tag(post.title[0], post.title[1]): return False
if not is_ol_tag(post.about[0], post.about[1]): return False
if not is_ol_tag(post.author[0], post.author[1]): return False
if not is_ol_tag(post.tags[0], post.tags[1]): return False
if not is_ol_tag(post.tags[0], post.tags[1]):
return False
post.cf_set("HEADERS", "tags", post.tags[1])
# Default domain logo for this post
if not post.logo[1]:
@ -273,6 +298,7 @@ def is_valid_date(date):
try:
parse(date)
chk_date = tools.nowdate()
post.cf_set("CHECK", "date", chk_date)
return True
except:
post.error = debug.out(50, "%s"%date, post.uri, True, 2, False)
@ -293,13 +319,19 @@ def ml_tags():
continue
if line.startswith(post.ml_tags):
tag = line.rsplit(":")[0] + ":"
tag_name = line.rsplit(":")[0]
tag = tag_name + ":"
post.ml_tags_stats[tag] = post.ml_tags_stats[tag] + 1
if not ml_tag_values(ln, tag, post.ml_tags_stats[tag]):
return False
c = 2
post.cf_set("STATS_HEADERS",
"%ss"%tag_name,
str(post.ml_tags_stats[tag])
)
continue
return True
@ -375,6 +407,7 @@ def ml_tag_values(ln, tag, stats):
if tag == post.ml_tags[0]:
section = "LINKS"
post.stats_text_links += post.text_contents.count(tyto_value)
post.cf_set("STATS_TEXTS", "links", str(post.stats_text_links))
html_value = tyto.a_link%(
value2, "%s link"%css, "%%s", value3, value1
)
@ -383,6 +416,7 @@ def ml_tag_values(ln, tag, stats):
elif tag == post.ml_tags[2]:
section = "FILES"
post.stats_text_files += post.text_contents.count(tyto_value)
post.cf_set("STATS_TEXTS", "files", str(post.stats_text_files))
html_value = tyto.a_link%(
value2, "%s file"%css, "%%s", value3, value1
)
@ -391,6 +425,7 @@ def ml_tag_values(ln, tag, stats):
elif tag == post.ml_tags[1]:
section = "IMAGES"
post.stats_text_images += post.text_contents.count(tyto_value)
post.cf_set("STATS_TEXTS", "images", str(post.stats_text_images))
html_value = tyto.image_link%(
value2, "%%s image", "%%s",
value3, value3, "%%s"
@ -400,6 +435,7 @@ def ml_tag_values(ln, tag, stats):
elif tag == post.ml_tags[3]:
section = "RAWS"
post.stats_text_raws += post.text_contents.count(tyto_value)
post.cf_set("STATS_TEXTS", "raws", str(post.stats_text_raws))
html_value = "<!-- %s -->"%value3
with open(value2_uri, "r") as f:
html_value = "%s\n%s"%(html_value, f.read())
@ -410,6 +446,7 @@ def ml_tag_values(ln, tag, stats):
elif tag == post.ml_tags[4]:
section = "CODES"
post.stats_text_codes += post.text_contents.count(tyto_value)
post.cf_set("STATS_TEXTS", "codes", str(post.stats_text_codes))
htmlbcode = "<!-- %s -->"%value3
with open(value2_uri, "r") as f:
for ln, line in enumerate(f.read().rsplit("\n"), 1):
@ -424,10 +461,12 @@ def ml_tag_values(ln, tag, stats):
elif tag == post.ml_tags[5]:
section = "ABBRS"
post.stats_text_abbrs += post.text_contents.count(tyto_value)
post.cf_set("STATS_TEXTS", "abbrs", str(post.stats_text_abbrs))
html_value = '<abbr class="%s" title="%s">%s</abbr>'%(
css, value2, value3
)
# Set in post database, source and HTML content
post.cf_set(section, "%s_%s"%(tag.replace(":", ""), stats), tyto_value)
post.cf_set(section, "html_%s"%stats, html_value)
@ -442,7 +481,7 @@ def ml_tag_values(ln, tag, stats):
# - ... for post directory #
#--------------------------------#
def is_value2_file_exists(ln, tag, val2):
global value2, src_uri, value2_uri
global value2, src_uri, value2_uri, stats_total_files
# uri "@..." means generic folders
if val2[0].startswith("@"):
@ -477,8 +516,9 @@ def is_value2_file_exists(ln, tag, val2):
return False
# Add file to [SOURCE_FILES] post database
post.stats_total_files += 1
post.cf_set("SOURCE_FILES", "file_%s"%post.stats_total_files, src_uri)
stats_total_files += 1
post.cf_set("SOURCE_FILES", "file_%s"%stats_total_files, src_uri)
post.cf_set("STATS_FILE", "files", str(stats_total_files))
return True
@ -548,6 +588,10 @@ def sl_ptags(markers):
index0 = index1 = -1
tag_ln = ""
post.ptags_stats[markers[2]] += 1
post.cf_set("STATS_TEXTS",
markers[2],
str(post.ptags_stats[markers[2]])
)
# paragraphs don't need html wip yet
if markers[2] in ("parags", "divs"):
@ -594,7 +638,6 @@ def sl_ptags(markers):
), post.uri, True,2, False)
return False
print(": stats", markers[2], post.ptags_stats[markers[2]])
return True
@ -609,6 +652,7 @@ def sl_ptags(markers):
def icodes():
global texts
stats_text_icodes = 0
markers = post.words_markers
for ln, line in enumerate(texts, post.head_lines + 1):
@ -652,7 +696,7 @@ def icodes():
icodes = re.findall('%s(.*?)%s'%(markers[0][4], markers[0][5]), line)
for icode in icodes:
post.stats_text_icodes += 1
stats_text_icodes += 1
icnew = markers[0][4] + icode + markers[0][5]
line = line.replace(icnew, "")
@ -660,12 +704,12 @@ def icodes():
html_val = icnew.replace(markers[0][4], markers[0][2]%css)
post.cf_set(
"ICODES",
"icode_%s"%post.stats_text_icodes,
"icode_%s"%stats_text_icodes,
markers[0][0] + icode + markers[0][1]
)
post.cf_set(
"ICODES",
"html_%s"%post.stats_text_icodes,
"html_%s"%stats_text_icodes,
html_val.replace(markers[0][5], markers[0][3])
)
@ -675,7 +719,7 @@ def icodes():
icodes = re.findall('%s(.*?)%s'%(markers[1][4], markers[1][5]), line)
for icode in icodes:
post.stats_text_icodes += 1
stats_text_icodes += 1
icnew = markers[1][4] + icode + markers[1][5]
line = line.replace(icnew, "")
@ -683,17 +727,19 @@ def icodes():
html_val = icnew.replace(markers[1][4], markers[1][2]%css)
post.cf_set(
"ICODES",
"icode_%s"%post.stats_text_icodes,
"icode_%s"%stats_text_icodes,
markers[1][0] + icode + markers[1][1]
)
post.cf_set(
"ICODES",
"html_%s"%post.stats_text_icodes,
"html_%s"%stats_text_icodes,
html_val.replace(markers[1][5], markers[1][3])
)
texts[ln - 1 - post.head_lines] = line
post.cf_set("STATS_TEXTS", "icodes", str(stats_text_icodes))
return True
@ -705,8 +751,12 @@ def icodes():
# Return True/False #
#----------------------------#
def sl_stags():
global anchors_ids
global anchors_ids, stats_tyto_text_coms
anchors_ids = () # Uniq anchors IDs
stats_tyto_text_coms = stats_html_coms = 0
stats_text_anc_ids = 0
stats_titles = 0
for ln, line in enumerate(texts, post.head_lines + 1):
linels = line.lstrip()
@ -724,40 +774,43 @@ def sl_stags():
debug.out(52, "%s) %s..."%(ln, linels[0:10]), post.uri, True, 1, False)
return False
post.stats_titles += 1
stats_titles += 1
post.cf_set("STATS_TEXTS", "titles", str(stats_titles))
# Create html value for this title in database
post.cf_set(
"TITLES",
"title_%s"%post.stats_titles,
"title_%s"%stats_titles,
line
)
post.cf_set(
"TITLES",
"html_%s"%post.stats_titles,
"html_%s"%stats_titles,
post.html_titles[linels[0:2]]%(css, line[3:])
)
# Count Tyto Comments
elif line.lstrip().startswith("#"):
post.stats_tyto_text_coms += 1
stats_tyto_text_coms += 1
post.cf_set("STATS_TEXTS", "tyto_coms", str(stats_tyto_text_coms))
# Count HTML comments
elif line.lstrip().startswith(post.text_comments):
post.stats_html_coms += 1
stats_html_coms += 1
post.cf_set("STATS_TEXTS", "html_coms", str(stats_html_coms))
# Convert tyto commented marker to HTML
if line.lstrip().startswith(post.text_comments[0]):
real_com = line.lstrip()[3:]
post.cf_set(
"COMMENTS",
"comm_%s"%post.stats_html_coms,
"comm_%s"%stats_html_coms,
line.lstrip()
)
post.cf_set(
"COMMENTS",
"html_%s"%post.stats_html_coms,
"html_%s"%stats_html_coms,
'<!-- %s -->'%real_com
)
@ -788,8 +841,9 @@ def sl_stags():
debug.out(54, '%s) "%s"'%(ln, anchor_id), post.uri, True, 2, False)
return False
anchors_ids = (*anchors_ids, anchor_id)
post.stats_text_anc_ids += 1
stats_text_anc_ids += 1
post.cf_set("STATS_TEXTS", "anc_targets", str(stats_text_anc_ids))
return True
@ -800,6 +854,8 @@ def sl_stags():
#---------------------------#
def anchors_links():
markers = post.anchor_link
stats_text_anc_links = 0
for ln, line in enumerate(texts, post.head_lines + 1):
anc_links = re.findall('%s(.*?)%s'%(markers[0], markers[1]), line)
if not anc_links:
@ -823,13 +879,13 @@ def anchors_links():
return False
# Set to post Database
post.stats_text_anc_links += 1
stats_text_anc_links += 1
post.cf_set("ANCHORS",
"anchor_%s"%post.stats_text_anc_links,
"anchor_%s"%stats_text_anc_links,
post.anchor_set[0]%anc_link
)
post.cf_set("ANCHORS",
"html_%s"%post.stats_text_anc_links,
"html_%s"%stats_text_anc_links,
post.anchor_set[1]%(css, anc_id, anc_title)
)
else:
@ -837,26 +893,118 @@ def anchors_links():
debug.out(51, '%s) "-> %s"'%(ln, anc_id), post.uri, True, 2, False)
return False
post.cf_set("STATS_TEXTS", "anc_links", str(stats_text_anc_links))
return True
#======================================#
# Count and return sub indices in text #
#--------------------------------------#
def find_sub_indices(full, sub):
return [index for index in range(len(full)) if full.startswith(sub, index)]
#================================================#
# From position of sub tag: return article line #
# When error, to let user know real line article #
# char is indice tag position #
#------------------------------------------------#
def find_line_sub(char):
for fc, lc, ln in lines_chars:
if fc <= char and char <= lc:
return ln
#=======================================
# CHeck paired words marks #
# Count for stats #
# CHeck paired words tagss #
# Count for tags stats + words #
# ! No neeed to create HTML in post db #
#--------------------------------------#
def words_tags():
print("words_tags: soon...")
global lines_chars
# Create List lines number and number of characters in line
# (In error case, show line number)
old_len = 0 # len(line)
lines_chars = (())
stats_text_chars = 0
for ln, line in enumerate(texts, post.head_lines + 1):
stats_text_chars = stats_text_chars + len(line)
lines_chars = lines_chars + ((old_len, stats_text_chars, ln),)
old_len = stats_text_chars
post.cf_set("STATS_TEXTS", "chars", str(stats_text_chars))
# Create article in block text format
# Also count words written
block_texts = ''
for line in texts:
block_texts = block_texts + line
post.cf_set("STATS_TEXTS",
"words",
str(sum(1 for w in block_texts.split()))
)
# For each word tag, get position indicies
for i, tags in enumerate(post.words_tags):
indices_o = find_sub_indices(block_texts, tags[0])
indices_c = find_sub_indices(block_texts, tags[1])
if not indices_o and not indices_c:
continue
# Count and compare opened and closes tags numbers
len_o = len(indices_o)
len_c = len(indices_c)
# Not paired tags
if len_o != len_c:
post.error = \
debug.out(53, "%s %s, %s %s"%(
len_o, tags[0],
len_c, tags[1]
), post.uri, True, 2, False)
return False
# Test if tags are opened > closed
for n in range(len_o):
# Current opened must be smaller than current closed
if indices_o[n] > indices_c[n]:
post.error = \
debug.out(53, '%s) "%s...%s"'%(
find_line_sub(indices_o[n]), tags[1], tags[0]
), post.uri, True, 2, False)
return False
# Other mismatches opens/closed tags
else:
# Current closed must be higher than opened + 1
try:
if indices_c[n] > indices_o[n+1]:
post.error = \
debug.out(53, '%s) "%s...%s"'%(
find_line_sub(indices_c[n]), tags[0], tags[0]
), post.uri, True, 2, False)
return False
except:
continue
# Add tag statistic to post database
post.cf_set("STATS_TEXTS", tags[2], str(len_o))
return True
#================================#
#==================================#
# Update post configuration file #
#--------------------------------#
def cf_update_values():
post.date = ("date:", tools.local_date(post.date[1]))
# part: #
# before > first generic datas #
# after > after all check modules #
#----------------------------------#
def cf_update_values(part):
# Generic known first datas, before check modules
if part == "before":
post.cf_set("DOMAIN", "name", domain.name)
post.cf_set("CHECK", "static", str(domain.static))
post.cf_set("CHECK", "hash", post.wrk_id)
# [FILE]
post.cf_set("FILE", "id", post.uri_id)
@ -864,22 +1012,6 @@ def cf_update_values():
post.cf_set("FILE", "db", post.cf_uri)
post.cf_set("FILE", "target", post.wrk_target)
# [HEADERS]
# ---------
post.cf_set("HEADERS", "title", post.title[1])
post.cf_set("HEADERS", "about", post.about[1])
post.cf_set("HEADERS", "date", post.date[1])
post.cf_set("HEADERS", "tags", post.tags[1])
post.cf_set("HEADERS", "authors", post.author[1])
post.cf_set("HEADERS", "sitemap", str(sitemap))
# [check]
# -------
post.cf_set("CHECK", "hash", post.wrk_id)
post.cf_set("CHECK", "date", chk_date)
post.cf_set("CHECK", "static", str(domain.static))
post.cf_set("CHECK", "errors", "False")
# [WIP]
# -----
post.cf_set("WIP", "hash", post.wip_hash)
@ -894,46 +1026,24 @@ def cf_update_values():
post.cf_set("WWW", "web", "%s%s"%(domain.www_url, post.wrk_target))
post.cf_set("WWW", "uri", "%s%s"%(domain.www, post.wrk_target))
# Stats (these, cause i want them first)
post.cf_set("STATS_FILE", "lines", str(post.lines))
post.cf_set("STATS_HEADERS", "lines", str(post.head_lines))
post.cf_set("STATS_TEXTS", "lines", str(post.text_lines))
return
# Datas after check modules
# -------------------------
# [CHECK]
# -------
post.cf_set("CHECK", "errors", "False")
# [STATS_FILE]
# ------------
stats_tyto_all_coms = post.stats_tyto_text_coms + post.stats_tyto_head_coms
post.cf_set("STATS_FILE", "lines", str(post.lines))
stats_tyto_all_coms = stats_tyto_text_coms + stats_tyto_head_coms
stats_tyto_all_coms > 0 and \
post.cf_set("STATS_FILE", "tyto_coms", str(stats_tyto_all_coms))
post.cf_set("STATS_FILE", "files", str(post.stats_total_files))
# [STATS_HEADERS]
# ---------------
post.cf_set("STATS_HEADERS", "lines", str(post.head_lines))
post.cf_set("STATS_HEADERS", "tyto_coms", str(post.stats_tyto_head_coms))
post.cf_set("STATS_HEADERS", "links", str(post.ml_tags_stats["link:"]))
post.cf_set("STATS_HEADERS", "files", str(post.ml_tags_stats["file:"]))
post.cf_set("STATS_HEADERS", "images", str(post.ml_tags_stats["image:"]))
post.cf_set("STATS_HEADERS", "abbrs", str(post.ml_tags_stats["abbr:"]))
post.cf_set("STATS_HEADERS", "codes", str(post.ml_tags_stats["code:"]))
post.cf_set("STATS_HEADERS", "raws", str(post.ml_tags_stats["raw:"]))
# [STATS_TEXTS]
# -------------
post.cf_set("STATS_TEXTS", "lines", str(post.text_lines))
post.cf_set("STATS_TEXTS", "tyto_coms", str(post.stats_tyto_text_coms))
post.cf_set("STATS_TEXTS", "html_coms", str(post.stats_html_coms))
post.cf_set("STATS_TEXTS", "anc_targets", str(post.stats_text_anc_ids))
post.cf_set("STATS_TEXTS", "anc_links", str(post.stats_text_anc_links))
post.cf_set("STATS_TEXTS", "titles", str(post.stats_titles))
post.cf_set("STATS_TEXTS", "parags", str(post.ptags_stats["parags"]))
post.cf_set("STATS_TEXTS", "divs", str(post.ptags_stats["divs"]))
post.cf_set("STATS_TEXTS", "bcodes", str(post.ptags_stats["bcodes"]))
post.cf_set("STATS_TEXTS", "bcodes_lines", str(post.stats_bcodes_lines))
post.cf_set("STATS_TEXTS", "quotes", str(post.ptags_stats["quotes"]))
post.cf_set("STATS_TEXTS", "lists", str(post.ptags_stats["lists"]))
# Founds from header tags
post.cf_set("STATS_TEXTS", "links", str(post.stats_text_links))
post.cf_set("STATS_TEXTS", "files", str(post.stats_text_files))
post.cf_set("STATS_TEXTS", "images", str(post.stats_text_images))
post.cf_set("STATS_TEXTS", "abbrs", str(post.stats_text_abbrs))
post.cf_set("STATS_TEXTS", "icodes", str(post.stats_text_icodes))
post.cf_set("STATS_TEXTS", "codes", str(post.stats_text_codes))
post.cf_set("STATS_TEXTS", "raws", str(post.stats_text_raws))
# ============================
# Write new values in database

View File

@ -33,7 +33,7 @@
#--------------------------
import os, sys, configparser
import args, domain, debug, tools, tyto
import args, domain, debug, tools, tyto, check
error = 0
@ -47,6 +47,8 @@ write = False # When updating database in cf_set(), cf_write()
# load database #
#--------------------------------------------#
def is_article(target):
global error
# User MUST be in articles/
domain.user_dir.startswith(domain.wrk_articles) or \
debug.out(2, "-> articles/", domain.wrk_articles, True, 2, True)
@ -58,7 +60,9 @@ def is_article(target):
# Article exists
global uri
uri = os.path.join(domain.user_dir, target)
if args.targets: cur_dir = domain.wrk_articles
else: cur_dir = domain.user_dir
uri = os.path.join(cur_dir, target)
if not os.path.exists(uri):
error = debug.out(5, "False", uri, True, 2, False)
return False
@ -82,6 +86,7 @@ def is_article(target):
cf_load()
cf_datas()
compare_datas()
return True
@ -239,21 +244,40 @@ def cf_write():
write = False
#====================================================#
# Search and return .tyto file in domain root folder #
#----------------------------------------------------#
def find_tyto_article():
nothere = (domain.wrk_files, domain.wrk_images)
os.chdir(domain.wrk_articles)
for root,dirs,files in os.walk(domain.wrk_articles):
if root.startswith(nothere):
continue
for f in files:
if f.endswith(".tyto"):
f_uri = os.path.join(root, f)
target = f_uri.rsplit(domain.wrk_articles)[1]
args.action == "check" and check.is_article(target)
#======#
# MAIN #=======================================================================
#======#
# Statistics
# ==========
stats_tyto_head_coms = 0
stats_tyto_text_coms = 0
stats_html_coms = 0
stats_titles = 0
stats_bcodes = 0
stats_bcodes_lines = 0
stats_bcodes = 0
stats_quotes = 0
stats_parags = 0
stats_lists = 0
stats_divs = 0
stats_links = 0
stats_images = 0
stats_files = 0
@ -261,17 +285,12 @@ stats_raws = 0
stats_codes = 0
stats_abbrs = 0
stats_total_files = 0
stats_text_anc_ids = 0
stats_text_anc_links = 0
stats_text_links = 0
stats_text_files = 0
stats_text_images = 0
stats_text_abbrs = 0
stats_text_codes = 0
stats_text_raws = 0
stats_text_icodes = 0
# head_contents
@ -359,6 +378,7 @@ words_tags = (
("~_", "_~", "dels", '<del class="%s">', '</del>'),
("._", "_.", "underlines", '<u class="%s">', '</u>'),
("/_", "_/", "emphasis", '<em class="%s">', '</em>'),
(";_", "_;", "italics", '<i class="%s">', '</i>'),
)
# Specifics convertion

View File

@ -49,6 +49,7 @@ import tyto, tools, post, domain
def bcode(lines):
lines = lines.rsplit("\n")
html_bcode = ""
for ln, line in enumerate(lines):
if ln == 0: # Opened marker
css = tools.get_css(line, post.ptags[0][0])
@ -69,7 +70,9 @@ def bcode(lines):
else: html_bcode = "%s\n%s"%(html_bcode, line)
html_bcode = tyto.code_bcode%(css, html_bcode)
#print(html_bcode)
post.cf_set("STATS_TEXTS", "bcodes_lines", str(post.stats_bcodes_lines))
return html_bcode