Status: Draft
Updated: 2025-07-26
Audience: ベースウェア(Ourin/桜鈴)実装者・モジュール作者
Scope: UKADOC HEADLINE/2.0 を母体に、macOS ネイティブ(.plugin/.bundle)で安全に運用するための差分を規定します。
非目標: Windows DLL のバイナリ互換(語彙・挙動の互換のみ対象)。
1. 目的と設計方針
- HEADLINE/2.0 の語彙・挙動を維持しつつ、macOS の Loadable Bundle(.plugin/.bundle)に対応。
- 文字コードは UTF‑8 を既定とし、互換のため Shift_JIS / Windows‑31J 等のラベルを 同一系として受理します。
- バイナリ互換は対象外。Windows 固有の API(HGLOBAL 等)は用いず、生バイト列 + 長さの呼び出し規約に読み替えます。
2. 用語
- 2.0M: 本仕様の Mac 差分版識別子。
- ホスト: Ourin(桜鈴)など、HEADLINE モジュールを実行するベースウェア。
- モジュール: HEADLINE の実装本体(.plugin/.bundle で配布)。
- ワイヤ:
GET Version HEADLINE/2.x/GET Headline HEADLINE/2.xを先頭行とするテキストの往復。
3. 適用範囲と互換性
- 語彙互換:
GET Version/GET Headline、Charset、Option、Path、Headline、RequestCharsetなど HEADLINE/2.0 と同一のヘッダ/意味を踏襲します。 - 既定文字コード:2.0M では未指定時 UTF‑8。
Shift_JIS/Windows‑31Jなどは 同一系(CP932 相当)として受理します。 - 呼び出し回数:
GET Headlineは 旧ファイル→新ファイルの 2 回呼び出され得ます(順不同)。モジュールは順に依存しないこと。
4. OS/CPU と配布
- 最小 OS: macOS 10.15(Catalina)以降。
- 配布形態: Universal 2(
arm64 + x86_64)を推奨必須。 - 実体: Bundle(.plugin/.bundle) とし、CFBundle/Bundle API でロードします。
5. 実体とエクスポート(.plugin/.bundle)
- 必須エクスポート(C ABI) ```c // HEADLINE/2.0 の “execute” を踏襲 const unsigned char execute(const unsigned char req, size_t len, size_t* out_len);
// 任意:メモリ解放フック(ホストが即時コピーする設計を推奨) void headline_free(void* p);
// 任意:ライフサイクル(UTF‑8 パス受領を推奨)
int loadu(const char plugin_dir_utf8); // 成功0
void unload(void);
``
- **ロード/解決**:ホストはCFBundleGetFunctionPointerForNameでexecute` を取得。返却バッファは UTF‑8* を推奨。
6. ワイヤ(HEADLINE/2.0 との差分)
- 版表記:
HEADLINE/2.0M(構文は 2.0 と同形)。 - CRLF/空行終端:2.0 と同じ。ゼロ終端は前提にしない。
Option: url:2.0 と同じく有効。Headline:値は 本文 + 0x01 + URL(複数行可)。RequestCharset:モジュールからホストへ 次回の希望文字コードを提示可。
7. Path の表現(macOS 最適化)
- 推奨:
Path:は POSIX 絶対パス(UTF‑8) またはfile://URL(RFC 8089 準拠)。 - 互換:Windows 風パス
C:\...を受け取った場合、ホスト側で POSIX/file://に正規化してからモジュールに渡します。 - 実装ヒント:Foundation の
URL(fileURLWithPath:)/standardizedFileURLを利用。
8. 設定ファイル(descript.txt)差分
- 基本は HEADLINE/2.0 の規定に従います(
name/dllname/url/openurl等)。 - 2.0M 追加:
dllnameの代替としてfilenameに .plugin/.bundle を指定可能(両立時はfilenameを優先)。 - 文字コード:
charsetは UTF‑8 推奨(旧互換で Shift_JIS も可)。 - 注意:行頭が
\/%の文字列は破棄対象のため、利用時はエスケープが必要。
9. エラー応答の指針
- 400 Bad Request:CRLF/空行終端の欠落、必須ヘッダ不足。
- 415 Unsupported Charset:不明なラベル。
- 500 Module Error:モジュール内例外。
10. セキュリティ/安定性(XPC隔離は推奨)
- 解析負荷が高いモジュールは NSXPCConnection を用いて 別プロセス化(
request(Data)->Data相当の橋渡し)。 - クラッシュ隔離・権限最小化に寄与。
11. 例(Version / Headline 取得)
11.1 Version 照会
Request
GET Version HEADLINE/2.0M
Charset: UTF-8
Sender: Ourin
Response
HEADLINE/2.0M 200 OK
Charset: UTF-8
Value: HeadlineModule 1.1
11.2 Headline 取得(Option: url)
Request
GET Headline HEADLINE/2.0M
Charset: UTF-8
Option: url
Path: [local-file]]
Response
HEADLINE/2.0M 200 OK
Charset: UTF-8
Headline: ほげ1\x01https://example.com/1
Headline: ほげ2\x01https://example.com/2
Headline: ほげ3\x01https://example.com/3
注:
GET Headlineは 旧/新ファイルに対して 2 回呼ばれ得ます。順序に依存しない実装としてください。
12. 最小実装(C)
#include <stdlib.h>
#include <string.h>
static unsigned char* dupmsg(const char* s, size_t* out){ size_t n=strlen(s); unsigned char* p=malloc(n); memcpy(p,s,n); *out=n; return p; }
const unsigned char* execute(const unsigned char* req, size_t len, size_t* out_len) {
(void)len; (void)req;
// 超簡易: Versionリクエストだけ200で返すデモ(実用では解析必須)
const char* ok =
"HEADLINE/2.0M 200 OK\r\n"
"Charset: UTF-8\r\n"
"Value: HeadlineModule 1.0\r\n"
"\r\n";
return dupmsg(ok, out_len);
}
void headline_free(void* p){ free(p); }
int loadu(const char* plugin_dir_utf8){ (void)plugin_dir_utf8; return 0; }
void unload(void){}
13. 適合チェックリスト
- [ ] 先頭行に
HEADLINE/2.0Mを用い、CRLF/空行終端で往復できる。 - [ ] UTF‑8 既定、
Shift_JIS/Windows‑31Jを受理。 - [ ]
Option: url時のHeadline: 本文\x01URLを処理。 - [ ]
Path:に POSIX/file://を受理(Windows 風はホストで正規化)。 - [ ] 実体は .plugin/.bundle、
executeを C ABI で公開。
14. 参照(Normative / Informative)
- UKADOC: HEADLINE/2.0(語彙・
Option: url・0x01区切り・2回呼び出しの注意) - UKADOC: Headline 設定(descript.txt)(必須項目・文字コード・
\/%エスケープ) - UKADOC: DLL共通仕様(Windows 固有メモリ規約の参考—2.0M では置換)
- Apple: CFBundleGetFunctionPointerForName(関数名でポインタ解決)
- Apple: Universal 2(
arm64/x86_64) - Apple: 32‑bit 非対応(10.15+)
- RFC 8089: file URL
出典と編集について
Ourin / Furin Lab・contributors。文書はCC BY-SA 4.0(第三者の個別表記を除く)。Web版は見出し・リンクの整備とローカルパスの一般化を行っています。更新基準日: 2026-10-30。
元資料: docs/HEADLINE_2.0M_SPEC_ja-jp.md
ソース SHA-256: ba3e8095218080210e088aa34e86e3715ad8d0e2f5617aca4ee32aec6dae0790