Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Téléchargez Pascal Discussion :

[Linux - Windows] MiniHTML : prépare une mise en forme HTML


Sujet :

Téléchargez Pascal

  1. #1
    Membre averti
    [Linux - Windows] MiniHTML : prépare une mise en forme HTML
    Beaucoup de forums (pas celui-ci, qui est évidemment génial !) ne permettent pas de formater les posts en appliquent des <i>italiques</i>, des <b>caractères gras</b>, <u>soulignés</u>, <strike>rayés</strike>, <del>supprimés</del>, <sup>exposant</sup>, <sub>indice</sub>. On rencontre aussi d'autres occasions où on s'entortille les doigts en devant taper sans aide des balises HTML…

    Les touches < > sont mal placées sur les claviers français, où des caractères récurrents en programmation sont reléguées dans des emplacements peu accessibles (la palme revient aux signes {}, indispensables en Pascal, en CSS etc., accessibles par ALT-gr, sans parler de @, qui sert pourtant à tout le monde, de ^ pour les pointeurs… Il faudrait un clavier avec une ligne de plus pour que les signes de programmation soient accessibles directement.

    Ce bloc-notes, fondé sur un autre que j'avais écrit en 2007 pour un autre usage, permet de marquer les italiques, gras, soulignés, barrés, exposant, indice avec des balises HTML, d'insérer de liens et des images Internet. Il y a une possibilité d'ouverture de fichier (encodage UTF-8 : je n'ai pas prévu l'import ANSI) ou de sauvegarde, éventuellement en HTML avec un minimum de balises de fichier, en cas de besoin. Un bouton marqué & permet de préparer la zone sélectionnée à être citée comme du code HTML dans une page en HTML. Le bouton avec un bloc-notes permet de copier le contenu de l'éditeur dans le presse-papier.

    La mise en œuvre de ces quelques fonctions demandait fort peu de peine. Mais la fiche supporte aussi le drag & drop : (on glisse l'icône du fichier à ouvrir sur la fenêtre du logiciel) et également l'envoi du nom de fichier en ligne de commande : MiniHTML nomdufichier.txt.

    Il y a aussi un menu déroulant proposant de couper / copier / coller / supprimer / tout sélectionner dans la zone d'édition (toutes choses qui ne se font pas automatiquement dans un Edit Lazarus : ce ne sont pas des propriétés héritées de Windows, mais des composants et un peu de code).

    <i>J'ai même laissé la possibilité de rechercher une chaîne dans le texte. Du fait de l'adaptation d'un (en fait plusieurs) projet(s) précédents, il peut rester des choses bizarres.</i>
    Il reste même aussi l'option d'imprimer le document (texte simple), qui n'est vraiment pas utile ; elle reste de l'ancien projet et m'avait quand même donné de la peine

    J'ai également inclus un embellissement de la typographie qui sort un peu du sujet : j'ai utilisé ce petit outil pour arranger plus facilement les commentaires des métadonnées des fichiers epub (dans Calibre) ou de leurs sources ODT : les apostrophes droites seront remplacées par des apostrophes courbes, les trois points par des points de suspension typographiques, des espaces insécables sont insérées conformément à la typographie française avant les signes de ponctuation doubles.

    Il ne faut pas appliquer cet embellissement si l'on a utilisé le bouton marqué & : il faudra l'utiliser seulement après.

    La justification des paragraphes m'est également utile pour mettre en forme le texte des commentaires de Calibre. Je l'ai donc ajoutée aussi.

    On pourrait aussi prévoir une prévisualisation avec LazRichView, mais le code pour convertir des textes à balises en RichView est en partie à écrire. Et en plus je me méfie du WYSIWYG.

    PS : Quelqu'un peut-il m'expliquer pourquoi quand j'écris (je reconnais que ce n'est pas joli-joli, mais enfin…) :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    procedure TForm1.html(Sender: Tobject);
    begin
       if Sender = ita then Memo1.SelText:='<i>' + Memo1.SelText + '</i>' else
       if Sender = gras then Memo1.SelText:='<b>' + Memo1.SelText + '</b>' else
       if Sender = souli then Memo1.SelText:='<u>' + Memo1.SelText + '</u>' else
       if Sender =raye then Memo1.SelText:='<strike>' + Memo1.SelText + '</strike>' else
       if Sender =raye1 then Memo1.SelText:='<del>' + Memo1.SelText + '</del>' else
       if Sender =exp then Memo1.SelText:='<sup>' + Memo1.SelText + '</sup>'else
       if Sender = ind then Memo1.SelText:='<sub>' + Memo1.SelText + '</sub>';
       if Sender = gauche then Memo1.SelText:='<p align="left">' + Memo1.SelText + '</p>';
       if Sender = just then Memo1.SelText:='<p align="justify">' + Memo1.SelText + '</p>';
       if Sender = droit then Memo1.SelText:='<p align="right">' + Memo1.SelText + '</p>';
       if Sender = centre then Memo1.SelText:='<p align="center">' + Memo1.SelText + '</p>';
       Modified := true;
       //Place le curseur à la fin du texte
       Memo1.SelLength := 0;
       Memo1.SelStart:= Length(Memo1.TExt);
       if Sender = tout then Memo1.SelectAll
    end;


    Le bouton "Tout sélectionner" ne fonctionne pas sous Linux ? J'ai dû écrire :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    procedure TForm1.html(Sender: Tobject);
    begin
       if Sender = ita then Memo1.SelText:='<i>' + Memo1.SelText + '</i>' else
       if Sender = gras then Memo1.SelText:='<b>' + Memo1.SelText + '</b>' else
       if Sender = souli then Memo1.SelText:='<u>' + Memo1.SelText + '</u>' else
       if Sender =raye then Memo1.SelText:='<strike>' + Memo1.SelText + '</strike>' else
       if Sender =raye1 then Memo1.SelText:='<del>' + Memo1.SelText + '</del>' else
       if Sender =exp then Memo1.SelText:='<sup>' + Memo1.SelText + '</sup>'else
       if Sender = ind then Memo1.SelText:='<sub>' + Memo1.SelText + '</sub>';
       if Sender = gauche then Memo1.SelText:='<p align="left">' + Memo1.SelText + '</p>';
       if Sender = just then Memo1.SelText:='<p align="justify">' + Memo1.SelText + '</p>';
       if Sender = droit then Memo1.SelText:='<p align="right">' + Memo1.SelText + '</p>';
       if Sender = centre then Memo1.SelText:='<p align="center">' + Memo1.SelText + '</p>';
       Modified := true;
       if Sender = tout then Memo1.SelectAll else
       begin
         //Place le curseur à la fin du texte
         Memo1.SelLength := 0;
         Memo1.SelStart:= Length(Memo1.TExt)
       end
    end;


    Qui est sans doute plus rigoureux, mais pourquoi la sélection ne s'effectue-t-elle pas après la désélection sous Linux ?

  2. #2
    Responsable Lazarus & Pascal

    Citation Envoyé par Francois_C Voir le message

    PS : Quelqu'un peut-il m'expliquer pourquoi quand j'écris (je reconnais que ce n'est pas joli-joli, mais enfin…)
    Bonjour,

    Je vois une piste possible (faute d'avoir le code source) :
    Le TMemo n'ayant pas le focus, la sélection ne s'affiche pas avec HideSelection par défaut à True...
    On peut donner le focus à Memo1 avec Memo1.SetFocus et/ou utiliser Memo1.HideSelection := False.

    NB : ceci est aussi vrai avec Windows.
    NB2 : cette suite de Sender = kelkechose me paraît surprenante...
    Accès à mon site et à mon blog. Actualités, cours et ressources Delphi, Lazarus et Pascal.
    Pensez à la balise - Quelqu'un vous a aidé ou vous appréciez une intervention ? Pensez au

  3. #3
    Membre averti
    Citation Envoyé par gvasseur58 Voir le message
    Bonjour,

    Je vois une piste possible (faute d'avoir le code source) :
    Le TMemo n'ayant pas le focus, la sélection ne s'affiche pas avec HideSelection par défaut à True...
    On peut donner le focus à Memo1 avec Memo1.SetFocus et/ou utiliser Memo1.HideSelection := False.

    NB : ceci est aussi vrai avec Windows.
    NB2 : cette suite de Sender = kelkechose me paraît surprenante...
    Hypothèse vraisemblable en effet.

    Cette suite de Sender est surprenante, certes, mais quand j'ai constaté que ça marchait, je me suis dit que ça m'évitait d'écrire plusieurs petites procédures. Est-ce que ça présente des risques (sauf évidemment le problème facilement réglé de la version Linux) ? Est-ce que j'avais une façon plus économique de détecter le bouton ?

    Je reste en quelque sorte plutôt novice en Pascal objet. J'ai fait pas mal de Turbo Pascal jadis, mais le prix de Delphi mis en rapport avec le besoin que j'en avais (écrire ces petits outils à usage perso) m'en a éloigné, de sorte que je ne reviens au Pascal objet que grâce à Lazarus.

    J'ai un autre problème sous Linux :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    Clipboard.AsText := (Memo1.Text);

    me donne un encodage incorrect quand je colle le texte, alors qu'un copier-coller donne le bon encodage.

    Merci.

    F.C.

    PS : Oups. En relisant mon code, je m'aperçois qu'effectivement ma suite de Sender est pourrie : Mon idée première était d'essayer Case Sender of, mais ça ne marchait pas, donc j'ai fait des IF...ELSE. Sauf que quand j'ai rajouté des boutons je n'ai plus fait de else…

    Et, question subsidiaire : si je veux avoir un niveau d'annulation avec des boutons ou Ctrl-Z/Ctrl-Y, il faut que je copie le contenu du Memo dans un tableau ?

  4. #4
    Responsable Lazarus & Pascal

    Bonjour,

    Citation Envoyé par Francois_C Voir le message

    Cette suite de Sender est surprenante, certes, mais quand j'ai constaté que ça marchait, je me suis dit que ça m'évitait d'écrire plusieurs petites procédures. Est-ce que ça présente des risques (sauf évidemment le problème facilement réglé de la version Linux) ? Est-ce que j'avais une façon plus économique de détecter le bouton ?
    Je pense que le plus simple aurait été de se servir de la propriété Tag de chaque bouton. On lui affecte une valeur (un entier) qui peut alors être traitée dans un case (Sender as TButton).Tag of...
    Sender renvoyant à l'appelant, on lui fait prendre la forme d'un bouton (ce qu'il devrait être !) avec as avant d'accéder à la propriété Tag préalablement renseignée.

    Citation Envoyé par Francois_C Voir le message

    J'ai fait pas mal de Turbo Pascal jadis, mais le prix de Delphi mis en rapport avec le besoin que j'en avais (écrire ces petits outils à usage perso) m'en a éloigné, de sorte que je ne reviens au Pascal objet que grâce à Lazarus.
    Bienvenue au club

    Pour le reste, je n'ai pas testé, ma machine Linux étant momentanément inaccessible
    Accès à mon site et à mon blog. Actualités, cours et ressources Delphi, Lazarus et Pascal.
    Pensez à la balise - Quelqu'un vous a aidé ou vous appréciez une intervention ? Pensez au

  5. #5
    Expert confirmé
    salut ,

    j'aurais déjà créé une fonction de mises en forme de balise étant presque toutes basée sur le même modèle

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Function ModifieToBaliseHtml(balise,params,text : String) : string;
    begin
      Result := Format('<%0:s %1:s >%2:s</%0:s>',[balise,params,text]);
    end;


    l'utilisation en est simple
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
         Memo1.SelText:= ModifieToBaliseHtml('i','',Memo1.SelText)

    ou
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
         Memo1.SelText:= ModifieToBaliseHtml('P','align="center"',Memo1.SelText)

    ou encore
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
         Memo1.SelText:= ModifieToBaliseHtml('a','href="' + adr + '"',ln)

    la deuxieme comme le dis graveur la succession de if n'est pas des plus efficace
    moi a l'inverse de lui je me sert du nom que j'ai defini a l'avance avec toutes la meme structure
    SB pour speed buton
    N un chiffre permettant de l'identifier
    et le nom de sa fonction
    dans ton cas mon bouton ita se serait appelé SB01Ita ce n'est qu'un exemple
    j'aurais tres bien pu ecrire _0001SbIta.
    il faut juste trouver une convention dans tes nom de composant et t'y tenir
    il est très facile comme cela d'extraire le chiffre du nom et donc de connaitre son indice

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
       st := copy(TObject(Sender).Name,2,2);
       Case StrtoInt(st) of 
         1 : Begin  balise := 'i';Paramstr =''; end;
         ...
      End;
      Memo1.SelText:= ModifieToBaliseHtml(balise,Paramstr,Memo1.SelText)
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  6. #6
    Membre averti
    Grand merci à tous les deux. Je vais essayer de mettre cela en pratique. Ça ne me paraît pas trop compliqué, mais je ne connaissais même pas la propriété Tag des boutons
    Le désordre vient de ce que je suis parti avec un edit et trois boutons – le tout alourdi dès le départ de code écrit pour autre chose et que je ne voulais plus trop remettre en cause – et qu'à mesure des besoins ça se développe de manière en quelque sorte fractale et assez mal contrôlée dans une structure qui n'a pas été prévue pour ça ; le plus étonnant est que ça marche encore après toutes ces greffes de bouts de code…

  7. #7
    Membre averti
    C'est fait : j'ai utilisé les tags proposées par gvasseur58 parce que ça allait un peu plus vite que de changer le nom des boutons (mais l'idée me plaît bien aussi). J'ai recopié la fonction de conversion des tags html proposée par anapurna et je l'ai même imitée avec un paramètre de moins pour la mise en forme Google Plus (j'aurais peut-être mieux fait de la modifier pour qu'elle admette les deux sortes de paramètres). Ce n'est pas que ça raccourcisse sensiblement le code, mais c'est instructif.
    Merci encore !
    F.C.
    PS : en relisant, je m'aperçois que pour économiser du texte (comme au temps où on économisait les quelques Ko disponibles pour la compilation en Turbo Pascal) j'ai renommé la fonction ModifieToBaliseHtml en html, alors que la procédure porte déjà ce nom. Ça a l'air de passer, mais il ne faut pas garder ça…
    Et je n'ai fait qu'une partie du travail suggéré par anapurna, qui me conseillait de définir balise, param et texte puis d'appliquer la fonction une seule fois au texte sélectionné…

  8. #8
    Membre averti
    Finalement j'ai – ce me semble – mis en application tous les conseils reçus ici. Ce n'était pas très difficile, mais comme il y a deux sortes de traitement (mise en forme pour Google + et HTML), j'ai dû séparer if Google/else. Le bouton pour sélectionner tout a sa procédure distincte, ce qui permet de le faire fonctionner comme une bascule sélectionner/désélectionner dont j'avais ressenti le besoin. J'ai encore des petits problèmes quand on a cliqué sur une des checkboxes : je ne sais pas rendre le focus à l'edit sans qu'on doive re-cliquer dessus, alors que les speedbuttons lui laissent le focus – raison pour laquelle je les avais choisis.

  9. #9
    Membre averti
    Voici l'état actuel de cet outil qui décidément doit ne pouvoir servir qu'à moi.
    J'ai ajouté des fonctions, mal renseignées (uniquement par "hints") à mesure de mes besoins, qui s'avèrent plutôt le travail de bouts de HTML pendant la fabrication des ebooks.

    Le dispositif de recherche, à l'origine survivance peu utile, est désormais efficace et peut effectuer des remplacements globalement ou occurrence par occurrence, avec ou sans prise en compte de la casse. Les recherches se font avec le bouton portant une loupe (ou <Enter>) les remplacements avec celui qui a deux flèches simulant une rotation.

    J'ai aussi fini par ajouter un niveau d'annulation, qui devenait indispensable, mais j'aurais besoin de conseils sur ce point : en effet, si l'annulation existe à l'état natif dans les TMemo et les TEdit de Lazarus, elle ne conserve que le texte tapé ou collé. Il faut donc mémoriser l'état antérieur du mémo avant de le modifier avec une procédure. Fonctionne aussi avec ctrl-z.

    Un autre problème est le comportement du presse-papiers sous Linux. Clipboard.AsText := (Memo1.Text) fonctionne avec Windows, mais avec Linux il donne du texte UTF8 mal transcodé avec des petits dessins si on colle dans l'éditeur de Calibre.
    J'ai essayé de contourner la difficulté en faisant ça :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TForm1.pressepapClick;
    begin
    {$ifdef linux}
    Memo1.SelectAll;
    Memo1.CopyToClipboard
    {$else}
      Clipboard.AsText := (Memo1.Text)
    {$endif}
    end;


    L'idée de départ était bonne, le texte collé est cette fois bien encodé dans Calibre, mais il faut cliquer deux fois, et il ne faut pas désélectionner après avoir copié avec Memo1.SelLength := 0. C'est tout à fait illogique à première vue.
    C'est peut-être lié avec ce fichu presse-papiers de Linux qui ne conserve que du texte encore affiché…

###raw>template_hook.ano_emploi###