Kapitel 13. SGML, XML und HTML

Inhaltsverzeichnis
PSGML — ein Add-On für SGML, XML und HTML
tdtd

Einige Module erleichtern die Arbeit mit SGML- und verwandten Dokumenten und damit zusammenhängenden Aufgaben: PSGML, tdtd.

PSGML — ein Add-On für SGML, XML und HTML

In Kombination mit PSGML ist der Emacs ein mächtiger SGML/XML-Editor. Er ist so in der Lage, mit beliebigen DTDs zu arbeiten; zum schnellen Zugriff können die geparsten DTDs in compilierter Form abgelegt werden. SGML-Auszeichnungen können nach Bedarf ein- und ausgeblendet werden. PSGML parst und validiert SGML-Dokumente. Die Befehle zum Editieren von SGML-Dokumenten stehen über Menüs, über Eingaben im Minibuffer oder über Tastaturkürzel zur Verfügung. Eine Einschränkung, die aber im Grunde keine ist, muss genannt werden: es werden Dokumente vorausgesetzt, die der Reference Concrete Syntax folgen[1].

PSGML wird mit SuSE Linux als eigenständiges Paket mitgeliefert. Autor: Lenart Stafflin; URL: http://www.lysator.liu.se/projects/about_psgml.html. Es findet gerade ein Umzug nach http://psgml.sourceforge.net statt; Mailinglisten: http://lists.sourceforge.net/mailman/listinfo/psgml-user und http://lists.sourceforge.net/mailman/listinfo/psgml-devel. Mit der Version 1.2.1 ist nunmehr zudem möglich, XML-Dokumente zu editieren.

Ein ausführliches Manual zu PSGML ist vorhanden.

Vorschlag für die .emacs:

(eval-after-load "psgml-parse"
	'(modify-syntax-entry ?_ "_" sgml-parser-syntax))

(add-to-list 'load-path "/usr/share/emacs/site-lisp/psgml")
(autoload 'sgml-mode "psgml" "Major mode to edit SGML files." t)

(add-hook 'sgml-mode-hook
          #'(lambda ()
              ;; (local-unset-key "\C-c\C-c")
              ;; (local-unset-key "\C-c\C-t")
              ;; (define-key sgml-mode-map "\C-c\C-c\C-c" 'sgml-show-context)
              ;; (define-key sgml-mode-map "\C-c\C-c\C-t" 'sgml-list-valid-tags)
              ;; (modify-face 'highlight "turquoise4" nil nil nil nil nil)
              ;; (modify-face 'italic "grey60" nil nil nil nil nil)
              ;; (modify-face 'bold-italic nil "grey80" nil nil nil nil)
              (auto-fill-mode t)
              (make-variable-buffer-local 'adaptive-fill-regexp)
              (setq adaptive-fill-regexp nil)
              (make-variable-buffer-local 'fill-column)
              (setq fill-column 79)
              ;; (require 'psgml-jade)
              ))

(setq auto-mode-alist
      (append (list (cons "\\.xml\\'" 'xml-mode))
              auto-mode-alist))
(autoload 'xml-mode "psgml" nil t)

(setq sgml-xml-declaration "/usr/share/sgml/jade_dsl/xml.dcl")

(setq sgml-markup-faces 
      '((start-tag . italic)
        (end-tag   . italic)
        (comment   . font-lock-comment-face)        ;; comment declaration
        ;; ignored      - ignored marked section
        ;; ms-end       - marked section start, if not ignored 
        ;; ms-start     - marked section end, if not ignored
        (pi 	   . bold)                          ;; processing instruction
        (sgml 	   . highlight)                     ;; SGML declaration
        (doctype   . font-lock-string-face)         ;; doctype declaration
        (entity    . font-lock-reference-face)      ;; general entity reference
        (shortref  . font-lock-function-name-face)));; short reference

(setq sgml-system-path '("/usr/share/sgml/gf"
                         ;; "/usr/share/sgml/TEI/dtd"
                         "/usr/share/sgml/ISO_8879:1986")
      sgml-public-map '("%S"
                        "/usr/share/sgml/%o/%c/%d"))

(setq sgml-catalog-files '("CATALOG"
                           "~/sgml/CATALOG"
                           "/usr/share/sgml/CATALOG")
      sgml-ecat-files '("ECAT" "~/sgml/ECAT" "/usr/share/sgml/ECAT"))

(setq sgml-display-char-list-filename
      "/usr/share/emacs/site-lisp/psgml/iso88591.map")

(setq sgml-validate-command "nsgmls -s %s %s")

So können die DTDs entweder direkt über das Dateisystem oder über CATALOG-Dateien gefunden werden.

Beim Öffnen einer SGML-Datei wird die DTD eingelesen. Mit C-c C-p (sgml-parse-prolog) erzwingt man das Parsen der DTD. Die geparste DTD kann mit sgml-save-dtd in compilierter Form gespeichert werden; so geht dann in Zukunft das Einlesen schneller von statten.

C-c C-e

sgml-insert-element — Einfügen eines Elements; mit Completion können die am jeweiligen Punkt gültigen Elemente angezeigt und dann ausgewählt werden.

C-c =

sgml-change-element-name — Den eines Elements ändern; es werden nur die Namen angeboten, die am jeweiligen Punkt gültigt sind.

C-c C-a

sgml-edit-attributes — In einem eigenen Editierfenster können bei den Attributen die Werte eingegeben werden; mit Tab zum nächsten Eingabefeld springen und mit C-c C-c das Eingeben von Attributen beenden.

Tabelle 13-1.

C-c C-esgml-insert-element
C-c C-asgml-edit-attributes

Fußnoten

[1]

Die Reference Concrete Syntax hat sich bei vielen Projekten bewährt und wird deshalb üblicherweise bevorzugt.