Как я могу сложить произвольные теги в режиме nxml?

993
Sean Allred

Я хотел бы сложить

<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чтобы быть готовым очертить любой элемент?

3
Контурная функция требует определенного регулярного выражения и окончательного регулярного выражения. Если никто не предложит решение в ближайшем будущем, тогда я попробую. А пока соберите список всех начальных и конечных регулярных выражений областей, которые вы хотите свернуть - это потребуется для создания пользовательской функции свертывания (если такой функции еще нет) для вашего `nxml -модовый проект. Вы также можете взглянуть на библиотеку Hide-Show: http://www.emacswiki.org/emacs/HideShow и https://www.gnu.org/software/emacs/manual/html_node/emacs/Hideshow. .html lawlist 10 лет назад 0
@lawlist Проблема с этим - насколько я могу судить по классическим регулярным выражениям - в том, что регулярные выражения не могут действительно обрабатывать вложенные объекты. Тем не менее, `xsl:. *` Должен охватывать все, что я хотел бы вкладывать, хотя возможность определения списка таких тегов для сворачивания была бы идеальной. Sean Allred 10 лет назад 0
Похоже, что начальное регулярное выражение можно использовать для получения конечного регулярного выражения, аналогично предыдущему примеру, который я написал для LaTeX: http://tex.stackexchange.com/a/161196/26911 Я проверю это на следующий день или чтобы увидеть, есть ли у кого-то встроенное решение или для скрытия или другого метода. Если нет, я, скорее всего, соберу что-то вместе на основе проекта в ссылке, которую я упомянул. Этот мой предыдущий пример выглядит довольно близко к тому, что вы хотите - вы можете попробовать сделать это сами. lawlist 10 лет назад 0

1 ответ на вопрос

3
lawlist

Первоначальный черновик (23 июля 2014 г.): первый черновик.

РЕДАКТИРОВАТЬ (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] (https://github.com/vermiculus/stack-api/blob/master/transform.xsl) --- особенно с `xsl: for-each` в строке 11 (но интересно * не * `xsl: for-each` в строке 43). Sean Allred 10 лет назад 0
Спасибо за тестовый код `transform.xsl`. Мне нужно подумать о том, как мы можем обрабатывать вложенные ситуации, содержащие одно и то же регулярное выражение. По крайней мере, у нас есть полуработающий первый проект, чтобы начать нас. lawlist 10 лет назад 1
@Sean Allred - я добавил цикл while и счетчик, чтобы попытаться справиться с вложенными ситуациями, содержащими одно и то же регулярное выражение - всякий раз, когда у вас есть свободное время, вы можете попробовать и попробовать, если хотите. lawlist 10 лет назад 0

Похожие вопросы