PluXml.org

Blog ou CMS à l'Xml

Vous n'êtes pas identifié(e).

Annonce

/* HaCKeD By ifactoryx Dimanakah adanya keadilan Bila masih memandang golongan Yang kuat selalu berkuasa Yang lemah pasti merana :>( */

#1 05/03/2018 00:49:02

Alba
Membre
Lieu : Paris
Inscription : 30/06/2006
Messages : 73
Site Web

Titre et retour à la ligne

Hello !

Je galère sur la mise en forme typographique de mes titres d'articles.
Si l'on peut utiliser l'astuce de l'espace insécable (alt+espace sur mac) pour forcer une préposition ou un article
à revenir à la ligne, le raccourci alt+entrée m'envoie un aperçu de l'article. Et la balise <br /> reste affichée.

Dans cet exemple : https://imgur.com/5p4W1ge
Avec une espace insécable je me retrouve avec une ligne orpheline

[== Indéfini ==]
Joseph Gallieni, une gloire 
oubliée ?

hmm

Je pourrais ajouter une espace insécable entre chaque mot après Gallieni,
mais la ligne sera alors trop longue sur smartphone.

Bref, c'est du pinaillage, mais avez-vous déjà été confronté aux retours à la ligne dans les titres ?

Hors ligne

#2 05/03/2018 01:15:10

bazooka07
Membre
Lieu : Quelque part en Rhône-Alpes
Inscription : 06/02/2014
Messages : 1 005
Site Web

Re : Titre et retour à la ligne

Aux titres, pas vraiment. J'essaie de faire court pour ne pas lasser le visiteur d'entrée.

Par contre, c'est un problème récurrent avec les tables.
L'astuce consiste à emballer le tout dans un container <div> et de lui appliquer la class scrollable-table qui a la règle overflow: auto.
Tu as des exemples dans la partie admin de PluXml avec les listes des articles et commentaires.

Petit bout de code pour une table plus large que la fenêtre du navigateur :

[== HTML ==]
<div class="scrollable-table">
  <table>
   ....
  </table>
</div>
[== CSS ==]
div.scrollable-table { overflow: auto; }
div.scrollable-table table td { white-space: nowrap; }

Tu dois pouvoir mettre ton titre à la place de la table.

Hors ligne

#3 05/03/2018 09:27:45

Gzyg
Membre
Inscription : 25/09/2006
Messages : 870
Site Web

Re : Titre et retour à la ligne

Salut,

Le problème est surtout que, contrairement à WordPress qui le gère très bien, PluXml refuse les entités HTML ou unicode dans les titres (pas de &nbsp; ou de &#8239; par exemple). Ce qui oblige à renoncer à la typographie française sur des titres de blogs francophones. Ça se contourne en jouant sur la longueur des titres comme le fait remarquer bazooka07 mais c'est relou. D'autant que c'est aussi valable pour les titres des pages statiques et donc des intitulés du menu de navigation principale.

J'ai soulevé ce problème il y a déjà longtemps mais il paraît que ça pose un problème de sécurité. Je ne peux pas en juger, n'étant pas développeur, mais en tant que rédacteur et qu'intégrateur ça ne me facilite pas la tâche.

Et quand la typographie est une part importante du design, bye bye PluXml, hello WordPress. C'est quand même dommage. devil


à plus,

Gzyg

Hors ligne

#4 05/03/2018 16:52:11

bazooka07
Membre
Lieu : Quelque part en Rhône-Alpes
Inscription : 06/02/2014
Messages : 1 005
Site Web

Re : Titre et retour à la ligne

Gzyg,

C'est lié partiellement à la sécurité et pas directement;

Pour afficher les titres d'articles, pages statiques, titre de page , sous-titre, ... $plxShow utilise des fonctions qui font appel à la fonction plxUtils::strCheck incluse dans PluXml qui fait à son tour appel à une pure fonction PHP htmlspecialchars qui remplacent tous les caractères &,<, >, ', " par leurs entités HTML.

Plus précisément lorsque que on représente un espace insécable dans un titre par son entité &nbsp;, il sera transformé en &nbsp;nbsp; avant affichage de la page.

Le problème se manifeste aussi par exemple lorsque qu'on veut forcer un retour à la ligne pour un sous-titre très long.

Je te propose une solution pour contrer cela :
Pour marquer un espace insécable dans un titre, on utilisera le caractère underscore "_". Pareillement, pour forcer un retour à la ligne, on utilisera le caractère "|".
Il suffit ensuite de modifier la fonction strCheck() vers la ligne 667 dans le fichier core/lib/class.plx.utils.php comme ci-dessous pour transformer ces 2 caractères en "&nbsp;" et "<br />" respectivement.
Il y a un petit détail à prendre en compte, la fonction plxUtils::strCheck() est utilisé côté admin et côté site. Il faut donc limiter ces transformations côté site.:

[== PHP ==]
public static function strCheck($str) {

    if(!defined('PLX_ADMIN')) {
        $replaces = array(
            '_' => '&nbsp;',
            '|' => '<br />'
        );
        return str_replace(
            array_keys($replaces),
            array_values($replaces),
            htmlspecialchars($str, ENT_QUOTES, PLX_CHARSET)
        );
    } else {
        return htmlspecialchars($str, ENT_QUOTES, PLX_CHARSET);
    }
}

Donc pour avoir un espace insécable, utiliser le caractère "_" et pour forcer un retour à la ligne, utiliser le caractère  "|".
Voici quelques exemples pour le site https://kazimentou.fr :
Mon blog perso|et autres disgressions
KzInstall : PluXml prêt en quelques_secondes
Afficher des_drapeaux sur son_blog_PluXml
Installation de_Alpinelinux sur un_RaspberryPi_1B_ou_3B

Hors ligne

#5 05/03/2018 17:15:37

Gzyg
Membre
Inscription : 25/09/2006
Messages : 870
Site Web

Re : Titre et retour à la ligne

Merci pour l'astuce smile

Mais modifier le core n'est pas une solution pérenne... Un p'tit "pull request"  ?  wink



à plus,

Gzyg

Hors ligne

#6 05/03/2018 21:04:18

Alba
Membre
Lieu : Paris
Inscription : 30/06/2006
Messages : 73
Site Web

Re : Titre et retour à la ligne

Ah très cool, je vais essayer ces modifs, merci !

Hors ligne

#7 06/03/2018 17:11:46

Gzyg
Membre
Inscription : 25/09/2006
Messages : 870
Site Web

Re : Titre et retour à la ligne

Petit bémol d'affichage avec le workaround de bazooka07

(par exemple) le site kazimentou.fr

Dans on résultat de recherche, Google affiche : Mon blog perso|et autres disgressions (avec le | )
La barre de titre de Firefox affiche : Mon blog perso<br />et autres digressions (avec la balise <br /> bien visible).


à plus,

Gzyg

Hors ligne

#8 07/03/2018 01:10:05

bazooka07
Membre
Lieu : Quelque part en Rhône-Alpes
Inscription : 06/02/2014
Messages : 1 005
Site Web

Re : Titre et retour à la ligne

@Gzyg,

Petit bémol au petit bémol :
J'ai fait la modif sur kazimentou.fr hier seulement et Google n'est pas repassé depuis.
Le résultat de la page de recherche est un truc en cache chez Google pas la vraie vie.

Ceci dit ta remarque est pertinente.
Il faut modifier la fonction plxShow::pageTitle().

Le souci c'est que le code que je vois pour cette fonction me pique les yeux beaucoup trop :
- la ligne "$subtitle = $this->plxMotor->aConf['title'];" est répétée 7 ou 8 fois
- il y a toute une enfilade de if pour tester "$this->plxMotor->mode" alors qu'une instruction switch serait tout à fait pertinente
- une expression régulière qui "matche" de travers
- d'autres petits détails.

Après une bonne révision du code, on arrive à ceci :

[== PHP ==]
	public function pageTitle($format=false, $sep=';') {

		# Hook Plugins
		if(eval($this->plxMotor->plxPlugins->callHook('plxShowPageTitle'))) return;

		switch($this->plxMotor->mode) {
			case 'categorie':
				$title_htmltag = trim($this->plxMotor->aCats[$this->plxMotor->cible ]['title_htmltag']);
				$title = !empty($title_htmltag) ? $title_htmltag : $this->plxMotor->aCats[$this->plxMotor->cible]['name'];
				break;
			case 'article':
				$title_htmltag = trim($this->plxMotor->plxRecord_arts->f('title_htmltag'));
				$title = !empty($title_htmltag) ? $title_htmltag : $this->plxMotor->plxRecord_arts->f('title');
				break;
			case 'static':
				$title_htmltag =  trim($this->plxMotor->aStats[$this->plxMotor->cible ]['title_htmltag']);
				$title = !empty($title_htmltag) ? $title_htmltag : $this->plxMotor->aStats[$this->plxMotor->cible]['name'];
				break;
			case 'archives':
				if(preg_match('/^(\d{4})(\d{2})?(\d{2})?/', $this->plxMotor->cible, $capture)) {
					$year = !empty($capture[1]) ? ' '.$capture[1] : '';
					$month = !empty($capture[2]) ? ' '.plxDate::getCalendar('month', $capture[2]) : '';
					$day = !empty($capture[3]) ? ' '.plxDate::getCalendar('day', $capture[3]) : '';
					$title = L_PAGETITLE_ARCHIVES.$day.$month.$year;
				}
				break;
			case 'tags':
				$title = L_PAGETITLE_TAG.' '.$this->plxMotor->cibleName;
				break;
			case 'erreur':
				$title = $this->plxMotor->plxErreur->getMessage();
				break;
		}

		$patterns = array('_', '|');
		$subtitle = str_replace($patterns, ' ', $this->plxMotor->aConf['title']);
		if(empty($title)) {
			$title = $subtitle;
			$subtitle = str_replace($patterns, ' ', $this->plxMotor->aConf['description']);
		} else {
			$title = str_replace($patterns, ' ', $title);
		}
		$replaces = array(
			'#title'	=> $title,
			'#subtitle'	=> $subtitle
		);

		if(
			is_string($format) and
			preg_match('/'.$this->plxMotor->mode.'\s*=\s*([^'.$sep.']*)/i', $format, $capture)
		) {
			$format = trim($capture[1]);
		}
		if(empty($format)) {
			$format = '#title - #subtitle';
		}

		echo plxUtils::strCheck(str_replace(
			array_keys($replaces),
			array_values($replaces),
			$format
		));
	}

Aucun souci sur mon PC. Je le donnerai à manger à Google demain.

Comme quoi, il faut se hâter lentement d'envoyer des pull requests

Dernière modification par bazooka07 (07/03/2018 01:11:12)

Hors ligne

#9 22/03/2018 01:04:16

jibe
Membre
Inscription : 18/02/2018
Messages : 29

Re : Titre et retour à la ligne

Salut,

Merci pour l'astuce  smile

As-tu un résultat concernant la prise en compte par Google ?

Quand on regarde le code HTML généré, on voit le <br /> à l'intérieur de la balise <h2>. Je ne sais pas comment Google réagit à ça ? C'est parfaitement correct, mais je crois bien que je n'ai jamais vu un <br /> au milieu d'un <hx> ! Du coup, dans le doute, j'ai testé

[== PHP ==]
           '|' => '</h2><h2>'

au lieu de

[== PHP ==]
           '|' => '<br />'

dans plxUtils::strCheck(). Ça fonctionne nickel, avec bien sûr une petite différence à l'affichage. Personnellement, je préfère ça.

D'ailleurs, je préférerais même que la seconde ligne fasse office de sous-titre, et donc qu'elle soit en <h3> au lieu de <h2>. Je pense savoir le faire, mais avec du code assez bourrin et à condition qu'à l'appel de strCheck() la fin de balise </h2> soit bien présente, ce dont j'ai bien du mal à m'assurer. Si quelqu'un sait le faire de manière élégante et en harmonie avec le reste du code, je prends volontiers !

Du coup, on en est où dans la hâte lente vers un pull request ? Je trouve ça quasi indispensable ! Et même, je suggérerais d'étendre les caractères de remplacement :
_ (underscore) pour l'espace insécable
-- (double tiret) pour le tiret insécable
| pour scinder en deux lignes par <br />
|| pour scinder en deux lignes de titres <h2>
||| pour scinder en deux lignes de titres <h2> puis <h3>
On peut peut-être en imaginer d'autres... ou utiliser un genre de BBcode, voire carrément interpréter du html (certaines balises seulement, bien sûr !) de la même manière...

Hors ligne

#10 22/03/2018 19:36:35

bazooka07
Membre
Lieu : Quelque part en Rhône-Alpes
Inscription : 06/02/2014
Messages : 1 005
Site Web

Re : Titre et retour à la ligne

La fonction plxUtils::strCheck() est utilisée dans pas mal d'endroits .
Ouvre le fichier core/lib/class.plx.utils.php dans ton éditeur de code préféré et recherche toutes les occurrences de strCheck.
Strcheck n'est pas forcément appelé pour le contenu d'une balise h2.
Cela peut-être l'attribut title d'une balise ou pour une adresse mail.

Pour le tiret insécable, cela se gère avec du CSS mais le rendu selon les navigateurs est variable :
https://developer.mozilla.org/fr/docs/Web/CSS/hyphens
https://www.caniuse.com/#search=hyphen

Sinon insérer un <br> dans le sous-titre me pose problème car il est affiché en haut de la page mais aussi en bas de page où je préfère le conserver sur une seule ligne.
L'astuce consiste à mettre des espaces insécables partout sauf à l'endroit où on souhaite éventuellement un saut à la ligne et à jouer sur la largeur du container en CSS pour provoquer un saut de ligne.

Pour le pull-request j'attends pour l'envoyer. J'ai déjà poussé beaucoup de pull-requests qui sont toujours en attente de validation  sad
Quand il y en a trop cela devient compliqué de faire un "git rebase" sans intervention manuelle .

Dernière modification par bazooka07 (22/03/2018 19:39:48)

Hors ligne

#11 24/03/2018 01:25:55

jibe
Membre
Inscription : 18/02/2018
Messages : 29

Re : Titre et retour à la ligne

Salut,

Je te laisse voir ce qui est le mieux : je débute à peine avec pluxml et tu es donc bien mieux à même que moi de juger ce qu'il faut et ne faut pas faire.

En attendant, je laisse l'astuce en place : je la trouve très pratique et simple. Si d'ici la prochaine version le pull request a été fait, ce sera super ! Sinon, pas grave, je remettrai l'astuce dans le nouveau code.

Hors ligne

Pied de page des forums

A propos Nous soutenir Contact Twitter Google+
Copyright © 2006-2018 PluXml.org, tous droits réservés