Salut !
On est de plus en plus HS sur fclj. À défaut d'une meilleure idée, je
fais suivre vers fr.comp.usenet.serveurs
Le 08/04/2013 18:56, Julien Arlandis a écrit :
>>
>> Ça ne pourra fonctionner correctement que quand tu l'implémenteras
>> dans l'éditeur et non pas après coup. Au fait, est-ce seulement
>> possible ? Qu'est-ce que tu utilises pour la rédaction du contenu
>> des articles ?
>
> Un simple textarea, j'ai vérifié que google groups ne l'implémente pas
> non plus,
C'est l'une des tares rédhibitoires de Google groupes en tant que
nouvelleur. Certes, ce n'est pas la seule.
> y a t-il seulement un webmail qui le propose?
D'habitude je fuis les webmails, mais je viens d'essayer celui de
GalacSys. Il propose par configuration de choisir la taille de la
zone de saisie (nombre de lignes et nombre de colonnes, par défaut
24 lignes de 78 colonnes), et il fait le wordwrap en conséquence.
Si j'insère des sauts de ligne, il en tient compte. Il semble donc
que celui-ci le propose.
> En fait je ne comprends toujours pas l'intérêt de couper une phrase en
> insérant un retour chariot en plein milieu alors même que l'affichage
> est parfaitement géré par le client sans cet artifice.
Parfaitement géré ? Permets-moi de ne pas être d'accord
! Je te donne ici deux exemples de ce que je disais à 12
h 19 dans mon article précédent.
Tu pourras me répondre que dans ce cas l'émetteur devrait mettre
des espaces insécables au lieu des espaces simples, ce à quoi je te
rétorquerai d'essayer avec Internet Explorer ou Firefox : à moins
que ça n'ait été corrigé depuis la dernière fois que j'ai essayé,
c'est impossible.
> Encore que si les
> retours chariots automatiques étaient différents des retours chariots
> manuels je pourrais décider de les ignorer côté HTML,
Mais non, il ne s'agit pas de les ignorer, bien au contraire ! S'il y
a un saut de ligne fait automatiquement lors de la composition, et
si l'auteur est content avec ça (il n'en insère pas un autre avant),
alors c'est qu'il faut l'officialiser au moment de l'envoi. Finalement,
ça ne doit pas être si difficile que ça...
> Pour faciliter le travail de celui qui va répondre on dénature la
> syntaxe même de la phrase, laquelle n'exige un retour à la ligne qu'à la
> fin de celle ci, et pas là où on devine que le lecteur l'attend.
Pour ne *pas* dénaturer le texte écrit par l'auteur, il faut et il
suffit que ce qui est envoyé corresponde exactement à ce que l'auteur
voyait au moment de cliquer sur le bouton d'envoi.
Je ne vois rien, les deux grandes zones sont vides.
> Y aura une autre hiérarchie 100% compatible JNTP, ce n'est pas tout car
> toutes les évolutions du protocole ne seront pas compatibles avec NNTP,
> pour assurer l'intéropérabilité des deux protocoles elles ne seront pas
> activées pour l'usage des hiérarchies communes. Néanmoins, je compte
> développer une nouvelle hiérarchie Nemo qui appliquera le protocole JNTP
> à 100%, elle ne pourra donc pas être relayée sur NNTP pour des raisons
> de sécurité, car j'ai prévu que le nouvel identifiant (le JID) soit un
> hash de l'ensemle des entêtes obligatoires et non modifiables de
> l'article. Tout article dont le hash n'est pas valide sera
> automatiquement éjecté et par le client et par le serveur. J'ai
> également prévu un champ pour signer numériquement l'article, l'idée est
> simple : chaque utilisateur génère une phrase secrète qu'il stocke dans
> son client. Lors de la rédaction d'un article, il réalise avant
> d'expédier l'article les opérations suivantes :
>
> MyHash = SHA1(From + Subject + Body + Newsgroups + SHA1(From + Subject
> + Body + Newsgroups + phrase_secrete))
Ça me semble compliqué, et source d'erreurs dans les implémentations
concurrentes de la tienne (qui, je le rappelle, doivent exister si
tu comptes standardiser ton protocole). Par exemple, la suppression
des lignes vides à la fin du Body, ou un folding en plus ou en moins
dans le champ Subject, détruiraient ton hash.
Pourquoi pas tout simplement :
MyHash = SHA1(Message-ID + SHA1(Message-ID + phrase_secrete))
?
> Pour prouver son identité lors de la suppression ou de la modification
> de son message, l'auteur devra fournir la clé
> SHA1(From + Subject + Body + Newsgroups + phrase_secrete)
>
> Si le hash de cette clé concaténée au message est identique à MyHash
> c'est qu'il est l'auteur de l'article.
Étant entendu que la « modification » est aussi une suppression de
l'article d'origine, ça devrait fonctionner. Parce que sinon, dès
qu'un auteur aurait fait une modification, n'importe qui aurait pu
venir remodifier l'article d'origine avec la même clé.
> Chose nouvelle également, le JID sera de cette forme
> SHA1(enêtes+body)@domaine_du_serveur_de_news_emetteur
Entre les entêtes qui peuvent changer et l'obligation d'unicité, je
soupçonne qu'il risque d'y avoir des problèmes, sans en être sûr.
Il faudra soigneusement vérifier tout ça.
> Les serveurs devront avoir un certificat numérique valable et devront
> signer tous les articles émis par leurs abonnés. Toutes ces règles ne
> seront pas optionnelles, elles devront être appliquées.
Ça apportera quoi exactement, que n'apporte pas déjà le champ Path ?
>> Pour l'émetteur soucieux de bonne typographie : il insèrera de toute
>> façon des sauts de ligne, ne serait-ce que pour que la coupure ne
>> se fasse pas avant un « : » ou au milieu de « 20 h 30 ». S'il les
>> insère un tout petit peu trop loin par rapport à l'affichage de ceux
>> qui vont le lire, par exemple au bout de 90 caractères au lieu de
>> 80, cela reproduira à l'affichage le bug d'Outlook Express : une
>> alternance de lignes longues et de lignes courtes.
>
> Su un navigateur, la typographie se gère à l'affichage et pas à la
> rédaction, c'est ce qui assure la compatibilité de lecture sur
> différents médias.
Une page web est faite pour être affichée de plein de façons
différentes selon les préférences du lecteur, c'est pour ça que
l'auteur de cette page se doit d'utiliser des partout où
c'est nécessaire.
Un article de news est fait pour être affiché en texte, avec au
maximum 78 caractères par ligne, et de préférence dans une police
à espacement fixe. C'est sous ces conditions que l'on peut faire
un schéma en art-ascii, puisqu'on ne peut pas insérer une image.
> Je ne comprends toujours pas ce qu'est ce format=flowed, que fait il
> exactement, à quoi sert il, à qui est il destiné?
Ce n'est pas moi qui en ferai la pub. Il y a un RFC qui le décrit,
si ça t'intéresse d'en savoir plus.
>> J'ai trouvé comment traiter le cas où c'est le premier article qui
>> manque. Je n'ai pas encore testé, mais il suffit de rajouter une
>> dizaine de lignes dans mon code, sans rien changer d'autre. Dès
>> que j'ai le temps, je les écris ici (à moins que tu ne préfères
>> attendre que j'aie testé d'abord, et alors ce ne sera pas avant
>> cette nuit).
>
> Pas de soucis, je n'ai pas encore eu le temps d'implémenter ton algo en
> javascript, mais les choses avancent ...
Finalement ça vaut mieux, puisque j'avais oublié une ligne dans le code
d'origine. Voici la fonction modifiée.
function construis_arbo($liste)
{
$arbre = array("" => array());
$substitut = array();
while ($liste) {
foreach ($liste as $id => &$refs) {
// voyons un article non encore placé dans l'arbre
while ($refs) {
// on regarde la dernière référence de l'article
$ref = end($refs);
if (isset($arbre[$ref])) {
// l'article en référence est dans l'arbre :
// on peut placer le nouvel article.
$arbre[$ref][] = $id;
$arbre[$id] = array();
unset($liste[$id]);
continue 3; /* while ($liste) */
}
if (isset($substitut[$ref])) {
// l'article en référence n'est dans l'arbre car
// il n'était pas dans la liste, mais un autre
// article le remplace : on peut donc placer le
// nouvel article aussi.
$arbre[$substitut[$ref]][] = $id;
$arbre[$id] = array();
unset($liste[$id]);
continue 3; /* while ($liste) */
}
if (isset($liste[$ref])) {
// l'article en référence est encore à placer :
// voir un autre article, celui-ci sera traité
// plus tard.
continue 2; /* foreach ($liste) */
}
// l'article en référence n'existe pas : on le
// supprime de la liste des références.
array_pop($refs);
// si le premier article d'un fil de discussion
// n'existe pas, on lui choisit un substitut.
if (! $refs) {
$substitut[$ref] = $id;
}
}
// Cet article n'a pas (ou n'a plus) de références : on le
// place à la racine de l'arbre
$arbre[""][] = $id;
$arbre[$id] = array();
unset($liste[$id]);
continue 2; /* while ($liste) */
}
// S'il n'y a pas de références circulaires (a -> b -> a par
// exemple), $liste doit être vide. Sinon, on retire la dernière
// référence du premier article, qui existe forcément puisque
// tous les articles non traités le sont à cause d'une référence
// non résolue, et on repart pour un tour.
foreach ($liste as $id => &$refs) {
// Le fait d'utiliser foreach est une bidouille, en réalité
// on ne touche qu'au premier article avant de repartir au
// début.