RE: [spip-dev] SPIP & PostgreSQL

> Bug entraînant le non fonctionnement de l'indexation ...

A mon sens l'indexation est à refaire complètement, avec un champ
supplémentaire (idx) dans toutes les tables d'objets à indexer, champ qui
peut prendre la valeur :

    '' = ne sait pas
    '0' = à indexer
    'non' = à ne jamais indexer
    'oui' = indexé
    ('idx' = en cours d'indexation ?)

Ne pas oublier les tables spip_signatures et spip_forums...

Ensuite on se débarrasse du fichier .index qui met la zone, et on peut
facilement imaginer une procdéure d'indexation rapide, afficher le %age
d'articles indexés, etc. Toutes choses assez improbables avc le système
actuel.

-- Fil

Bonsoir,

J'ai donc modifié inc_cron.php3 et inc_index.php3 et ajouté un champ
indx aux tables idoines.

2 remarques:

- Je n'ai pas nommé le champ ajouté 'idx' comme suggéré car je craignais
un conflit possible avec la sortie de la fonction requete_txt_integral

- Je n'ai pas compris pourquoi les tables spip_signatures et spip_forum
devaient y aller aussi car elles n'étaient pas appelées dans les
fonctions existantes que j'ai été amené à modifier. Et comme je
n'utilise pas (encore) les fora...

Enfin j'ai fait un petit script de modif de la base (qui doit être lancé
depuis le répertoire 'ecrire') plutôt qu'oser tripoter inc_base.php3.

Les fichiers joints:
* inc_cron_index.diff: le patch pour inc_cron.php3 et inc_index.php3
ATTENTION je pense que le CVS a été modifié entre le moment où j'ai
commencé et celui où j'ai fini, regardez à deux fois...(ligne 170 de
inc_index.php3)

* modif_tables_index.php: comme son nom l'indique, qui modifie les
tables. À lancer depuis ecrire/

Wouala, chez moi ça marche apparemment bien depuis cet après-midi. Un
dernier avertissement, ces modifs ne fonctionnent pas sur SPIP-1.7
stable, il y a eu trop de changement depuis (apparition de inc_cron.php3
notamment), à utiliser avec les précautions d'usage. En tout cas, on est
débarassé du fichier .index ;-))

Dans l'attente des remarques éventuelles, bonne nuit !

Patrice

inc_cron_index.diff (5.04 KB)

modif_tables_index.php (1.27 KB)

J'ai donc modifié inc_cron.php3 et inc_index.php3 et ajouté un champ
indx aux tables idoines.

Merci Patrice, j'ai intégré tes modifications (sans respecter le nom de tes
champs, ce qui t'évitera d'avoir des soucis de mise à jour : il te suffira
d'effacer les champs que tu avais ajoutés).

Je modifie un peu la nomenclature :

> '' = ne sait pas
> '1' = à indexer **
> 'non' = à ne jamais indexer
> 'oui' = indexé
> 'idx' = en cours d'indexation

Pour l'instant si une indexation meure au milieu, l'article reste en 'idx' :
voir ce qu'on en fait... peut-être avec 'ORDER BY' le reléguer à la fin,
histoire de ne pas tourner sur un objet difficile à indexer (très long...)

> Ne pas oublier les tables spip_signatures et spip_forums...

forums et signatures devraient s'indexer ; faut-il les mettre en option ?

Par ailleurs un fichier ecrire/admin_index.php3 est présent et indexe
"rapidement" le site, 50 objets à la fois dans chaque catégorie... à terme
ce fichier contiendra les graphes etc. donnant un état des lieux de
l'indexation + les boutons "purger les données d'indexation", "forcer la
réindexation" (ce qui n'est pas pareil !), etc.

J'arrête là pour le moment, n'hésitez pas à commencer à propgrammer cette
page admin_index !

-- Fil

J'y ai repensé la nuit (crêpe, crêpe in the bed) et je n'aime pas
l'idéee qu'il y ait 10 appels à MySQL dans effectuer_une_indexation.

Ma première idée du (petit) matin a donc été de générer aléatoirement
l'ordre des éléments du tableau $elements avec l'espoir (fou?) de ne
faire qu'une seule requête SQL du genre:

select * from [toutes les tables avec idx] where idx=1

Mais chuis pas assez fort en SQL pour faire une requête qui marche comme
ça sans être 'ambiguous' pour reprendre la fine terminologie du serveur
MySQL...

Donc, j'ai tout de même refait la fonction qui, dans le pire des cas (à
savoir un site totalement indexé) ne fait pas plus d'appels à MySQL
qu'il n'y a d'éléments dans le tableau $elements.

Je persiste à penser qu'il faut trouver une solution élégante pour
éviter 6 appels à MySQL toutes les 30 secondes dans un site indexé à
100%. D'accord, si c'est toutes les 30 secondes, cela signifie sans
doute que le site en question est suffisamment actif pour n'être jamais
à jour du pt de vue de l'index, mais bon... le retour de .index créé par
marquer_indexer et effacé par effectuer_une_indexation ???

Patrice

function effectuer_une_indexation() {
  $elements = array('article', 'breve', 'mot', 'auteur', 'rubrique',
'syndic');
  $count = count($elements);
  /* on met ces éléments dans un ordre aléatoire
  pour que l'indexation ne se fasse pas toujours
  de la même manière */
  while($count > 0){
    $rand = rand(0,$count-1);
    $ordre[] = $elements[$rand];
    unset($elements[$rand]);
    $elements = array_values($elements);
    $count--;
  }
  print_r($ordre);
  while(list(,$choix) = each($ordre)) {
    $table = ($choix == 'syndic') ? "spip_".$choix:"spip_".$choix."s";
    $query = "select id_".$choix." from ".$table." where indx = '0' limit
0,1";
    $result = spip_query($query);
    if (spip_num_rows($result) > 0){
      $row = spip_fetch_array($result);
      indexer_objet($choix, $row["id_".$choix]);
      break;
    }
  }
}

faire qu'une seule requête SQL du genre:
select * from [toutes les tables avec idx] where idx=1

??? je ne crois pas que ça puisse marcher

Je persiste à penser qu'il faut trouver une solution élégante pour
éviter 6 appels à MySQL toutes les 30 secondes dans un site indexé à
100%.

Ce sont des appels sur des index, c'est vraiment très peu coûteux.

-- Fil

Un début en fichier joint... est-une direction à suivre. C'est la
première fois que je mets le nez dans l'admin et je n'ai pas cru
remarquer de règle particulièrement commune aux quelques fichiers - pas
tous, que j'ai regardés.

Question subsidiaire: comment doit on apporter les modifs sur
lang/spip_fr.php3 ? Un diff ?

Bonnne soirée à tous,

admin_pat.php3 (2.38 KB)

> page admin_index !

Un début en fichier joint... est-une direction à suivre. C'est la

Hier dans le trian j'ai fait un autre truc, pas très différent du tien (cf.
ecrire/admin_index.php3)

Question subsidiaire: comment doit on apporter les modifs sur
lang/spip_fr.php3 ? Un diff ?

Non : quand tu veux créer une chaîne à traduire, il faut la marquer sous la
forme
    echo _L('Mon texte à traduire');

et quand le code/texte sera stabilisé, on pourra la passer sous la forme
finale _T('code_trazduction'), avec l'ajout d'une équivalence code => chaîne
dans spip_fr.php3 et autress langues.

-- Fil

Salut,

La fonction "Prendre en ligne les sauts de ligne simples" est très astucieuse, mais elle m'enquiquine beaucoup.

- Elle met en avant la possibilité de faire des retours-chariot dans le texte. Pour le coup, elle la met énormément en avant, avec sa présentation très spécifique (c'est le seul bouton ayant ce comportement). Or, mettre des retours à la ligne dans un texte, c'est carrément une rareté typographique:
      -> Usage connu: la poésie (poèmes, chansons, etc.). Pour cela, <poesie></poesie>.
      -> Second usage: le code informatique. Pour cela, <cadre></cadre>;
      -> En dehors de cela, ça n'existe quasiment pas en typographie. On fait des changements de paragraphe. Ensuite, si l'on veut faire des changements de paragraphe "discrets" (sans espace vertical entre les paragraphes), il suffit de modifier le style de <p class=spip>, avec éventuellement une indentation de la première ligne (pour faire une présentation "à la française").
      -> Sur le Web, dans 99,9% des cas où je vois passer des <br> dans un texte, c'est une erreur typographique.
      => Donc cette fonctionnalité met en avant une possibilité qui est, presque toujours, une erreur de typo; ou bien une erreur de codage "sémantique" dans SPIP (utiliser des <br> plutôt qu'un raccourci qui fait le boulot proprement).

- Elle attaque directement le code source, et elle n'est pas réversible. Le code tapé dans le pavé est lui-même modifié. Si j'applique la fonction sur un texte existant (genre "pour voir ce que ça fait"), j'ai de gros risques de détruire carrément la mise en forme de mon texte, et pour annuler, je vais devoir supprimer les "_" à la main. C'est un très mauvais comportement.

- Pour les admins, ça ajoute encore une vérification/correction à faire: il va falloir repasser derrière tous les documents pour vérifier la présence de ces retours à la ligne, et les supprimer à la main.

- L'intitulé est incompréhensible.

D'où mes demandes:
=> Quel est l'usage "sain" pour lequel cette fonction est conçue?
=> Si cet usage est ultra-spécifique, ne pourrait-on activer cette fonction uniquement par une variable quelquepart? (genre mes_fonctions)

ARNO*

Salut,

La fonction "Prendre en ligne les sauts de ligne simples" est très
astucieuse, mais elle m'enquiquine beaucoup.

[...]

=> Quel est l'usage "sain" pour lequel cette fonction est conçue?

  Pour moi, effectivement, le tag <poesie> résoud 99,9% des cas.
  Mettre la zone partout pour le 0,1% des cas, juste pour lui éviter de
mettre des "_ ", c'est effectivement moche.
  Enfin, dans la discussion quelqu'un avait parlé du cas où on veut
mettre une adresse. Dans ce cas, le tag <poesie> colle, sauf que son
intitulé est complètement à coté de la plaque.
  Sauf que je vois pas trop comment mettre <RetourALaLigneSignifiants>
en moins de lettres :expressionless:

À+, Pif.

Un certain nombre d'effets peut être obtenu directement avec un style spécifique. Par exemple, on peut créer un raccourci pour mettre en petites caps ainsi:

pc {
  font-variant: small-caps;
}

qui s'utilise directement dans un texte ainsi:
      ...au milieu du <pc>xx</px>e siècle, Philippe <pc>Bidule</pc> a écrit...

ou, il me semble une mise en forme d'adresse avec:

adresse {
  white-space: pre;
  padding-left: 20px;
}

qui s'utiliserait directement ainsi:
      <adresse>
      Philippe <pc>Bidule</pc>
      11, rue des Alouettes
      75003 Paris
      </adresse>

Dans les squelettes, c'est très facile. Le problème, c'est que de tels styles "supplémentaires" ne sont pas actuellement pris en compte dans l'espace privé.

Une solution consisterait à créer un point d'entrée dans les feuilles de style:
      => si le webmestre créé un fichier "mes_styles.css" à la racine du site, alors cette feuille est incluse dans l'espace privé.

Inconvénient: cela signifie appeler ce fichier "mes_styles.css" depuis les squelettes par défaut, même si il n'existe pas. Est-ce que ça peut poser problème? (multiplication des erreurs 404 sur le serveur) Une solution consisterait à remplacer le "spip_style.css" de la racine par un "spip_style.php3" qui, lui, pourrait tester la présence de ce fichier. Ainsi on n'aurait plus de difficulté de ce côté.
Dans cette logique, on préférerait "mes_styles.php3" à "mes_styles.css"...

A*

adresse {
  white-space: pre;
  padding-left: 20px;
}

Ben ... j'suis largué là .. à quoi ça sert le <poesie> alors ???

Dans les squelettes, c'est très facile. Le problème, c'est que de tels
styles "supplémentaires" ne sont pas actuellement pris en compte dans
l'espace privé.

  ça veut quand même dire de remplacer tous les <XYZ> par des
<div class="XYZ"> c'est ça ?

À+, Pif.

adresse {
  white-space: pre;
  padding-left: 20px;
}

Ben ... j'suis largué là .. à quoi ça sert le <poesie> alors ???

C'est juste un exemple... Le <poesie> est beaucoup plus chiadé, puisqu'il gère chaque ligne comme un élément distinct (pour pouvoir faire des text-indent par exemple, ou des first-letter, ou ce qu'on veut pour présenter de la poésie ou des chansons).

Du coup, évidemmment, un <adresse> n'est plus vraiment nécessaire. Mais à chacun d'imaginer ses tags lui-même. Cela dit, le <adresse> t'autoriserais une nouvelle définition sémantique pour ton site, et une présentation graphique différente. (Au fait, il existe déjà un <address></address> en vieux HTML, mais sans aucun intérêt.)

Dans les squelettes, c'est très facile. Le problème, c'est que de tels
styles "supplémentaires" ne sont pas actuellement pris en compte dans
l'espace privé.

  ça veut quand même dire de remplacer tous les <XYZ> par des
<div class="XYZ"> c'est ça ?

Pourquoi faire?
- les css autorisent à fabriquer ses tags persos, non?
- cette transformation introduirait de gros risques d'erreur au niveau de la transformation des tags; à moins de déclarer (en plus de mes_styles.css) une liste des classes à prendre en compte;
- cela compliquerait la définition des feuilles, avec indication systématique d'un "display:inline;" ou "display:block;" pas génial (dans les exemples donnés, <pc></pc> serait inline, <adresse></adresse> serait block).

A*

> ça veut quand même dire de remplacer tous les <XYZ> par des
> <div class="XYZ"> c'est ça ?

Pourquoi faire?
- les css autorisent à fabriquer ses tags persos, non?

  je viens d'essayer : apparemment, mozilla comprend, IE non.
  t'façons, il faudrait quand même bricoler le flux, sinon, ça
deviendra &lt;XYZ&gt;

- cela compliquerait la définition des feuilles, avec indication
systématique d'un "display:inline;" ou "display:block;" pas génial (dans
les exemples donnés, <pc></pc> serait inline, <adresse></adresse> serait
block).

  Ça, faudrait bien y passer de toutes façons.

À+, Pif.

Arg, saloperie de saloperie. A force de répéter que, grâce aux CSS, on ne se fait plus chier avec les problèmes de compatibilité... :-))

Par contre, non, SPIP ne remplace pas les <> par des &lt;&gt;.

A*

ARNO* écrivait:

Une solution consisterait à créer un point d'entrée dans les feuilles de style:
     => si le webmestre créé un fichier "mes_styles.css" à la racine du site, alors cette feuille est incluse dans l'espace privé.

Inconvénient: cela signifie appeler ce fichier "mes_styles.css" depuis les squelettes par défaut, même si il n'existe pas. Est-ce que ça peut poser problème? (multiplication des erreurs 404 sur le serveur) Une solution consisterait à remplacer le "spip_style.css" de la racine par un "spip_style.php3" qui, lui, pourrait tester la présence de ce fichier. Ainsi on n'aurait plus de difficulté de ce côté.
Dans cette logique, on préférerait "mes_styles.php3" à "mes_styles.css"...

A*

Une autre solution : une balise #SPIP_STYLE

ça renvoie le <link ... /> qui va bien. Si mes_styles.css existe je le prend, sinon, c'est spip_style.css (ou bien spip_style-dist.css et spip_style.css ...)

ou alors, une bête fonction dans mes_fonctions.php3 ?

Une autre solution : une balise #SPIP_STYLE

ça renvoie le <link ... /> qui va bien. Si mes_styles.css existe je le
prend, sinon, c'est spip_style.css (ou bien spip_style-dist.css et
spip_style.css ...)

Tout cela n'est pas nécessaire, vu qu'on peut très bien inclure
plusieurs feuilles de style dans une même page.

Dans cette optique :
- j'inclus d'abord spip_style.css, qui contient les styles par défaut
- j'inclus ensuite mes_styles.css (par exemple), qui peut contenir des
redéfinitions de styles pour les styles définis par spip_style.css

Ca doit pouvoir suffire.

a+

Antoine.

>> Pourquoi faire?
>> - les css autorisent à fabriquer ses tags persos, non?
> je viens d'essayer : apparemment, mozilla comprend, IE non.

Arg, saloperie de saloperie. A force de répéter que, grâce aux CSS, on ne
se fait plus chier avec les problèmes de compatibilité... :-))

  Je décode pour les non initiés: à proprement parler ce ne sont pas les CSS qui autorisent les tags persos mais XML.

Minh.

Bonjour,

J'ai un cas fréquent d'utilisation d'un retour à la ligne nécessité par
l'aspect du texte.

À la fin d'un paragraphe, j'ai le texte suivant :
Pour en savoir plus aller à l'adresse
http://www.autresite.org//repertoire/article.php3?id_article=xxx
Si la fenêtre n'est pas assez large pour contenir le tout, avec la
justification, on se retrouve avec l'adresse Internet sur la ligne suivante
et la première partie justifiée avec des espaces énormes entre chaque mot.

Dans ce cas je préfère écrire :
Pour en savoir plus aller à l'adresse :
_ http://www.autresite.org//repertoire/article.php3?id_article=xxx
qui donne un résultat propre.

Maurice

La fonction "Prendre en ligne les sauts de ligne simples" est très
astucieuse, mais elle m'enquiquine beaucoup.

- Elle met en avant la possibilité de faire des retours-chariot dans le
texte. Pour le coup, elle la met énormément en avant, avec sa présentation
très spécifique (c'est le seul bouton ayant ce comportement). Or, mettre
des retours à la ligne dans un texte, c'est carrément une rareté
typographique:

Oui, c'est surtout utile dans des contextes non "textuels", comme par
exemple le jeté de notes sur un spikini :slight_smile:

=> Si cet usage est ultra-spécifique, ne pourrait-on activer cette
fonction uniquement par une variable quelquepart? (genre mes_fonctions)

J'y réfléchis et on en reparle... la fonction est sympa et permettra de
faire évoluer des interfaces correctes, je pense. L'usage sur wiki et
avec des enfants est assez parlant ;

-- Fil

Bonjour j'ai trouvé qqchose dans agora qui ne coute rien de rajouter et qui
me semble trait important :
la support des balises d'accessibilité sur les tableau de donnée généré par
spip(th, caption, summary, id, headers)
voilà le code trouvé dans inc_texte

   //
    // Tableaux
    //

    $letexte = ereg_replace("^\n?\|", "\n\n|", $letexte);
    $letexte = ereg_replace("\|\n?$", "|\n\n", $letexte);

    $tableBeginPos = strpos($letexte, "\n\n|");
    $tableEndPos = strpos($letexte, "|\n\n");

    while (is_integer($tableBeginPos) && is_integer($tableEndPos) &&
$tableBeginPos < $tableEndPos + 3) {

        $textBegin = substr($letexte, 0, $tableBeginPos);
        $textTable = substr($letexte, $tableBeginPos + 2, $tableEndPos -
$tableBeginPos);
        $textEnd = substr($letexte, $tableEndPos + 3);

        $newTextTable = "</p><table class=\"spip\"
summary=\""._T('info_summary_tab')."\">\n<caption>__lecaption__</caption>";
        $rowId = 0;
        $lineEnd = strpos($textTable, "|\n");
        while (is_integer($lineEnd)) {

            $rowId++;
            $row = substr($textTable, 0, $lineEnd);
            $textTable = substr($textTable, $lineEnd + 2);
            if ($rowId == 1 &&
ereg("^(\\|[[:space:]]*\\{\\{([^}]+)\\}\\}[[:space:]]*)+$", $row,
$tableHeaders)) {

                $tableHeaders = array_slice($tableHeaders, 2);
                $newTextTable .= '<tr class="row_first">';
                $rowTab = explode('|', substr($row, 1));
                while (list(, $cell) = each($rowTab)) {
                    $cell = substr($cell, 2, -2);
                    $newTextTable .= '<th
id="'.textToId($cell).'">'.$cell.'</th>';
                }

                $newTextTable = str_replace("__lecaption__",
$tableHeaders[0], $newTextTable);

            } else {

                $newTextTable .= '<tr class="row_'.($rowId % 2 ? 'odd' :
'even').'">';
                $newTextTable .= ereg_replace("\|([^\|]+)", "<td
headers=\"__tempheader__\">\\1</td>", $row);

                if (count($tableHeaders)) {
                  for ($i = 0; $i < count($tableHeaders); $i++) {

                    $newTextTable = substr_replace($newTextTable,
textToId($tableHeaders[$i]), strpos($newTextTable, '__tempheader__'), 14);

                  }

                }

            }

            $newTextTable .= '</tr>';
            $lineEnd = strpos($textTable, "|\n");

        }

        $newTextTable .= "</table>";

        $letexte = $textBegin . $newTextTable . $textEnd;

        $tableBeginPos = strpos($letexte, "\n\n|");
        $tableEndPos = strpos($letexte, "|\n\n");
    }