桐已実験室(Kirii Laboratory)
psgmlというのはSGMLの入力支援のために作られたlispです.当然HTML作成に活用できますし,また,XMLの作成にも対応しています.DTDを読み込んで正しく文書を作成することが出来ます.
ここに書かれているのはmakeなどを使わないでインストールする方法です.自分のディレクトリ構成とconfigureファイルなどでの指定が微妙に違うし,そう簡単に修正できそうになかったので,手動で作業しました.
目標はXHTML1.0などを編集できるようにすることです.やり方を眺めれば後はどうすればいいのか分かると思います.自分,Meadowを使っているのでそれように書いていますが,作業自体はemacsenなら大丈夫だと思います.適宜読み替えてください.
これでインストール自体は完了です.が,まだ使えるようにならないので,いろいろと作業していきます.
以下のように追加していきました.
(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)
フォントのフックだとか何やらかんやら.ごめん,よく分からない.
(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を配置します.
全てHTML関係のDTDばかりなので,全てW3Cから入手できます.たとえばHTML 4.01 Specificationのページからgzip'ed tar archive
とかをダウンロードすることが出来ます.ほかのXHTML1.0などでも同様です.
以下のファイルが(適宜)必要です.今ダウンロードしたアーカイブから探してください.今のところだいたいこれで間に合っているようです.エラーもまずでないし.
先ほど指定した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があります.
ついでにこちらも.これがあると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という項目があるはずです.そこからInsert DTDという項目を選び,必要な物を選びましょう.
C-c C-p.初回は時間がかかるかも.
C-c C-oで文書全体をparseする.ミニバッファにOKと出れば正しい文書.
C-c C-eでElement?ときかれるので入れたい要素を答える.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/)に放り込む.
上のinfoディレクトリ内にあるdirファイルに次を追加(psgml.infoにある記述).* PSGML: (psgml). PSGML, a major mode for SGML documents.
M-x infoとして上のpsgmlの項目が出ているかどうか確認する.ついでに読めるかどうかも確認しておくとよさそう.
以下のサイトさんを参考にして設定したりしました.