0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

この記事ではGuixでXBELファイルをいい感じに開くための方法を紹介します。

もう少し込み入った書き方をすれば、XML Bookmark Exchange Language (XBEL)のファイルをEmacsのnXMLモードで閲覧・編集するにあたり、nXMLモードが参照するXBELのためのスキーマの構成をGNU GuixのGuix Home Configuration(以下「Guix Home」)において行う方法です(ややこしい)。

XBELのRELAX NGスキーマ

XBELは公式にDTDスキーマを公開しています。
一方、nXMLではRELAX NG Compact Syntaxのみに対応しています(参照:Infoの「(nxml-mode) Introduction」)。
したがって、XBELのRELAX NG Compact Syntaxの形式のスキーマを得なければなりません。

これにはTrangないしmsvのRELAX NG Converterが使えます。

ここではすでに私が変換したものをGitHubにて配布しているため、それを使うことにします。

Guixパッケージ

XBELのスキーマはじかにどこかしらのファイルパスに置いてnXMLのスキーマ配置の構成ファイルから参照してもいいのですが、ここではGuixパッケージとして仕立てることにしましょう。
次のようなパッケージ定義になります。

(use-modules (guix packages)
             (guix git-download)
             (guix build-system copy)
             (guix gexp)
             ((guix licenses) #:prefix license:))

(define-public xbel-schema
  (package
    (name "xbel-schema")
    (version "0.0.1")
    (source
     (origin
       (method git-fetch)
       (uri (git-reference
             (url "https://github.com/gemmaro/xbel-schema")
             (commit (string-append "v" version))))
       (file-name (git-file-name name version))
       (sha256
        (base32 "1z6wwqkd2yzh4lqwkq3kvvw2gg3aj5y2s20zyy6d63rwp067mz21"))))
    (build-system copy-build-system)
    (arguments
     (list
      #:install-plan
      #~'(("xbel.rnc" "xml/xbel.rnc"))))
    (home-page "https://github.com/gemmaro/xbel-schema")
    (synopsis "RELAX NG schema for XML Bookmark Exchange Language")
    (description "This package contains a RELAX NG schema file in RELAX NG Compact
Syntax (RNC) for The XML Bookmark Exchange Language (XBEL), converted
from the official Document Type Definition (DTD).")
    (license license:gpl3+)))

XMLのスキーマファイルの場所はここでなければならないといったものはありませんが、Guixの公式パッケージ群の慣習としてはxml/配下が妥当のようです。

Guix Home

作成したパッケージを参照するようGuix HomeにてnXMLを構成します。
ここでは.emacs.d/nxml.xmlファイルを配置先とします。

(simple-service
 'my-home-files-service-type
 home-files-service-type
 (list
  (list ".emacs.d/nxml.xml"
        (computed-file
         "nXML-schemas"
         #~(begin
             (use-modules (sxml simple))
             (call-with-output-file #$output
               (lambda (port)
                 (sxml->xml
                  '(*TOP*
                    (*PI* xml "version=\"1.0\"")
                    (locatingRules
                     ;; SXML [1] では*NAMESPACES*がありますが、sxml simpleに
                     ;; は実装されていないようです。
                     ;;
                     ;; [1] https://okmij.org/ftp/Scheme/SXML.html#Namespaces
                     (@ (xmlns
                         "http://thaiopensource.com/ns/locating-rules/1.0"))
                     (documentElement (@ (uri #$
                                              (file-append
                                               xbel-schema
                                               "/xml/xbel.rnc"))
                                         (localName
                                          "xbel")))))
                  port))))))
  ;; [...]
  ))

XMLの生成にはGNU GuileのSXMLを使っています(参照:Infoの「(guile) SXML」)。

XMLの中身としては、XMLの局所要素名 (localName) がxbelに合致した文書については、XBELのスキーマを適用するものとしています。

このサービス定義をGuix Homeに組み込んで再構成すれば、指定した場所にファイルが生成されます。

Emacsの構成

生成した構成ファイルをnXMLに伝えます。
Emacsの初期化ファイルで次のようにします。

(with-eval-after-load 'rng-loc
  (defvar rng-schema-locating-files)    ;defined in `rng-lock.el'.
  (add-to-list 'rng-schema-locating-files
               (locate-user-emacs-file "xml-schemas.xml")))

以上により、XBELのファイルを開いたとき、nXMLによるスキーマ検証が行なわれるようになります。

使用許諾

Copyright (C) 2026 gemmaro

Copying and distribution of this file, with or without modification,
are permitted in any medium without royalty provided the copyright
notice and this notice are preserved. This file is offered as-is,
without any warranty.

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?