From 84abcb5e92ed510bf6b7a62df925e54f7ab3dea6 Mon Sep 17 00:00:00 2001 From: Cyrille LOUARN Date: Wed, 1 Nov 2023 10:29:43 +0100 Subject: [PATCH] [1.9.29] - 'wip' process. See changelog --- CHANGELOG.md | 21 +- README.md | 105 ++++++-- debian/control | 2 +- src/usr/bin/tyto | 2 +- .../program/__pycache__/args.cpython-311.pyc | Bin 2602 -> 2664 bytes .../program/__pycache__/check.cpython-311.pyc | Bin 43116 -> 43875 bytes .../program/__pycache__/debug.cpython-311.pyc | Bin 3905 -> 4028 bytes .../program/__pycache__/post.cpython-311.pyc | Bin 11555 -> 11436 bytes .../program/__pycache__/tools.cpython-311.pyc | Bin 7373 -> 7429 bytes .../program/__pycache__/tyto.cpython-311.pyc | Bin 1457 -> 1447 bytes .../program/__pycache__/wip.cpython-311.pyc | Bin 9305 -> 16455 bytes src/var/lib/tyto/program/args.py | 3 +- src/var/lib/tyto/program/check.py | 74 ++++-- src/var/lib/tyto/program/debug.py | 2 + src/var/lib/tyto/program/post.py | 38 +-- src/var/lib/tyto/program/tools.py | 21 +- src/var/lib/tyto/program/tyto.py | 4 +- src/var/lib/tyto/program/wip.py | 225 ++++++++++++++++-- .../__pycache__/logs_fr.cpython-311.pyc | Bin 3179 -> 3268 bytes src/var/lib/tyto/translations/logs_en.py | 61 +++++ src/var/lib/tyto/translations/logs_fr.py | 8 +- 21 files changed, 468 insertions(+), 98 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a7168b9..06e0f36 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,13 +1,26 @@ # Changelog Tyto - Littérateur -- Repository: -- Issues: +- Repository: https://forge.a-lec.org/echolib/tyto-litterateur/ +- Issues: https://forge.a-lec.org/echolib/tyto-litterateur/issues - Changelog: - License: -- Documentation: +- Documentation: https://forge.a-lec.org/echolib/tyto-litterateur/src/branch/master/LICENSE +- Development: https://forge.a-lec.org/echolib/tyto-litterateur/src/branch/devel -# CURRENTLY IN DEV ! +# CURRENTLY IN DEV (in devel branch) ! + +## [1.9.29] +- Translations +- - added for logs (english) +- - updated french logs +- wip (working on...) +- - added modules conversions (source to HTML) +- check +- - some fixes and updated code +- tools +- - check css content +- readme : updated article example with comments ## [1.9.28] - readme diff --git a/README.md b/README.md index 32bbe6a..fa9615c 100644 --- a/README.md +++ b/README.md @@ -11,17 +11,23 @@ tyto - added lists to post database (prepared wip) ## Working on -- 'check' action processes -- thinking about creating an auto top article menu from titles -- stats for article words -- Translate logs in english ! +- 'wip' action processes +- - images module -## Exemple d'article +## ToDo +- thinking about creating an auto top article menu from titles +- create full HTML page +- sitemaps +- RSS +- 'publish' process + +## Exemple d'article .tyto commenté ``` #================================================# # Entete de l'article # # Fin de l'entête avec au moins 5 tirets "-----" # # Toute ligne de commentaire "# ..." est ignorée # +# ! Recommandé de ne pas utiliser le signe "_" # #================================================# # Pour ne pas inclure cet article dans les sitemaps : @@ -34,7 +40,16 @@ tags: Tyto, tuto, author: echolib date: 2023-10-27 -# Données multiple sur 3 lignes +# Données unique sur UNE ligne optionnelle +# Si non définit, le logo du domaine est utilisé +# Ne sera affiché qu'avec _image:logo +logo: post-logo.png + +# Données multiples sur 3 lignes +# [TAG]: Nom +# LIEN +# Text alternatif + link: cliquer sur ce Lien https:// Text alternatif @@ -47,66 +62,121 @@ file: télécharger ce fichier @/PDFs/hello.pdf Un PDF ! +code: codetest + @RAWS/test.py + Exemple d'un code Python + +# Les abréviations : +# 2eme ligne: Texte alternatif +# 3ème ligne: valeur affichée dans l'article à la place du Nom +abbr: HTML + HuperText Markup Langage + HTML + +abbr: css + Cascading Stylesheet + CSS + ----- #=====================================================================# # Contenu de l'article # # Les classe optionnelles non renseignées deviennent celle du domaine # +# /!\ Tout code HTML sera interprêté par le navigateur sauf si placé # +# entre les marqueurs de block-code ou icode # #=====================================================================# # La ligne suivante est un commentaire HTML "" +# ---------------------------------------------------------------- ;; Commentaire # Ceci est une ancre avec l'ID uniq1 (ID unique) +# ---------------------------------------------- -> uniq1 -> top # Créer un lien vers l'ancre "uniq1" +# ---------------------------------- >_uniq1: Go to uniq1 anchor_< # Ceci est une ligne
ayant pour classe hrcss +# ----------------------------------------------- -- hrcss # Les Titres de l'article de #1 à #5 (

à

) +# ------------------------------------------------ #1 Titre en h2 -# Contenu dans un paragraphe ayant pour classe "mypar" +# Contenu dans un paragraphe entre (( ... )) ayant pour classe "mypar" +# -------------------------------------------------------------------- (( mypar Un long paragraphe... # Retour à la ligne avec un
de classe brcss # (les retours à la ligne vides ne sont pas pris en compte) + # --------------------------------------------------------- | brcss + # Reprise du Nom pour les liens de link: et file: + # Reprise des abréviations Il faut __cliquer sur ce Lien, __Réservez ici et --télécharger ce fichier - ou encore faire une ::CSS pour du beau rendu ::HTML + ou encore faire une ::css pour du beau rendu ::HTML # Un paragraphe dans le paragraphe ayant pour classe, celle du domaine + # -------------------------------------------------------------------- (( Un /_court_/ paragraphe de :_1984_: pour de ~_vrai_~ +_faux en gras_+ Il faut le ._souligner_. et *_Très Gras_* )) - # Créer un icode (utiliser la balise ) - # /!\ ! Doit être sur une ligne + # Créer un icode (utilise la balise HTML) + # /!\ ! Doit être sur une même ligne + # ---------------------------------------------- {_
    ,
      _} - + {_{_Afficher un icode brut_}_} )) - -#2 Un exemple de block code ayant pour classe python +# Un exemple de block code ayant pour classe python # Tout contenu entre les marqueurs "{{" et "}}" est conservé +# ---------------------------------------------------------- +#2 Block Code {{ python # Un commentaire et du code def hello(world): world and print(world) or print("NoMore") }} -#2 Citation + +# Écrire en gras, italique... +# --------------------------- +#2 Marqueurs de mots +(( + Même si, il est possible d'écrire directement des balises (HTML), Tyto + propose de les simplifier, en entourant les mots avec des marqueurs. La + classe CSS du domaine est utilisée pour chaque marqueur. + + {{ + *_Très Gras_* > + +_En Gras_+ > + [_Citer un texte_] > + :_Citer une référence_: > + ~_Texte barré_~ > + ._Text souligné_. > + /_En italique_/ > + ;_En italique_; > + + # Marques multiples, ajouter "&" + *_&._Très gras et souligné_.&_* + }} +)) + + # Dans un block div [[ ... ]] (classe CSS mydiv), # La citation entre [" ... "] (classe CSS mycite) # est placée dans un paragraphe (classe CSS mycite) # ! Tout commentaire "# ..." dans la citation sera affiché... +# ----------------------------------------------------------- +#2 Citation [[ mydiv [" mycite ;; A great quote here ! @@ -127,6 +197,7 @@ file: télécharger ce fichier # dans un paragraphe (classe du domaine) # "+" pour ol, "=" pour ul # Ajouter toujours un signe pour un sous-item ou /!\ au changement de signe +# ------------------------------------------------------------------------- #2 Une liste mixée {_
        ,
          _} (( <: mylist @@ -138,4 +209,10 @@ file: télécharger ce fichier :> )) +# Afficher un block code avec le contenu d'un fichier +# Il doit avoir été configuré dans l'entête +# ----------------------------------------- +#2 Un block code depuis un fichier +_code:codetest + ``` diff --git a/debian/control b/debian/control index 12fef31..4b3cb0b 100644 --- a/debian/control +++ b/debian/control @@ -1,5 +1,5 @@ Package: tyto -Version: 1.0.0 +Version: 1.9.29 Section: custom Priority: optional Architecture: all diff --git a/src/usr/bin/tyto b/src/usr/bin/tyto index 8d98d3f..0b9734a 100755 --- a/src/usr/bin/tyto +++ b/src/usr/bin/tyto @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# Version: 1.9.28 +# Version: 1.9.29 # Updated: 2023-10-18 1697613100 # Tyto - Littérateur diff --git a/src/var/lib/tyto/program/__pycache__/args.cpython-311.pyc b/src/var/lib/tyto/program/__pycache__/args.cpython-311.pyc index 34c0cfdb9c480c907260667e72e39ff1229974fe..0e7627619f13a2a7dc3bac96c38e3bf1fa104292 100644 GIT binary patch delta 424 zcmZ1_@%itHQ8@5muD7e@=w0c9>}5tl%K56q0MCkWP|~6ap&X|j#%Nl z!eUdbJ_vGha(-X{5)DQl#3rBTP~zY(Vgo8F(w+R1LzdeB#MA~6I+JBMCF((D6oFh< z1oB@IH<0+nVUwGmQks)$S7Z$2G6He&B_Q#EnURt4gBv3QBXo?Rv^if!UiOH zH_n>G%EbZH!wkfq>o%LQnKJ67FwSAGWnf~cVJMLRnFj%qFb0ZfiPYrv>`IL6lP|Gr zGHLQnX5t8(9KoT*We8Lq2E@fJlY2N~`9AP-aB_ZN01^#GA4Deq;ZV}%D`Er67wLcq zkl95_AVL8|sDlVK5TOquv?u#6G6D)P0&(%N$$gw+aaI=?Xox2BaoNcT OGs=Bnz$A)5K@9-?EL7J3 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 fb65a91529337b6ac5dd6cd91beaa6fe18465162..78955bbcf7708cf1644347d407d50688349820ff 100644 GIT binary patch delta 6285 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 Yk=9{9{rA_8=5FPhxJAVuN2aO&1efKLF8}}l delta 5536 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 JH$j-_e*sZZyi))G diff --git a/src/var/lib/tyto/program/__pycache__/debug.cpython-311.pyc b/src/var/lib/tyto/program/__pycache__/debug.cpython-311.pyc index a2e9b0e78662548b8e95b1b74ee1b7bafa1a46c4..a0d444670459e0abb27e2ae01d7e8a0b375ec9e1 100644 GIT binary patch delta 988 zcmZwFyKmD#90zb8jUD4OcA!9^N&JYD(ma4RJW8RY|hrs!4t`u1{81 zSE6P1>&?PznIBVZX7Z9U#RrvsmglBo^%YQuRw+DHUa*F-e1$(&=Hi)o8R~7Su!gjJ z4gGezwU6uJCrsnd!}p6>rS;M0)+fYg#23VG#2-JtvD`Yd@AcRv#JHUu=F{p*%&2-^ zd9l8Lh{d${3!D< z_f<=f><>wiWTg#B3IkLD3EB+M1jH!<=oMg76rc;R$NB09tL-ncX#~(L3UO&a{Xzb!zi+)FVlM()`IY1?qJP_u bb#;89Ub$1NmOPKQ^ik(BV>(Iy&tTeLV>l0m delta 873 zcmZwFyKmD#90%|_upQT_lR|m4N&JcvAW11LuNJ8kN})W}r9(mDG1Oi904Xhkp;aa} z7^;&P5MrwkVgbR}1&N)4_ybroApMpuO!e1Mf62f}_x1VX-|6i0ZF%2Z`@L;jB5qNx zHh+J^ek8X(FMradqg=yNj^V2ZM#YK--fEk2J-a%qwvD-bX;H_N`o2i6i`9D=x7xx< zHJy5+{-&PwHh;ua(VE-wrTG)_ORbsxa!|cCH@=K^tx5IW+O!tqC&O`H`KVUX?;2H2 z|D)-z$}g+Gtpe%sEg3>LTHsI$U@{b_3t%ziDGlgm@W}>b7(B`XdKi2<063UH1M51} z3pvCk0UZV$5qhfiB0e1j^f3g~56CeTDGw+xgyaBR28TR=&rqbG+K8pd5>kkg5<`i~ z0D(Bxp~nFyI-mlmGL)$X7!_W`E>LkuAe0~)7UTsi|e%Mj2xzm9N()h3UwCv>At0o_dKRwvy~2z$13 zM~ZZhdY&otPr|e#PQD@TYeHfU78=S SKUPt8B$$;lL*oCLOxp!~-R%1S 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 fefee3c709cca2ce33f9055c5d4b201ba29b4f7b..0bb6fd422dc6b5954f5affe6a636c5cf8b118fd3 100644 GIT binary patch delta 1151 zcmZ{jTSyd97{||<*`3_onVr#Hx82NjbzQeH=w?PqH?8buKB!q}4^dklhzUJ8nVUV4ZiBIw0LNR|X&1bv$>gxH17H?9^@XPMu8-~W8){Lf|fe%qsC z(nCq|BG!bi-QBNmOA$QrG&#n3Hnr7ixEZNc)^~1Jz>U_7=MAQ9rceP%Kzs?0=%>&(ZWE>(@`H+=Fu*t041uPi!KO41 zxvm(_NiFvE3Aq}iacK@>!fRX#ohdQor5=R(V98E13YH>-j39j(js%c~Q$8d7hwj)l zrKDZzWC@7CUN zAv`98C*^?IWA@C*!3jD3p#JfJcXIWFTy6HS84|fE{u*lYXhqrd;y5r+UQnY&+105_<-5D0nTK9`?Vx=F{YCs8~j_xjw3OWmaAWJJ= z$KydtV@XWt^VnuLY{_eViGAS8y8^IA! z-JO|Cx@OqjpE}c9LoQpR29Kvy->cN{#3(0xH`-po#Sa~<*2M;*+$DaNncg2lLL6Gjh0bk;kDEFV5RAs zR8&CJlqQv3fYp#5G`*9`4%24~9=~jQ?GRD|rfBE!m}3`+{dRD@;xa|}Ie)`nRbmi& delta 1197 zcmah|&2JM&6rb7kF7d~D*CGDc)Cs}HbvETo(4aIpP>6_9m4HNYpg;?TO~|*y>?$ed z&~1nyLPDZ?ApQUZ9H5oT-Vi--Lp>A+BnqIkZ3P4w%rqdmFeH^qW=+vo=`Al`fpJ} z?(kJLO6>SDC&cCyUW&1;E9LhT3DqKPbrJlgC*eU*7XxMxE(No&6x<+&s+{U@AQXoy zz9|uj=BWuaQTR2~#QZNM2o$fIC(b8rEp0%nurdoRZLsVn;{EVvHC3Lw7IY z!B`CkBLag;uPjZlp>Z4TE2gkXaGS!1Xilt|jeeV($vL@aV$J1-IWayj#!F(Hd+!an zXVjcPue(1)YANl6hqay3LB827*T42FfgXgx=(OIAEf@${g!D4p12Oi7{tlmN(Gc^Q zLY|m3FW534O6-$iiKkU;M8qExFu@L0HN@dH%bdxk@HNeoykL@E_(h9DO+ukDxD>C4 z$6Bn<#$o(#c4C?FF8K)W@Kv=+HDPMx0X2jNgrf+tA-#w?c%JXWgGw{q!>C-s;oAqh^bH3Gr zX!Y9*(i9uA`wbu4&n4CaFY66yg45To`oU$YjiK6#unwUU?j{>$y!w>7rQ~LjPQuc< zEVUrp^szL}^{{)Q>8a2h$(>|Pr$+OZ)sf0r87sBR5ZDDCFGg~M??m84dbaL7>e9(V zVWhn%jpoNsx3d}d-}ILhj%Ci#KcJjxgr&?AWe=<4nY{0_7VCoNA2zg2a-T&IDvdTH z!`H!52zbS+_oy;xJQl;=*|fVoyPeWrINkhLRGBI;(>gwuXCwX0V*4~PPwyr6qGI>EB`5kjM*l(pRmNpwGR0_E^d dC+Nxku<8W7dXWmANNCur+obuN5Pp?6@E=CV7)t;E diff --git a/src/var/lib/tyto/program/__pycache__/tools.cpython-311.pyc b/src/var/lib/tyto/program/__pycache__/tools.cpython-311.pyc index 3e38f888975a7583a93020dc863877141db783f7..61c55d85dac765b10720815ef8b05ae1f7839b74 100644 GIT binary patch delta 651 zcmb7G2gx171@M5cn z6#}Lhycl_c1@UYZ1k0*d>rI4W6c24qLa65)dh+BXxd@(|dGllD8$KShKe3ewz0`G$ zVB9mNiZ_!_LU(5aivbYpWHAU5QU@P01Tr!Veq;m`WE5273DA%yA%KiQ5E%y@IRqi3 zvD=!U^t`7Drzp*Mqv9`0r@g3eQlJZ7-v5+R@H)yqr4?^iJ0nupJJeGWee4}aDN^Or6V~|ztt3Wrh55S>}4x<@jbj--IMkTpX1-;xgYWzzmgjB<z>;d8x=`UFr``^msS_L+47q7C1I8v;t!#9Rk#;q3lkH`JyYg40 CN2ibg delta 599 zcmajbOK1~87y#h;cQ=#mB%4Q@*Cw?OFi5ObFCx`wQBeYgBHdo>rHE5C8e2QNS`SMJ zwbk5A8PS6XJ!y^hQ1;SW1&>llw1?VLq11B^o;>+)MG!nV|IEkC{PSWK&TI@s-WmoY zSQfsXo%oztjLZzNF~-$-G8W<*8s-7i;1rGUAR6U58slwfoHMkYhtLilMibmXlRSc^ zR+|F=Cp@Nf0~EcZ>UV(4UOZ4#;F>oad=7Ba+toJ!roB~mM1@)Jn~~LE(fbjfQla7T z=?yUu#a}&jLd3 z=yEx8$oOk!yiI<|^ijRgbIGzKGjoTT=)w)#v|>A=d|!0?1NDY&Z!_DuE*yKN?A(^; z%o3Z$ObeS`m(R?h(@!VoChJycx9g{6S^nym*2`|M%>xvXQ&h amu-^&)EyG49)uk1Y;i_@% delta 67 zcmZ3^y^))DIWI340}u$W(@M?Q$ZN;Ms5IG!NosNi(;`OG$)}lACjVd(+HA@k&m`>9 S!1jTKnNzTV6$Fd)fw}-bkPv+U 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 1687e02a03ace147afa5a2c1d65410c10681a7aa..1a96f2342eb87f3e190e43414870ae51a92aa58d 100644 GIT binary patch literal 16455 zcmcILYit`wdb`}^^8FNLJuOpj(YCBuw)L_eaU#XC<40{N$(Vuh_jj)BC>XHji2edf8c*=;M%qfO7TqRDKSPGz-r2$%4BS0(50JO0tfOggl z(7{>&I$0|~7i$CPX6*nytOKBzbpkA7T>yP7IYtEBUm^mJg$rcj2L%xQza9s0n@Ey4 z6@y7N%#xo%_;WQ*>hrC(oA?yUeXb%Pq2*Ak;n-^dN@m#jbZ8dG7@|z z6ulHl$VM&_V&D4_@ii*=q_*Ro5Z4i%INOnYFB$Kc;o|4H&~(SU6EnMJ-s2d^g28SG zBpLt+#3O@QGE`-nMT1{5_;Ut7BwXEjW!KeR0{(Gk$QD*XZN@(;@DBLN+Dg5lJRw z_w=P`a$+VL2^LatAIauOj7_{dk-Q*VClbLBmz)SkBLRcVgu=;*cuZyrxl!Nv{hS3J zGBX{Dh0aGfFGTjkKk+62fq2YVuSQo01MPUkY!R7CiK)ynm3hW4ock|^pehrX2t5-|BxTRJi5MG1J-ON^92!YX4(@hJd~;JfUAsFxAu+5Ja&xEIEZ+$+afY#4lVN zFpx1KiAJk%O{x=heLVWwVDX}+6)x5Q)IjZ@s}$(pC!MP~VG)!t0ld7aV;m|v%MAKq zk@f}5vMC&oy%XV*Tsfr6#t6s7InIv4RN}paOh+zHBxU0aHxWz9mJ7-0Xb=s{k4Vk~ zc@n4(mAS~dAc(<9^x|y*Fbq~ty5(BOdmqpD#rzYjxLCQ)U%)qCv_BF2G-a0Obp z5uXT=T0SwUPRr6kP8bjmPNHd1xF*#w*P-PClj>lz2A0y5P&p1uvqs=0kn?jjw>D=G z(T*=%YuRcHrWfA7P@HA7B_>rqltp8;=3-5(SwB(qv5+IVwOHs=2x@nNCFZuP9F=egwQ6nv7zuKbnP?~+k*)8>IW_^i zDcWTdQ5@jv0JoMsRU+aL2%;Bn1LJ~y(&3qZTj+*8(dL@($h3&oddXT3oQW>WJG^sm zzzdV@Y8)}IvPWf=w|X-tvsGUV|9EtfeQ@BxC9!NoDjWGOdv$U(x63Cvw`I*=H2t{s zCp$jdv3UN$JL2}&r0uVX&V!QkpwNT1U+0zntNlX%Bg&nw%nWDuid36KwdJTblv1%K zr7AO$-6v83i3;SXfKsY7rD9DUead6Xv0AD1O7GQPq4zP=Rh@YwJ0eosC2D()+OE{D zO+k4oGyAelBGoEUtvRYysl7C%LYHUR>YQs**t5DzL6;-;i5SS&{Q&grIg56YH5X5S zfCU(edtC^NsGJY71`HhHU$Ut%2S84u5?olO(GHbB^{$FY_GIL8a&@Y3FTy~S3Pw3mt6jAS(X)DJ0#Z*0lG)%Ra&63Jjjk%H*UdS0=@bc6a~?&w#`sLxk|T} zVdBis-iDkhDn;{DR$I$z5l~0;J2*$q*YE^un8GzA7zk5Jm^1JQ56P9UFK4hcPwRUU z*Q#zsYLyV+iLAP9Y18$r6Orf1cSZnY$O!blrS$}_y-DXl53 zjY(>@OrGXT-jl@q11$ZRj>$$W!f@?SEw>Ya1^{3FA6(oJgaTHDckP3)Y@A3&rW3L? z0g`tTi{{)ORAes#12{)C{w^@LE|l;xfPe`YP(+c}O)wvWz|=tSKcB<_YAW)cOabqb z&6o-lRYH)KK;7Xw+B8P$X1AD0jVsoLip$g46a-j z5_7NSE%qCA*XuGS(c+gZek5gi^A^vt#ho5qvef1*wOP|b&ys&n&c7$`^3Ij5Foe~E zvc2>OxEHL0%7s0mt3z^i;CJ5g+ch87WZwGZ%*SUw3f>7Wj4hm97?ZZ{UhEP*eUhh7 zxbVnReyc*smAxQ(IwVhra6v`e_sCZz`I@sA7R{osSMv4FRU)=pmfn*wi%h-5)aUTM z5?F1Bvhtw0>V+g`yz;668Fq)lhy2VhKdK9%WG=Hp_JbkQpv969rX*i6)ZV#0)or5^Y$o!$=YVQl_I5v50ol?m@*7 z_$mAop8*hvW!KIx#((_QPfmY!`a#t%4~p$ar1m4C>j>;=u8JG)Uw=Q76kSb{t7(O> z((M=s$z=zgC>gn%z1YT6T-ww`D&$W zr!kr&cpCo)1UA}0V3M&ZLaU{~WFw2L7Ht8=n06qG8VZ`=`Y8_*yJm``t)qwoVstU~ zv~sMTt*aPOeWhCfFx^ODGGUeTOVsi&VXhNjB2i$L9&AqZ&l(2%1B^0h`XCiEQ4YPA zsc<48+ZD+Ului)t&;&s;o_2!ZLJ0f{{)spM;E}Gf`S(`{ir#~PkbJ~=(|a@It!|L5 zJa-P>f9>93v38fpbVy7`j_D|QEiz3K)0AVHPWrZb1{71JvA zr;PGzz|r-iyuP4Qy3r34Y3j_?6pV9<1ZJ=k1HB23IsXXh&W*?s_)#rq=8* zsfq+V@qAcWqh9Mvkx67XC|sMu#uVo!Pp&t!W8vR(FPVxI=vgV(^4zU4YjDBH7KK|9 ziC!;ytTnYgWvt(N&avJA>u)*MT5Qi8>ohrkL4o&9pn4p2KafKi0+cTlYs1+q3(F zng_A$1#tw`TBxPGgqI!K)cjZ%({s&CBz}7_gD#fYmqI1cs#`NEcYxkZo8MJIf)_vk!@5 z_(Gg3cxk}m@D@Uc4BJ`*1Bd)B8065KzXleLM3Bmdu5C-MZCP4$HA}AM6=ECR{S^X2 zGH-VZ;dP|X`%U+@FPym7zDP<9ouXxrWB~z&HthnvY(AA4zrXih-$Ll#z@kTL+_N|) zx_Tv7?_Aj
            ~TJACJG_TrtR3-wa%&V@0t_9fA>Te9rV;X7}0-PnJ9|Fwbnfrqxn zC0pbD;d_S{F5Wx3ST8m06>a+@+diZL?pljWw6sf>_MD}Cv-J8*-M<^XK=|h9^*~K) z+OE{b&axK*o2tkB0_riZ+a5%2Q?F?2lWcuRaVhq{)VOakBsKOtXcS$8 zl50@YlwAuKrP|$#jbiOS(b6SZx^kAT|6Un_`H5$$BGqc85u{9F-Q^ufy^UlQNLYK7 z%CcCBHE7*`>zKlpuqlj8Q9P-dwA!`$ipEc)Q`D+BM5%4>OwhZ750lbs&tIRlccVFU~b3XF+{`G4dMU>G2I3K<3<{!hC4RG$+V z+YGGX9ED38bmm9ZZ3(_FM(b_T_Gqy`_4Meq29S*n;NvhUy8!n`&}_U1VBRm=#>Nkf zj|H)VL$;qq?v6wdTM_~;ycx)rNbJ&dgo9%YiUBW-5R@Zu7Jy7eBQef^+U)#n z=D@Y@ELpbZEL$NRyFhZxR*Bh~^@vP^5=6U!y@1*2NjF`an4h@Ym|;Je`grQ2={wV6 z^-igJr|8@{=S4o2Kg^uGUoO@6K4^NtJxDxA{5&Am4@>pKx!MuYF(R;eM+Mq{y0UDh zI#Zo*+Lb+=J-kRS(z)t=bEoD`J$CzUxxhd_x!92N?-SkopwX1+>i)S@CiX@6ubQOJ zL*lN((yqfI^}0m8o}*r0w)%3EZ!H@`0x4!=d!fglmyNO1WnfY%8b6H?W>RqQ2cBm5 zTT>8I>Cp9Ata;qQXKJLS9UNDfwDlmss?Bqz}xlZ z(j@nrjq_@0(wE~7@Q%a~l++?u!@PatlG-+Js(&46GL~#4;D`^Ea(tVB*z{%U+r+!% zQ|Q+8>l(V9Po;aqlFv=I6DX}L(Cx%@d!9+RMmR5_dx&=>2A*lo6SEX( z_5jV4LNh4juM~s;uOb9M%Imy`+s0aX58m*NykmxBZ7Bz9Px{m)rx80qgmCa4fKJ{9 z&~?|8vhi-t$hvtq#=!6{&dPdt7mm4DZy{vi9gwSxci?n0@8s;Pk9Xpjl`SuXD0T~Y zGMxz;W~2d1RI(Mk`G+L$g1;5&tGsIj4qe6Dcr$O|t%{g33xu-O2m-f82LcM$q$;rR zWxSDRcoPUs1`u#;=ghcX0~SJR6d`2Ri5(;-F2$1(4+bl??eHNY;e|W?e9QQ2>G#VW}x8-*)ZGIe=ZKBaV5yD{WB#g&@~-1gMdWI zKNxT-DmfCkWE-X_I2}ob65J%DD4IIwqZS>qZ*@fc@1*k)G38*_|wn`;7)2BE1fLuZm8_4&3Ih01!m^D6>CL8vS`#spR?39e_S(8`!dQFi{I zEd9pK>RZ*B(9OCf+qRr-o8pTDRek9CP-dTKtCwu`UlBf2XCBgyUq7B1$=2T)746NE z9qcGhYuy5iANiVXpX~p5fA$g>O)iTyFG)2ofo-H_&%>I&rJ6pmreCV*PY>T5{w8nV zn(0gr5m^GG3qq8sxSb(!Q%UYN>PbS%}LU(q1MZ~+rt zKL=9^9%<$A&2n{fW(V@>E}TX`Ag8)E$81?)NO$A1t33V3+1D3qa$5#O*T7dsgL@E& za@T)lqTKax!rDr}fe359c3Zx7$3ieScr0HV$k(>yYq#fX8&({q+O1y^CeK!(Z^cX4 z%0W#@pd(R#)3Rr{#_+c_^l*dmSB5hYzuRBL^fYZMZC{s<@}==5>nDpjReqfQ|S!_gvhiFIQd+dO7;YK>tNbZNW` zo5-yd=wXC3N|li}uCFAabG$r_#E&&L_KnL}KtRJ~^ggE)lmIJ=ZH*O0Z$^JY4$j(F zw{(zG2A|OV(TTxXw;vwbbT})8P3`OL;;L~4Z{@Om)npQ#0HX*xIt5<;;uda3$w4^k zS=*hB%#p8}TepncK4zHMaL=@xo)wh;#n1`+_jw`~kggdjUc*MUkDpmV~UQ!0e;X8X!t4v*dT~e{*BIA>apvo2g9Qg z*av6^&{L=e1y>i#AcJbLMQDMd6vW8U^RnTx=8%rQhRs+SuxXhJ8xX$vKZEv|SyRe# zo?y*?PNuBzw7}B_;|Ry*LHh!$68zzidddwpD9?r?RWhdfwt~fpJhKhP%9(ON8#LpU z1uE8FtW{rLdq@c^Q92Cz*aoNVO7ZE;)tl+HRGDsGdiC@{AK7^CI|N7Z=9DYuWbK8R z1!AV8YSJc%4@ln0JErg!#SLkD6Q!fgM2~rxII{!#4L;=K9lQx?ma|}l2d&eknIR|@ z%_9$Q&uZ7E+OfP#j};D3?Tig$N^l--P)CUabl_)E0`Ha057T3Xnl)RnT5-wea_iAN zzZ194iSV#a)Iz=tLDq#^i`xYU8tQcvI`!?*^pX>L>4nk;+nQVXvWa^Y$imKI#Z7Pu zqO(+U!jCm^__WbDa`NQyle0{J$EE0?6+Pqdgm2D%fN~o9ajLN&C35IXrYGdU6LQC_ z0nU@(KslfQ?1onOa>}S2Xf$%5I7XCxjtR}oz-N2~#{v3sO}30&4o7D27kt!Ad?w(N z?b9J{ijBV;3&JjjKH=l0f@cfQFgFa9$hL`CVgmdPprcO1G2|E~@*>L=bY(P0qQCS7*~F zmrNBoQ$?O}0v59ir`2CgWtb&XUCvaunoXNz@ny&*OI6NNmETe^XZvQ^R}S*O$(s(X z;<9}&`av|^o!Nb>Ph{#OrY^_S4W!$ z_rar-{#KU08C*T!U@*a#GXUo5^N?pa)0DaRQOnJv*@Fus_l}9aPSM;sXU?0w56x9e zX7mNH*)N&>Ief1eQE4k-^`?ifZ=2hOkdJ3Zi^xgS%On!5UM6+uv!0LIZXVB`Uzq$! z?6a7-Yfyr_Wk~c5iRPg>^PG8^wx{Xzw{AMJjOcDz@QLpBMT_X}73p4K^vWo7c)If1 z(EJeKrf>}ap{sGJ3z>^IC$pZLQPJJFwhH%sNhYq qhAdwpR4@!*@}mR|e1)n))TrPUa+D;!D})BVX|R#V8bs1~T>l@bj@!)u delta 1791 zcma)6OK2NM7@pacRxJ0Bqb>r1Z{3T_Rxz2>LUw2rh+|22B zX5zN@LekU?I+spm4XQQT3Zc1l%ChT>>~h8+3CpmZmT9J`?OHIbxg@2wBWF^}cIK?a z0=4C|k+ly}D`C;OT2r=?rWQ%%YzI3NI^SwLxC2|}`qF%oDiDY&h`omo`)#MtC7mE1 zfkB5cD-IlDPeK)?sE(8ljIhVu5$PE!Na6F!YYtel>YMC}M%A;+re&znXpA_yQ0bxk z5!n*%WJ}~NbI!p&?|Xis4p`CvVAo&dx^o%BN>IYLpEPl(=iuewNY;Ujr&(6RVByS+vDv%vA;?pmou_DX=1D6 zV=mj7vWyI6kH&9RH!lX32#4QLVSd6Xhg9H`yqR~27nqM{VSulYh1pQJm1QL*t4Y(V zE^3K}rL_->KQHS3jqe$N*I ze@JsplMsYkZFkW;-Tb%O^T0vRivB#prTbmZPvx38mYM`bzW8-338++7K(q1pZ>pziS z;?Jhr`$gj?jW-=PJnJJj8rBo#mLny%R(5L@gdG!mMrv#nwXvdqysBQ2VUbuV`b+bO ztEGAwiCxejeRoaY(h_Gv^sGqtTO@SFUTnK3Gp4?rHezH6R`N!tcLBf;#+A1) w!d*qAzWQ4Uv|;s71-0QFIECNEoUg$%EN~(eO-mRzLngc6Q!pg", ln, line) + """ + print("Final texts string:") + print('\n'.join(texts)) + """ - print() - # Write to post database cf_update_values("after") - + #===========================================# # Check full article contents (head + text) # @@ -394,8 +392,9 @@ def ml_tag_values(ln, tag, stats): return False # value1 must not starts or contains:o - elif value1.startswith("_"): - post.error = debug.out(56, "%s) '_...'"%(ln+1), post.uri, True, 2, False) + elif "_" in value1: + post.error = \ + debug.out(56, '%s) "_" : "%s"'%(ln+1, value1), post.uri, True, 2, False) return False # Specific for image: logo name is reserved @@ -442,7 +441,7 @@ def ml_tag_values(ln, tag, stats): 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 + value2, "%s link"%css, value3, value1 ) # file: @@ -451,7 +450,7 @@ def ml_tag_values(ln, tag, stats): 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 + value2, "%s file"%css, value3, value1 ) # image: @@ -487,7 +486,14 @@ def ml_tag_values(ln, tag, stats): line = tyto.code_line%(ln, line) htmlbcode = "%s\n%s"%(htmlbcode, line) - html_value = tyto.code_bcode%(css, htmlbcode) + footer_code = '\n
            \n' + \ + '

            \n' + \ + '%s\n'%( + value2, value3, "Source" + ) + \ + '

            \n' + \ + '
            ' + html_value = tyto.code_bcode%(css, htmlbcode, footer_code) html_value = tools.b64_convert("encode", html_value) # abbr: @@ -587,7 +593,8 @@ def sl_ptags(markers): if index0 >= 0 : content = "%s\n%s"%(content, line) if markers[2] == "bcodes": - texts[ln - 1 - post.head_lines] = "" + if index1 != index0: + texts[ln - 1 - post.head_lines] = "" # Opened mark if line.lstrip().startswith(markers[0]): @@ -601,9 +608,11 @@ def sl_ptags(markers): ), post.uri, True, 2, False) return False continue + csstest = tools.get_css(line, markers[0], ln) if post.error > 0: return + index0 = line.index(markers[0][0]) tag_ln = ln content = line @@ -612,12 +621,14 @@ def sl_ptags(markers): # Closed mark if line.lstrip().startswith(markers[1]): + # But not opened if index0 < 0: post.error = \ debug.out(53, '%s) %s: %s...'%( ln, markers[2], markers[0] ), post.uri, True, 2, False) return False + index1 = line.index(markers[1][0]) # at same position as opened if index1 == index0: @@ -633,6 +644,10 @@ def sl_ptags(markers): if markers[2] in ("parags", "divs"): continue + elif markers[2] == "bcodes": + texts[ln - 1 - post.head_lines] = \ + "%s_%s"%(markers[2][:-1], post.ptags_stats[markers[2]]) + # Set keys, values to post database post.cf_set( markers[2].upper(), @@ -726,59 +741,65 @@ def icodes(): if markers[0][0] in line: # Double mark first - line = line.replace(markers[0][0], markers[0][4]) - line = line.replace(markers[0][1], markers[0][5]) + line = line.replace(markers[0][0], markers[0][4]) + line = line.replace(markers[0][1], markers[0][5]) icodes = re.findall('%s(.*?)%s'%(markers[0][4], markers[0][5]), line) for icode in icodes: stats_text_icodes += 1 + icleg = markers[0][0] + icode + markers[0][1] icnew = markers[0][4] + \ tools.convert_html_signs(icode) + \ markers[0][5] icrep = markers[0][4] + \ icode + \ markers[0][5] - line = line.replace(icrep, "") + line = line.replace(icrep, "icode_%s"%stats_text_icodes) # Set HTML [ICODES] to post database html_val = icnew.replace(markers[0][4], markers[0][2]%css) + html_val = html_val.replace(markers[0][5], markers[0][3]) + html_val = tools.b64_convert("encode", html_val) post.cf_set( "ICODES", "icode_%s"%stats_text_icodes, - markers[0][0] + icode + markers[0][1] + icleg ) post.cf_set( "ICODES", "html_%s"%stats_text_icodes, - html_val.replace(markers[0][5], markers[0][3]) + html_val ) # Single mark - line = line.replace(markers[1][0], markers[1][4]) - line = line.replace(markers[1][1], markers[1][5]) + line = line.replace(markers[1][0], markers[1][4]) + line = line.replace(markers[1][1], markers[1][5]) icodes = re.findall('%s(.*?)%s'%(markers[1][4], markers[1][5]), line) for icode in icodes: stats_text_icodes += 1 + icleg = markers[1][0] + icode + markers[1][1] icnew = markers[1][4] + \ tools.convert_html_signs(icode) + \ markers[1][5] icrep = markers[1][4] + \ icode + \ markers[1][5] - line = line.replace(icrep, "") + line = line.replace(icrep, "icode_%s"%stats_text_icodes) # Set HTML [ICODES] to post database html_val = icnew.replace(markers[1][4], markers[1][2]%css) + html_val = html_val.replace(markers[1][5], markers[1][3]) + html_val = tools.b64_convert("encode", html_val) post.cf_set( "ICODES", "icode_%s"%stats_text_icodes, - markers[1][0] + icode + markers[1][1] + icleg ) post.cf_set( "ICODES", "html_%s"%stats_text_icodes, - html_val.replace(markers[1][5], markers[1][3]) + html_val ) texts[ln - 1 - post.head_lines] = line @@ -850,7 +871,7 @@ def sl_stags(): real_com = line.lstrip()[3:] post.cf_set( "COMMENTS", - "comm_%s"%stats_html_coms, + "comment_%s"%stats_html_coms, line.lstrip() ) post.cf_set( @@ -1098,8 +1119,13 @@ def cf_update_values(part): stats_tyto_all_coms > 0 and \ post.cf_set("STATS_FILE", "tyto_coms", str(stats_tyto_all_coms)) + # Add base64 new article TEXTS + post.cf_set("TEXTS", "post", tools.b64_convert("encode", '\n'.join(texts))) + # ============================ # Write new values in database # ============================ post.cf_write() + # Show done message + debug.out(254, "[%s]"%post.title[1], post.uri, True, 0, False) diff --git a/src/var/lib/tyto/program/debug.py b/src/var/lib/tyto/program/debug.py index 5e4fe7e..b7faf0a 100644 --- a/src/var/lib/tyto/program/debug.py +++ b/src/var/lib/tyto/program/debug.py @@ -84,6 +84,7 @@ def out(nbr, var, val, show, color, stop): 7 : langs.logs.err_cr_file, 8 : langs.logs.err_lang, 9 : langs.logs.err_ini_file, + 10 : langs.logs.err_post_global, 20 : langs.logs.err_bad_uri, 21 : langs.logs.err_post_sep, 22 : langs.logs.err_post_head, @@ -114,6 +115,7 @@ def out(nbr, var, val, show, color, stop): 208 : langs.logs.website_lang, 209 : langs.logs.domain_on, 210 : langs.logs.post_chk_yet, + 254 : langs.logs.post_chk_ready, 255 : langs.logs.later, } diff --git a/src/var/lib/tyto/program/post.py b/src/var/lib/tyto/program/post.py index 01a758b..5c6f552 100644 --- a/src/var/lib/tyto/program/post.py +++ b/src/var/lib/tyto/program/post.py @@ -122,12 +122,6 @@ def is_tyto_format(): if not separator: error = debug.out(21, sep, uri, True, 2, False) return False - - print("===") - print(head_contents) - print("===") - print(text_contents) - print("===") if not head_contents: error = debug.out(22, "?", uri, True, 2, False) @@ -209,20 +203,22 @@ def cf_datas(): def compare_datas(): global do_chk, do_wip + # check can be done ? do_chk = False - - if chk_errors: + if chk_errors or \ + chk_static != domain.static or \ + args.force == True: do_chk = True - do_wip = False - - if chk_static != domain.static: - do_chk = True - - if args.force: - do_chk = do_wip = True - else: do_chk = tools.compare_values(wrk_id, chk_hash) + + + # wip can be done + do_wip = False + if wip_static != domain.static or \ + args.force: + do_wip = True + else: do_wip = tools.compare_values(chk_hash, wip_hash) @@ -388,13 +384,13 @@ html_titles = { "#5" : '
            %s
            ', } -html_brline = ("|", '
            ') -html_hrline = ("--", '
            ') +html_brline = ("|", '
            ') +html_hrline = ("--", '
            ') text_comments = (";;", ""%post.cf.get("HEADERS", "title") + + for line in raw_post.rsplit("\n"): + # Line is empty + if not line or line == " ": + continue + + # Line is a tyto comment or tyto title + if line.lstrip().startswith("#") and \ + not line.lstrip().startswith(post.tyto_titles): + continue + + html_post = "%s\n%s"%(html_post, line) + + +#============================# +# Convert words tags to HTML # +#----------------------------# +def words_tags(): + for tags in post.words_tags: + text_replace(tags[0], tags[3]%domain.css) # Opened tag + text_replace(tags[1], tags[4]) # closed tag + text_replace(">%s<"%post.words_ml_tag, "><") # multiple tags for words + + +#=========================# +# Convert Start line tags # +# anchors, paragraphs... # +#-------------------------# +def sl_tags(): + for line in html_post.rsplit("\n"): + css = "" + + # Paragraphs + if line.lstrip().startswith(post.ptags[2][0]): + css = tools.get_css(line, post.ptags[2][0], "?") + text_replace(line, post.ptags[2][3]%css) + elif line.lstrip().startswith(post.ptags[2][1]): + text_replace(line, post.ptags[2][4]) + + # DIVs + if line.lstrip().startswith(post.ptags[4][0]): + css = tools.get_css(line, post.ptags[4][0], "?") + text_replace(line, post.ptags[4][3]%css) + elif line.lstrip().startswith(post.ptags[4][1]): + text_replace(line, post.ptags[4][4]) + + #
            + elif line.lstrip().startswith(post.html_brline[0]): + css = tools.get_css(line, post.html_brline[0][0], "?") + text_replace(line, post.html_brline[1]%css) + + #
            + elif line.lstrip().startswith(post.html_hrline[0]): + css = tools.get_css(line, post.html_hrline[0][0], "?") + text_replace(line, post.html_hrline[1]%css) + + + # Anchors + elif line.lstrip().startswith(post.anchor_target[0]): + css = tools.get_css(line, post.anchor_target[0], "?") + text_replace(line, post.anchor_target[1]%css) #=========================================================# @@ -69,7 +271,7 @@ def bcode(lines, ln): if not html_bcode: html_bcode = line else: html_bcode = "%s\n%s"%(html_bcode, line) - html_bcode = tyto.code_bcode%(css, html_bcode) + html_bcode = tyto.code_bcode%(css, html_bcode, "") post.cf_set("STATS_TEXTS", "bcodes_lines", str(post.stats_bcodes_lines)) @@ -170,8 +372,6 @@ def quote(lines, ln): footer ) - #print(html_quote) - return html_quote @@ -287,21 +487,7 @@ def convert_list(markdown_str, mark_b, mark_c): return work_str -#=========================# -# WIP process #==================================================== -# Convert article to HTML # -# Create new file # -#-------------------------# - -#============================# -# code # -# Used by check module that # -# convert file lines to HTML # -#----------------------------# -def code(lines): - print("soon...") - - +""" # # Not Yet done, soon... # @@ -312,3 +498,4 @@ def paragraphs(): html_quote = "%s\n%s"%(html_quote, post.ptags[2][3]%p_css) elif line.startswith(post.ptags[2][1]): html_quote = "%s\n%s"%(html_quote, post.ptags[2][4]) +""" diff --git a/src/var/lib/tyto/translations/__pycache__/logs_fr.cpython-311.pyc b/src/var/lib/tyto/translations/__pycache__/logs_fr.cpython-311.pyc index 7ce1f6823851102e63a4ef1b7e04066c22588bbe..39b5d99a7fc9592b959745d1c49e10fddab1e882 100644 GIT binary patch delta 256 zcmaDYaYT}LIWI340}$}XIi!A^$ScWsX`=cxR+T7~6po3940xgpQw*bwQjCHbG>s>I zYmt-%D)r4TDb`KSIlQu1A*ECyB|kSYGcR@XRK~B2A_72Z$D)$VD11|^`Spana05g|QivR!s delta 196 zcmX>i`C5W^IWI340}!ZbYNu|T$ScWsYNGlyR*oo@6qSjG3|N90Gz};IYmt@*D)G%P zDb`KSIlQu1A^q^myu&MtG7C#ni#N|^{K`0aDYL(Lm8f$@Vo`c(ZfahMLQ1JZT4r)a zW@^!74wkQ*g;}>SGa7C_!O_P!Ii2guWN&UiE(@Tcj6ht>KY1~?F{8=k>)cghAJ`ZK qG#a>X@T)X%-Qd@3-~}JaS+yOVEw=+Ey&Wq3xY*vK&=34$~<)d diff --git a/src/var/lib/tyto/translations/logs_en.py b/src/var/lib/tyto/translations/logs_en.py index e8ccef8..e65e301 100644 --- a/src/var/lib/tyto/translations/logs_en.py +++ b/src/var/lib/tyto/translations/logs_en.py @@ -33,6 +33,66 @@ # Réponses valides (! NON sensible à la case : oui = OUI, Oui...) ok = ("yes", "y") +# Form +q = " ?" +configure_domain = "Configure domain" +domain_title = "Domain title" +domain_date = "Creation date" +domain_about = "Domain description" +domain_mail = "Admin mail" +domain_tags = "Domain tags [1,2,3]" +domain_lang = "Website lang" +domain_srv = "Server URI" + +# Misc +anchor_title = "Anchor title" + +# logs for debug +#--------------- +# Errors +err_arg = "Argument error" +err_hole = "Current directory error" +err_date = "Date error" +err_lang = "Lang error" +err_dir = "Directory error" +err_no_dir = "Directory unused" +err_cd = "Directory not created" +err_no_file = "File unused" +err_cr_file = "File not created" +err_bad_uri = "URI error" +err_post_sep = "Separator unused" +err_post_head = "Header is empty" +err_post_empty = "Article is empty" +err_ini_file = "Configuration error" +err_post_data = "Data unused" +err_post_title = "Title error" +err_post_paired = "Markers not paired" +err_post_in_tag = "Markers without contents" +err_post_datatag= "Data reserved" +err_post_id_yet = "ID used yet" +err_post_global = "Article Error" + +# Warnings +warn_no_dom = "Domain not configured" +domain_off = "Domain deactivated" +reset_dom = "RESET domain" + +# infos +load_file = "File loaded" +lang_logs_sys = "Logs lang" +website_lang = "Website lang" +domains_no = "Domain not found" +domain_found = "Domain exists" +domain_on = "Domain activated" +domain_created = "Domain updated yet" +domain_updated = "Domain updated" +domain_new = "Domain created" +created_dir = "Directory created" +created_file = "File created" +updated_file = "File Updated" +post_chk_yet = "Article checked yet" +post_chk_ready = "Article checked" +later = "Maybe later..." # # Show HELP @@ -44,6 +104,7 @@ tyto [action] [target] [options] set : set website lang, domain values (title, server...) start : activate domain (default "no" when created) stop : deactivate domain + show : [domains] check : wip : publish : diff --git a/src/var/lib/tyto/translations/logs_fr.py b/src/var/lib/tyto/translations/logs_fr.py index 9f98177..061786e 100644 --- a/src/var/lib/tyto/translations/logs_fr.py +++ b/src/var/lib/tyto/translations/logs_fr.py @@ -40,7 +40,7 @@ domain_title = "Titre du domaine" domain_date = "Date de création" domain_about = "Description du domaine" domain_mail = "Courriel de l'administration" -domain_tags = "Mots-clés génériques [1,2,3]" +domain_tags = "Mots-clés du domaine [1,2,3]" domain_lang = "Langue du site web" domain_srv = "URI du serveur" @@ -70,6 +70,7 @@ err_post_paired = "Marqueurs non apairés" err_post_in_tag = "Marqueurs sans contenu" err_post_datatag= "Donnée réservée" err_post_id_yet = "Identité déjà utilisée" +err_post_global = "Article erronné" # Warnings warn_no_dom = "Domaine non configuré" @@ -77,7 +78,7 @@ domain_off = "Domaine désactivé" reset_dom = "RÉINITIALISE le domaine" # infos -load_file = "Chargement du fichier" +load_file = "Fichier chargé" lang_logs_sys = "Langue des logs" website_lang = "Langue du site web" domains_no = "Aucun domaine trouvé" @@ -90,10 +91,9 @@ created_dir = "Dossier créé" created_file = "Fichier créé" updated_file = "Fichier mis à jour" post_chk_yet = "Article déjà vérifié" +post_chk_ready = "Article vérifié" later = "Peut-être plus tard..." - - # # Show HELP #