Extension du mode organisationnel avec plus de balises


26

Je veux ajouter un balisage et une mise en forme pour un tel balisage, c'est- <kbd>...</kbd>à- dire qu'une boîte entoure un tel balisage. Je veux également que le balisage soit compatible avec (setq org-hide-emphasis-markers t). Autrement dit, lorsque la variable est définie sur t, les balises <kbd>et </kbd>doivent disparaître, laissant le texte entre elles avec la mise en forme spécifiée ci-dessus.

La réponse publiée dans cette question: comment mettre en évidence le texte en permanence en mode org ne résout pas ce problème, car il ne s'applique qu'aux annotations existantes, sans étendre Org avec de nouvelles annotations.



1
@kaushalmodi J'ai demandé comment ajouter un balisage qui, lorsque Org le voit, ajoute des propriétés de texte en conséquence et de manière à ce que le balisage puisse être masqué org-hide-emphasis-markers, pas comment insérer rapidement une kbdbalise.
Tu Do

1
Je suis d'accord. Je mets cela en commentaire car il était lié aux balises kbd.
Kaushal Modi


1
@erikstokes, cette solution ne s'applique qu'aux annotations existantes, pas aux nouvelles.
Tu Do

Réponses:


25

J'ai fait quelque chose de similaire . C'est en français, mais le code devrait parler de lui-même. J'utilise pour le marqueur (j'utilise une mise en page bepo ), et quand je le fais, le texte marqué comme un style de bouton pressé.

Je ne parle pas couramment le lisp, il peut donc y avoir place à amélioration.

Ce que j'ai fait, c'est que, lors de l'utilisation pour le marqueur, le texte marqué a un style de bouton pressé, et lorsqu'il est exporté, il est traduit en<kbd>

J'ai d'abord dû définir un nouveau visage:

(defface my-face-org-keystroke
  '((t (:inherit shadow 
        :box (:line-width -2 ;neg. in order to keep the same size of lines
              :color "grey75"
              :style pressed-button)))) "Face for keystrokes"
        :group 'org-faces)

Personnalisez ensuite org-emphasis-alist:

(("*" bold)
 ("/" italic)
 ("_" underline)
 ("=" org-code verbatim)
 ("~" org-verbatim verbatim)
 ("+"
  (:strike-through t))
 ("‰" my-face-org-keystroke verbatim));This line is what you want to add

Pour l'exportation, vous devrez peut-être charger ox.elavec (require 'ox).

Puis à chaque fois boldou codeapparaît dans une fonction (en ox-org.el), j'ai créé une fonction similaire (ou modifiée celles existantes):

;creation
(defun org-html-keystroke (keystroke contents info)
  "Transcode KEYSTROKE from Org to HTML.
CONTENTS is nil.  INFO is a plist holding contextual
information."
  (format (or (cdr (assq 'my-object-keystroke org-html-text-markup-alist)) "%s")
          (org-html-encode-plain-text (org-element-property :value keystroke))))


;creation
(defun org-element-my-object-keystroke-parser ()
  "Parse code object at point.

Return a list whose CAR is `my-object-keystroke' and CDR is a plist with
`:value', `:begin', `:end' and `:post-blank' keywords.

Assume point is at the first tilde marker."
  (interactive)
  (save-excursion
    (unless (bolp) (backward-char 1))
    (looking-at org-emph-re)
    (let ((begin (match-beginning 2))
          (value (org-match-string-no-properties 4))
          (post-blank (progn (goto-char (match-end 2))
                             (skip-chars-forward " \t")))
          (end (point)))
      (list 'my-object-keystroke
            (list :value value
                  :begin begin
                  :end end
                  :post-blank post-blank)))))

;creation
(defun org-element-my-object-keystroke-interpreter (keystroke contents)
  "Interpret KEYSTROKE object as Org syntax.
CONTENTS is nil."
  (format "‰%s‰" (org-element-property :value keystroke)))


;modification
(defconst org-element-object-successor-alist
  '((subscript . sub/superscript) (superscript . sub/superscript)
    (bold . text-markup) (code . text-markup) (italic . text-markup)
    (strike-through . text-markup) (underline . text-markup)
    (verbatim . text-markup) (entity . latex-or-entity)
    (latex-fragment . latex-or-entity) (my-object-keystroke . text-markup))
  "Alist of translations between object type and successor name.
Sharing the same successor comes handy when, for example, the
regexp matching one object can also match the other object.")

;modification
(defconst org-element-all-objects
  '(bold code entity export-snippet footnote-reference inline-babel-call
         inline-src-block italic line-break latex-fragment link macro
         radio-target statistics-cookie strike-through subscript superscript
         table-cell target timestamp underline verbatim my-object-keystroke)
  "Complete list of object types.")


;modification
(defun org-element-text-markup-successor ()
  "Search for the next text-markup object.

Return value is a cons cell whose CAR is a symbol among `bold',
`italic', `underline', `strike-through', `code' and `verbatim'
and CDR is beginning position."
  (save-excursion
    (unless (bolp) (backward-char))
    (when (re-search-forward org-emph-re nil t)
      (let ((marker (match-string 3)))
        (cons (cond
               ((equal marker "*") 'bold)
               ((equal marker "/") 'italic)
               ((equal marker "_") 'underline)
               ((equal marker "+") 'strike-through)
               ((equal marker "~") 'code)
               ((equal marker "=") 'verbatim)
               ((equal marker "‰") 'my-object-keystroke) 
               (t (error "Unknown marker at %d" (match-beginning 3))))
              (match-beginning 2))))))

Ensuite, j'ai défini un my-htmlbackend pour l'exportation:

(org-export-define-derived-backend 'my-html 'html
  :translate-alist '((my-object-keystroke . org-html-keystroke))
  :menu-entry ' (?h 1
                    ((?r "my-html"  org-html-export-to-my-html))))

(defun org-html-export-to-my-html
  (&optional async subtreep visible-only body-only ext-plist)
  "Export current buffer to a HTML file.

Return output file's name."
  (interactive)
  (let* ((extension (concat "." org-html-extension))
         (file (org-export-output-file-name extension subtreep))
         (org-export-coding-system org-html-coding-system))
    (org-export-to-file 'my-html file
      async subtreep visible-only body-only ext-plist)))


(defun org-html-publish-to-my-html (plist filename pub-dir)
  "Publish an org file to my-html.
Return output file name."
  (org-publish-org-to 'my-html filename
                      (concat "." (or (plist-get plist :html-extension)
                                      org-html-extension "html"))
                      plist pub-dir))

(defun org-html-convert-region-to-my-html ()
  "Assume the current region has org-mode syntax, and convert it to HTML.
This can be used in any buffer.  For example, you can write an
itemized list in org-mode syntax in an HTML buffer and use this
command to convert it."
  (interactive)
  (org-export-replace-region-by 'my-html))

Donc quand j'utilise C-c C-e h rc'est exporté correctement:

entrez la description de l'image ici

entrez la description de l'image ici

entrez la description de l'image ici

Comme suggéré par OP dans les commentaires, vous devrez peut-être utiliser org-mode-restart(ou org-reload) ou tuer / recharger votre tampon.


Edit: Cela fonctionne pour le mode org avec les versions antérieures à 8.3 (c'est-à-dire jusqu'au 8.2.10)

Avec les versions ≥8.3.1, je dois modifier

  • org-element-all-objects
  • éventuellement des restrictions d'objet d'élément d'organisation
  • org-element - set-regexps
  • org-element - objet-lex

et bien sûr encore ajouter les fonctions

  • org-element-my-object-keystroke-parser
  • org-element-my-object-keystroke-interpreter

mais

  • org-element-object-successor-alist
  • org-element-text-markup-successor

sont maintenant supprimés.

Merci à Charles C. Berry pour son aide.


Le %marqueur est -il intégré? Je n'arrive pas à le faire fonctionner avec la dernière organisation. Quant aux autres marqueurs, cela fonctionne bien si je change de visage. Mais existe-t-il un moyen d'ajouter vraiment nos propres marqueurs? Néanmoins, votre réponse est utile.
Tu Do

%n'est actuellement pas utilisé comme marqueur. Vous pouvez l'utiliser de la même manière que je l'ai utilisé . Je ne comprends pas votre deuxième question, cependant, est un nouveau marqueur.
fredtantini

D'accord, j'ai pu faire fonctionner le %marqueur, mais j'ai dû courir org-reload. Vous devez mettre à jour la réponse avec cette commande.
Tu Do

En fait, nous n'avons pas besoin org-reloadmais org-mode-restart. Le fait est que nous devons tuer le tampon Org précédent et en créer un nouveau pour que le changement prenne effet.
Tu Do

Merci pour les conseils. J'ai mis à jour ma réponse. Heureux d'avoir pu aider
fredtantini

0

Je ne pense pas qu'il soit possible d'ajouter des marqueurs pour de nouvelles options de balisage en mode organisationnel.

Selon ce billet de 2012, il semble que les "marqueurs d'accentuation du mode org seront codés en dur". Faire une recherche rapide org-emph-redans org.elne révèle aucun code qui serait réellement généré à org-emph-repartir de org-emphasis-alist. Sur cette base, il semble que vous org-emph-rene chercherez rien à ajouter org-emphasis-alist.

Ceci est cohérent avec mon expérience (je peux redéfinir les marqueurs d'accentuation existants, mais je n'ai pas pu faire reconnaître le mode org |ou &ou H).

Je ne suis pas un expert ici, cependant, et j'aimerais savoir que je me trompe :)


1
La simple modification org-emphasis-alistn'ajoutera pas de nouveau marqueur. Vous devez également travailler avec org-font-lock-extra-keywords. Cette réponse donne une solution de travail.
Dean Seo

Hé, ça marche! Au moins, cela produit le même effet! :) Quand on utilise le org-font-lock-extra-keywordsalors on n'a pas besoin de changer org-emphasis-alistdu tout, évidemment (j'ai ajouté le org-font-lock...code mais je n'ai pas changé mon org-emphasis-alistet maintenant les choses sont en cours de formatage)
MikeTheTall
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.