diff --git a/CHANGELOG.md b/CHANGELOG.md
index 243d2c1..063596b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -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)
diff --git a/README.md b/README.md
index f4a0d0e..188c5db 100644
--- a/README.md
+++ b/README.md
@@ -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
+-> 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
+ ))
+ "]
+]]
+```
diff --git a/src/usr/bin/tyto b/src/usr/bin/tyto
index 595eb11..797857c 100755
--- a/src/usr/bin/tyto
+++ b/src/usr/bin/tyto
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
-# Version: 1.9.26
+# Version: 1.9.27
# Updated: 2023-10-18 1697613100
# Tyto - Littérateur
diff --git a/src/var/lib/tyto/program/__pycache__/check.cpython-311.pyc b/src/var/lib/tyto/program/__pycache__/check.cpython-311.pyc
index 8670f26..a374e7b 100644
Binary files a/src/var/lib/tyto/program/__pycache__/check.cpython-311.pyc and b/src/var/lib/tyto/program/__pycache__/check.cpython-311.pyc differ
diff --git a/src/var/lib/tyto/program/__pycache__/post.cpython-311.pyc b/src/var/lib/tyto/program/__pycache__/post.cpython-311.pyc
index 399db3f..653ea49 100644
Binary files a/src/var/lib/tyto/program/__pycache__/post.cpython-311.pyc and b/src/var/lib/tyto/program/__pycache__/post.cpython-311.pyc differ
diff --git a/src/var/lib/tyto/program/__pycache__/wip.cpython-311.pyc b/src/var/lib/tyto/program/__pycache__/wip.cpython-311.pyc
index e9381e4..0d13eaa 100644
Binary files a/src/var/lib/tyto/program/__pycache__/wip.cpython-311.pyc and b/src/var/lib/tyto/program/__pycache__/wip.cpython-311.pyc differ
diff --git a/src/var/lib/tyto/program/check.py b/src/var/lib/tyto/program/check.py
index 39bb82f..7f30735 100644
--- a/src/var/lib/tyto/program/check.py
+++ b/src/var/lib/tyto/program/check.py
@@ -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,30 +215,37 @@ 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))
+ if not is_ol_tag(post.tags[0], post.tags[1]):
+ return False
+ post.cf_set("HEADERS", "tags", post.tags[1])
-
- # 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
-
# Default domain logo for this post
if not post.logo[1]:
src_uri = "%stemplate/%s"%(domain.www_url, domain.logo)
@@ -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 = ""%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 = ""%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 = '%s'%(
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,10 +751,14 @@ def icodes():
# Return True/False #
#----------------------------#
def sl_stags():
- global anchors_ids
- anchors_ids = () # Uniq anchors IDs
-
- for ln, line in enumerate(texts, post.head_lines + 1):
+ 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()
# legacy Tyto Titles
@@ -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,
''%real_com
)
@@ -778,20 +831,21 @@ def sl_stags():
post.title[1], post.title[1], "%%s"
)
)
-
+
# Anchor source
elif line.lstrip().startswith(post.anchor_target[0]):
- anchor_id = tools.get_css(line, post.anchor_target[0])
+ anchor_id = tools.get_css(line, post.anchor_target[0])
if anchor_id in anchors_ids:
post_error = \
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
-
- return True
+ 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,104 +893,158 @@ 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 #
+# 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)
-#================================#
-# Update post configuration file #
-#--------------------------------#
-def cf_update_values():
- post.date = ("date:", tools.local_date(post.date[1]))
-
- post.cf_set("DOMAIN", "name", domain.name)
-
- # [FILE]
- post.cf_set("FILE", "id", post.uri_id)
- post.cf_set("FILE", "uri", post.uri)
- 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]
+ # [FILE]
+ post.cf_set("FILE", "id", post.uri_id)
+ post.cf_set("FILE", "uri", post.uri)
+ post.cf_set("FILE", "db", post.cf_uri)
+ post.cf_set("FILE", "target", post.wrk_target)
+
+ # [WIP]
+ # -----
+ post.cf_set("WIP", "hash", post.wip_hash)
+ post.cf_set("WIP", "date", post.wip_date)
+ post.cf_set("WIP", "web", "%s%s"%(domain.wip_url, post.wrk_target))
+ post.cf_set("WIP", "uri", "%s%s"%(domain.wip, post.wrk_target))
+
+ # [WWW]
+ # -----
+ post.cf_set("WWW", "hash", post.www_hash)
+ post.cf_set("WWW", "date", post.www_date)
+ 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", "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)
- post.cf_set("WIP", "date", post.wip_date)
- post.cf_set("WIP", "web", "%s%s"%(domain.wip_url, post.wrk_target))
- post.cf_set("WIP", "uri", "%s%s"%(domain.wip, post.wrk_target))
-
- # [WWW]
- # -----
- post.cf_set("WWW", "hash", post.www_hash)
- post.cf_set("WWW", "date", post.www_date)
- 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_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
# ============================
diff --git a/src/var/lib/tyto/program/post.py b/src/var/lib/tyto/program/post.py
index 3b05878..6f1fe6d 100644
--- a/src/var/lib/tyto/program/post.py
+++ b/src/var/lib/tyto/program/post.py
@@ -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
@@ -288,7 +307,7 @@ about = ("about:", False)
date = ("date:", False)
tags = ("tags:", False)
author = ("author:", False)
-logo = ("logo:", False) # optional
+logo = ("logo:", False) # optional
# Multiple lines (3) markers
ml_tags = ("link:", "image:", "file:", "raw:", "code:", "abbr:")
@@ -310,7 +329,7 @@ ml_tags_stats = {
}
# Markers with uri in value2
-value2s_uri = (ml_tags[1], ml_tags[2], ml_tags[3], ml_tags[4])
+value2s_uri = (ml_tags[1], ml_tags[2], ml_tags[3], ml_tags[4])
value2s_ext_uris = ("http", "ftp")
# text_contents
@@ -359,6 +378,7 @@ words_tags = (
("~_", "_~", "dels", '', ''),
("._", "_.", "underlines", '', ''),
("/_", "_/", "emphasis", '', ''),
+ (";_", "_;", "italics", '', ''),
)
# Specifics convertion
diff --git a/src/var/lib/tyto/program/wip.py b/src/var/lib/tyto/program/wip.py
index 2fc0b98..a3bb5e5 100644
--- a/src/var/lib/tyto/program/wip.py
+++ b/src/var/lib/tyto/program/wip.py
@@ -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