Як я можу скласти довільні теги в режимі nxml?


3

Я хотів би скласти

<type>
  <xsl:attribute name="multiplicity">
    <xsl:choose>
      <xsl:when test="collection = true">*</xsl:when>
      <xsl:otherwise>1</xsl:otherwise>
    </xsl:choose>
  </xsl:attribute>
  <xsl:value-of select="field_type"/>
</type>

в

<type>
  <xsl:attribute name="multiplicity">
    <xsl:choose>...</xsl:choose>
  </xsl:attribute>
  <xsl:value-of select="field_type"/>
</type>

або

<type>
  <xsl:attribute name="multiplicity">...</xsl:attribute>
  <xsl:value-of select="field_type"/>
</type>

nxml-modeвже можуть окреслити певні елементи. Як я можу створити nxml-modeбажання окреслити будь-який елемент?


Особливість контуру вимагає остаточного початку regexp і остаточного закінчення. Якщо найближчим часом ніхто не запропонує рішення, то я його зафіксую. Тим часом, будь ласка, складіть список усіх початкових і повторних регулярних покажчиків у регіоні, який ви хочете скласти, - який знадобиться для створення спеціальної функції складання (якщо такої функції ще не існує) для вашого nxml-modeпроекту. Ви також можете поглянути на бібліотеку прихованих шоу: emacswiki.org/emacs/HideShow і gnu.org/software/emacs/manual/html_node/emacs/Hideshow.html
список законів

@lawlist Проблема з цим - наскільки я можу зрозуміти класичні регулярні вирази - полягає в тому, що регулярні вирази дійсно не можуть обробляти вкладені речі. Сказане, xsl:.*повинно охоплювати все, що я хотів би вкласти, хоча можливість визначення списку таких тегів для складання була б ідеальною.
Шон Аллред

Схоже, що початковий регулярний вираз може бути використаний для отримання закінчуючого регулярного виразу, подібний до попереднього прикладу, який я склав для LaTeX: tex.stackexchange.com/a/161196/26911, я перевірте наступного дня, щоб побачити, чи хтось має вбудоване рішення або для прихованого шоу або інший метод. Якщо ні, я, швидше за все, складу щось на основі проекту в посиланні, яке я згадав. Цей попередній мій приклад виглядає досить близьким до того, що ви хочете - ви, тим часом, можете захотіти самостійно занести його.
законник

Відповіді:


3

Початковий проект (23 липня 2014 р.): Перший чорновий проект.

EDIT (23 липня 2014 р.): Другий чорновий проект. Додано лічильник та цикл while під час спроби впоратися з вкладеними ситуаціями, що містять той самий регулярний вираз.

(defvar beg-xsl-regexp
  "\\(\<xsl:\\)\\([^ >]*\\)\\([^>]*\\)\\(\>\\)"
"Regexp matching the beginning of the folded region.")

(defun toggle-xsl-block ()
"When FLAG is non-nil, hide the region.  Otherwise make it visible.  For this
function to work, the cursor must be on the same line as the beginning regexp."
(interactive)
  (require 'outline)
  (cond
    ((or
        (looking-at beg-xsl-regexp)
        (let ((line-begin (save-excursion (beginning-of-line 1) (point))))
          (save-excursion
            (re-search-backward "\<" line-begin t)
            (looking-at beg-xsl-regexp)))
        (let ((line-begin (save-excursion (beginning-of-line 1) (point))))
          (save-excursion
            (re-search-backward "\<xsl:" line-begin t)
            (looking-at beg-xsl-regexp)))
        (let ((line-end (save-excursion (end-of-line 1) (point))))
          (save-excursion
            (re-search-forward "\<xsl:" line-end t)
            (backward-char 5)
            (looking-at beg-xsl-regexp))))
      (let* (
          congratulations
          (i 0)
          (beg-1 (match-beginning 0))
          (flag (not (get-char-property (match-end 0) 'invisible)))
          (begin-fold (match-end 0))
          end-fold
          (base-flag-match (regexp-quote
            (buffer-substring-no-properties (match-beginning 2) (match-end 2))))
          (beg-flag-match (concat "\<xsl:" base-flag-match))
          (end-flag-match (concat "\</xsl:" base-flag-match "\>"))
          (go-fish (concat "\</xsl:" base-flag-match "\>"))  )
        (save-excursion
          (when (save-excursion (re-search-forward end-flag-match nil t))
            (catch 'done
              (while t 
                (re-search-forward end-flag-match nil t)
                (when
                  (>
                    (save-excursion (re-search-backward beg-flag-match beg-1 t i) (point))
                    beg-1)
                  (setq i (1+ i)))
                (when
                  (=
                    (save-excursion (re-search-backward beg-flag-match beg-1 t i) (point))
                    beg-1)
                  (setq congratulations t)
                  (throw 'done nil)))))
          (if congratulations
            (progn
              (setq end-fold (point))
              (outline-flag-region begin-fold end-fold flag)
              (cond
                (flag
                  (overlay-put (make-overlay begin-fold end-fold) 'display "\u25be"))
                (t
                  (mapc 'delete-overlay (overlays-in begin-fold end-fold)))))
            (user-error "Error locating an ending match for:  %s." go-fish)))
        (if (> (point) begin-fold)
          (goto-char begin-fold)) ))
    (t
      (message "You are not on a line containing the beginning regexp."))))

Спробуйте його з transform.xsl --- особливо xsl:for-eachна лінії 11 (але цікаво НЕxsl:for-each на лінії 43).
Шон Алредред

1
Дякуємо за transform.xslтестовий код. Мені потрібно подумати про те, як ми можемо впоратися з вкладеними ситуаціями, що містять той самий регулярний вираз. Принаймні, у нас є напівпрацюючий перший проект, щоб розпочати нас.
законник

@Sean Allred - я додав цикл і лічильник часу, щоб спробувати впоратися з вкладеними ситуаціями, що містять один і той же regexp - коли ви маєте трохи вільного часу, ви можете продовжити і спробувати, якщо хочете.
законник
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.