桐已実験室(Kirii Laboratory)

psgmlを使ってみる

psgmlというのはSGMLの入力支援のために作られたlispです.当然HTML作成に活用できますし,また,XMLの作成にも対応しています.DTDを読み込んで正しく文書を作成することが出来ます.

ここに書かれているのはmakeなどを使わないでインストールする方法です.自分のディレクトリ構成とconfigureファイルなどでの指定が微妙に違うし,そう簡単に修正できそうになかったので,手動で作業しました.

目標はXHTML1.0などを編集できるようにすることです.やり方を眺めれば後はどうすればいいのか分かると思います.自分,Meadowを使っているのでそれように書いていますが,作業自体はemacsenなら大丈夫だと思います.適宜読み替えてください.

psgmlのダウンロード

  1. まずは本体をInformation about PSGMLからダウンロード.自分は最新の1.3.1を使っています.
  2. 解凍してできるpsgmlのフォルダをload-pathの通ったところに入れるなりload-pathを追加するなりします.自分の場合はc:/usr/local/share/Meadow/site-lisp/の下においています.このsite-lispの下はload-pathが通っているはずなので,ここに置くのが簡単だと思います.

これでインストール自体は完了です.が,まだ使えるようにならないので,いろいろと作業していきます.

.emacsの編集

以下のように追加していきました.

まず最低限


(autoload 'sgml-mode "psgml" "Major mode to edit SGML files." t)
(autoload 'xml-mode "psgml" "Major mode to edit XML files." t)

(setq auto-mode-alist
     (append (list (cons "\\.html\\'" 'xml-mode))
              auto-mode-alist))

(setq auto-mode-alist
     (append (list (cons "\\.shtml\\'" 'xml-mode))
              auto-mode-alist))

(setq auto-mode-alist
      (append (list (cons "\\.xml\\'" 'xml-mode))
              auto-mode-alist))

sgml-modeおよびxml-modeを呼び出すための設定です.どの拡張子で呼び出すのかも設定しました.

HTMLからXHTMLに移行してしまっているので,全てxml-modeを呼び出すようになっていますが,以前は拡張子.html.shtmlの場合はsgml-modeと記述していました.

カタログファイル


(setq sgml-catalog-files '("CATALOG" "c:/usr/local/share/Meadow/site-lisp/psgml/catalog"))
(setq sgml-ecat-files '("ECAT" "c:/usr/local/share/Meadow/site-lisp/psgml/ecat"))

読み込むためのDTDの対応表を置く場所を指定します.デフォルト設定(infoあたりで探してください)でない場合,指定が必要です.それがCATALOGの指定です.ECATというのはpsgmlがコンパイルしたファイルを置くところです(だったはず).なくてもいいらしいですが用意しておきました.忘れないようにpsgmlディレクトリの中に用意しています,自分.

その他


(add-hook 'sgml-mode-hook
  (lambda ()
    (if (or (string-match "\\.html$" (buffer-name))
            (string-match "\\.htm$" (buffer-name))
            (string-match "\\.shtml$" (buffer-name)))
        (setq sgml-omittag nil         ;; タグの省略 無効 nil
              sgml-shorttag nil        ;; タグの短縮 無効 nil
              sgml-indent-step nil
              sgml-indent-data nil)))) ;; インデント 無効 nil

(setq sgml-set-face t)
(setq sgml-general-insert-case 'lower)

フォントのフックだとか何やらかんやら.ごめん,よく分からない.

DTD指定


(setq sgml-custom-dtd
 '(("HTML 4.01 Strict" 
    "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\"
\"http://www.w3.org/TR/html4/strict.dtd\">")
   ("HTML 4.01 Translational" 
    "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Translational//EN\"
\"http://www.w3.org/TR/html4/loose.dtd\">")
   ("HTML 4.01 Frameset" 
    "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Frameset//EN\"
\"http://www.w3.org/TR/html4/frameset.dtd\">")
   ("XHTML 1.0 Strict" 
    "<?xml version=\"1.0\" encoding=\"Shift_JIS\"?>
<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"
\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n")
   ("XHTML 1.0 Translational" 
    "<?xml version=\"1.0\" encoding=\"Shift_JIS\"?>
<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Translational//EN\"
\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n")
   ("XHTML 1.0 Frameset" 
    "<?xml version=\"1.0\" encoding=\"Shift_JIS\"?>
<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\"
\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">\n")
   ("XHTML 1.1"
    "<?xml version=\"1.0\" encoding=\"Shift_JIS\"?>
<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\"
\"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">\n")
))

DTDの名前と実際に挿入する部分との対応付けです.メニューのDTDからInsert DTDというのを選ぶことが出来るようになり,対応して内容が挿入されます.今回の目標はこれだけのDTDを扱えるようにすることです.

カスタム設定


(setq sgml-custom-markup
      '(("cgi"
	 "<abbr title=\"Common Gateway Interface\">CGI</abbr>")
	("cpan"
	 "<acronym title=\"Comprehensive Perl Archive Network\">CSS</acronym>")
	("css"
	 "<abbr title=\"Cascading Style Sheet\">CSS</abbr>")
	("csv"
	 "<abbr title=\"Comma Separated Value\">CSV</abbr>")
	("dll"
	 "<abbr title=\"Dynamic Link Library\">DLL</abbr>")
	("dtd"
	 "<abbr title=\"Document Type Definition\">DTD</abbr>")
	("faq"
	 "<acronym title=\"Frequently Asked Questions\">FAQ</acronym>")
	("ftp"
	 "<abbr title=\"File Transfer Protocol\">FTP</abbr>")
	("gpl"
	 "<abbr title=\"GNU General Public License\">GPL</abbr>")
	("hsp"
	 "<abbr title=\"Hot Soup Processor\">HSP</abbr>")
	("html"
	 "<abbr title=\"HyperText Markup Language\">HTML</abbr>")
	("ie"
         "<abbr title=\"Internet Explorer\">IE</abbr>")
	("lgpl"
         "<abbr title=\"GNU Lesser General Public License\">LGPL</abbr>")
	("meadow"
         "<acronym title=\"Multilingual enhancement to gnu Emacs with ADvantages Over Windows\">Meadow</acronym>")
	("os"
	 "<abbr title=\"Operating System\">OS</abbr>")
	("rc"
	 "<abbr title=\"Release Candidate\">RC</abbr>")
	("rdf"
	 "<abbr title=\"Resource Description Framework\">RDF</abbr>")
	("rss"
	 "<abbr title=\"RDF Site Summary or Rich Site Summary\">RSS</abbr>")
	("seo"
	 "<abbr title=\"Search Engine Optimization\">SEO</abbr>")
	("sgml"
	 "<abbr title=\"Standard Generalized Markup Language\">SGML</abbr>")
	("ssi"
	 "<abbr title=\"Server Side Include\">SSI</abbr>")
	("tod"
	 "<acronym title=\"the Typing of the Dead\">ToD</acronym>")
	("uri"
	 "<abbr title=\"Uniform Resource Identifier\">URI</abbr>")
	("xhtml"
	 "<abbr title=\"eXtensive HyperText Markup Language\">XHTML</abbr>")
	("xml"
	 "<abbr title=\"eXtensive Markup Language\">XML</abbr>")
	("xsl"
	 "<abbr title=\"eXtensive Stylesheet Language\">XSL</abbr>")
	("xslt"
	 "<abbr title=\"eXtensive Stylesheet Language Transformations\">XSLT</abbr>")
	("w3c"
	 "<abbr title=\"World Wide Web Consocium\">W3C</abbr>")
))

C-c C-u RETとすることでInsert Markup:ときかれます.そのときに短縮形を答えれば,下の内容が挿入されます.よく使うフレーズがあるときに便利です.ご覧のとおり,自分はabbrとかacronymの入力に使っています(毎回定型で面倒だし).

DTDの配置

というわけで必要なDTDを配置します.

入手

全てHTML関係のDTDばかりなので,全てW3Cから入手できます.たとえばHTML 4.01 Specificationのページからgzip'ed tar archiveとかをダウンロードすることが出来ます.ほかのXHTML1.0などでも同様です.

必要なファイル

以下のファイルが(適宜)必要です.今ダウンロードしたアーカイブから探してください.今のところだいたいこれで間に合っているようです.エラーもまずでないし.

HTML4.01
XHTML1.0
XHTML1.1

CATALOG

先ほど指定したCATALOGファイルの場所に実際にCATALOGという名前のファイルを作り,そのファイルに宣言と必要なファイルとの対応を書き込んでいきます.自分の場合,こんな感じ.


PUBLIC "-//W3C//DTD HTML 4.01//EN" "html4.01/strict.dtd"
PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "html4.01/loose.dtd"
PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "html4.01/frameset.dtd"
PUBLIC "-//W3C//ENTITLES Latin1//EN//HTML" "html4.01/HTMLlat1.ent"
PUBLIC "-//W3C//ENTITLES Symbols//EN//HTML" "html4.01/HTMLsymbol.ent"
PUBLIC "-//W3C//ENTITLES Special//EN//HTML" "html4.01/HTMLspecial.ent"

PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "xhtml1/xhtml1-strict.dtd"
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "xhtml1/xhtml1-transitional.dtd"
PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "xhtml1/xhtml1-frameset.dtd"
PUBLIC "-//W3C//ENTITIES Latin 1 for XHTML//EN" "xhtml1/xhtml-lat1.ent"
PUBLIC "-//W3C//ENTITIES Symbols for XHTML//EN" "xhtml1/xhtml-symbol.ent"
PUBLIC "-//W3C//ENTITIES Special for XHTML//EN" "xhtml1/xhtml-special.ent"

PUBLIC "-//W3C//DTD XHTML 1.1//EN" "xhtml1.1/xhtml11-flat.dtd"
PUBLIC "-//W3C//ENTITIES XHTML 1.1 Document Model 1.0//EN" "xhtml1.1/xhtml11-model-1.mod"

SGMLDECL "xhtml1/xhtml1.dcl"

あんまり細かいことが分からないので,そういうもんなんだと思ってください.たとえばhtml4.01/strict.dtdとありますが,それはこのCATALOGファイルから見た,strict.dtdの位置です.CATALOGファイルがc:/usr/local/share/Meadow/site-lisp/psgml/にあるとすると,c:/usr/local/share/Meadow/site-lisp/psgml/html4.01/にstrict.dtdがあります.

ECAT

ついでにこちらも.これがあるとpsgmlの動作が速くなるらしいけど実際はどうなんだろ.実際の作業は先ほどのCATALOGファイルのときと同様.つまり,sgml-ecat-filesで指定した位置にECATというファイルを作り,対応表を作成してください.ちなみに自分のは:


PUBLIC "-//W3C//DTD HTML 4.01//EN" "cust/html4.01/strict.dtd"
PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "cust/html4.01/loose.dtd"
PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "cust/html4.01/frameset.dtd"
PUBLIC "-//W3C//ENTITLES Latin1//EN//HTML" "cust/html4.01/HTMLlat1.ent"
PUBLIC "-//W3C//ENTITLES Symbols//EN//HTML" "cust/html4.01/HTMLsymbol.ent"
PUBLIC "-//W3C//ENTITLES Special//EN//HTML" "cust/html4.01/HTMLspecial.ent"

PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "cust/xhtml1/xhtml1-strict.dtd"
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "cust/xhtml1/xhtml1-transitional.dtd"
PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "cust/xhtml1/xhtml1-frameset.dtd"
PUBLIC "-//W3C//ENTITIES Latin 1 for XHTML//EN" "cust/xhtml1/xhtml-lat1.ent"
PUBLIC "-//W3C//ENTITIES Symbols for XHTML//EN" "cust/xhtml1/xhtml-symbol.ent"
PUBLIC "-//W3C//ENTITIES Special for XHTML//EN" "cust/xhtml1/xhtml-special.ent"

PUBLIC "-//W3C//DTD XHTML 1.1//EN" "cust/xhtml1.1/xhtml11-flat.dtd"
PUBLIC "-//W3C//ENTITIES XHTML 1.1 Document Model 1.0//EN" "cust/xhtml1.1/xhtml11-model-1.mod"

ファイルの配置

上のCATALOGファイルで指定した位置に,ファイルを置いていきます.ECATも作った場合にはそちらに対応する位置にも.

以上でインストールは完了です..emacsの変更を有効にするため,いったんMeadowを終了させ,もう一度起動します.

実際に使う

ためしにファイルを開いてみます.拡張子.htmlのファイルを開くと,モード欄が(XML Encoded-kbd)となれば成功です.

自分も使いこなせているわけではないので,この辺自分がよく使うものだけ.

DTDの指定

メニューにDTDという項目があるはずです.そこからInsert DTDという項目を選び,必要な物を選びましょう.

DTDのParse

C-c C-p.初回は時間がかかるかも.

文書のParse

C-c C-oで文書全体をparseする.ミニバッファにOKと出れば正しい文書.

要素の挿入

C-c C-eElement?ときかれるので入れたい要素を答える.Tabによる補完も可能だし,?と答えれば現在の地点で挿入できる全ての要素を表示してくれる.

カスタムマークアップ

.emacsにsgml-custom-markupとして指定した項目の挿入.C-c C-u RETとすると,Insert Markup: ときかれるので,入れたい項目を答える.先ほどと同じくTab?も有効.

アトリビュート

C-c +で入れたい属性値を入れる.項目によっては値の入力も求められる.

終了タグ

C-c /で現在の要素を閉じる.結構便利.

要素の削除

C-c -で現在の要素を削除する.

要素の変更

C-c =で現在の要素から別の要素へと切り替える.Change hogehoge to:ときかれるので変更したい要素名を答える.

インフォ

インフォがほしくなってしまった場合.

ファイルの配置

psgmlフォルダ内にあるpsgml.infoを,Meadowのinfoディレクトリ(自分の場合ならc:/usr/local/share/Meadow/2.00/info/)に放り込む.

dirファイルへの追加

上のinfoディレクトリ内にあるdirファイルに次を追加(psgml.infoにある記述).* PSGML: (psgml). PSGML, a major mode for SGML documents.

確認

M-x infoとして上のpsgmlの項目が出ているかどうか確認する.ついでに読めるかどうかも確認しておくとよさそう.

参考にしたサイト

以下のサイトさんを参考にして設定したりしました.



Copyright 2004 Kirii Hideya. All rights reserved. Email:kyriehideya@hotmail.com