Helper
in package
Table of Contents
Constants
- FUNCTION_TAG_TOKEN_PREFIX = 'acms-fn-tag:'
- 展開前の機能タグを置き換えるトークン(コメントノードの本文)の接頭辞
Properties
- $authoring : AuthoringConverter
- 入稿用タグの変換器
- $functionTags : FunctionTagRegistry
- 機能タグの展開ハンドラ
- $lightboxClass : string
- Lightboxクラス名
- $resizeImageSize : int
- 画像リサイズの幅
Methods
- __construct() : mixed
- extractMediaId() : array<string|int, int>
- メディアIDを抽出する
- fix() : string
- ブロックエディターのHTMLを修正する
- fixMediaId() : string
- メディアIDを修正する
- importExternalMedia() : string
- 本文中の img/fileBlock で data-mid が未設定のノードに、$registerCallback から 得た media_id を設定する(CSV インポート、CMS-7715)
- applyHtmlFilterHook() : string
- 組み立て済みのブロックエディターHTMLを `filterBlockEditorHtml` フックで調整する
- applyRegisteredMediaId() : void
- $source をコールバックに渡し、得られた media_id を $target の data-mid に設定する
- expandFunctionTags() : array<string, string>
- 機能タグを一意なトークンのコメントノードに置き換え、トークンと展開後HTMLの対応を返す
- extractFunctionTagAttributes() : array{id?: string, class?: string}
- ハンドラへ渡す機能タグの属性(id / class)を取り出す
- fixMediaFiles() : void
- メディアファイルの修正
- fixMediaImages() : void
- メディア画像の修正
- getInnerHTML() : string
- DOMDocumentからHTML文字列を取得する
- hasAncestorTag() : bool
- $node の祖先に $tagName を持つ要素があるか判定する
- isAttachedTo() : bool
- ノードが $doc のツリーに繋がっているか(置き換えで切り離された部分木の中でないか)
- loadHTML() : DOMDocument
- HTMLをDOMDocumentとしてロードする
- loadMedia() : array<string|int, array{path: string, width: string, height: string, permalink: string, icon: string, iconWidth: string, iconHeight: string, extension: string, fileSize: int, imagePermalink: string}>
- htmlに存在するメディア情報を取得する
- promoteToFullFileBlock() : void
- $block(div[data-type="fileBlock"])の a 配下に、fixMediaFiles() が値を 埋める対象となる img/p.caption の箱を補う。既に img を持つ場合は何もしない。
- promoteToFullImageBlock() : void
- $img を管理画面のブロックエディターが「メディアを編集」操作を提供できる 完全な imageBlock 構造(class/data-align/data-width/data-eid/data-no-lightbox/ figure/figcaption)で包み直す
- removeLastEmptyParagraph() : void
- 最後の空の段落を削除する
Constants
FUNCTION_TAG_TOKEN_PREFIX
展開前の機能タグを置き換えるトークン(コメントノードの本文)の接頭辞
private
mixed
FUNCTION_TAG_TOKEN_PREFIX
= 'acms-fn-tag:'
Properties
$authoring
入稿用タグの変換器
protected
AuthoringConverter
$authoring
$functionTags
機能タグの展開ハンドラ
protected
FunctionTagRegistry
$functionTags
$lightboxClass
Lightboxクラス名
protected
string
$lightboxClass
$resizeImageSize
画像リサイズの幅
protected
int
$resizeImageSize
Methods
__construct()
public
__construct([int|null $resizeImageSize = null ][, FunctionTagRegistry|null $functionTags = null ][, AuthoringConverter|null $authoring = null ]) : mixed
Parameters
- $resizeImageSize : int|null = null
- $functionTags : FunctionTagRegistry|null = null
- $authoring : AuthoringConverter|null = null
extractMediaId()
メディアIDを抽出する
public
extractMediaId(string $html) : array<string|int, int>
Parameters
- $html : string
Return values
array<string|int, int>fix()
ブロックエディターのHTMLを修正する
public
fix(string $html[, array{resizeImage?: bool, enableFilterHook?: bool, expandFunctionTag?: bool} $options = [] ]) : string
Parameters
- $html : string
- $options : array{resizeImage?: bool, enableFilterHook?: bool, expandFunctionTag?: bool} = []
-
整形オプション
- resizeImage: メディア画像をリサイズするか(既定 true)
- enableFilterHook: 最終HTMLに filterBlockEditorHtml フックを適用するか(既定 true)
- expandFunctionTag: 機能タグ(埋め込みブロック・HTMLブロック等)を展開するか(既定 true)
Return values
stringfixMediaId()
メディアIDを修正する
public
fixMediaId(string $html, array<int, int> $mediaIdMap) : string
Parameters
- $html : string
- $mediaIdMap : array<int, int>
Return values
stringimportExternalMedia()
本文中の img/fileBlock で data-mid が未設定のノードに、$registerCallback から 得た media_id を設定する(CSV インポート、CMS-7715)
public
importExternalMedia(string $html, callable(string $source): Array $registerCallback, int $entryId) : string
Why not data-mid の設定だけで済ませないか: 管理画面のブロックエディター(Tiptap)は
<figure> を持たない <img> 単体を data-mid 無視のフォールバックとして扱うため、
それだと表示は正しくても「メディアを編集」操作ができなくなる。そのため
promoteToFullImageBlock()/promoteToFullFileBlock() で完全な構造まで組み立て直す。
Parameters
- $html : string
- $registerCallback : callable(string $source): Array
-
失敗時は null を返す
- $entryId : int
-
編集中のエントリーID(imageBlock の data-eid に埋め込む)
Return values
stringapplyHtmlFilterHook()
組み立て済みのブロックエディターHTMLを `filterBlockEditorHtml` フックで調整する
private
applyHtmlFilterHook(string $html, bool $resizeImage) : string
配信URL置換まで終えた最終HTMLを参照渡しでフックに渡し、フック側での書き換え結果を返す。 ショートコードの展開など、最終出力の上書きに利用できる。フックが未登録の場合は $html を そのまま返す。
注意: ページキャッシュ有効時は出力ごとキャッシュされるため、時刻やログイン状態に依存する 動的な展開には向かない(既存のユニット拡張フックと同じ制約)。
Parameters
- $html : string
-
配信URL置換まで終えた最終HTML
- $resizeImage : bool
-
画像リサイズ有効か(フロント描画時 true)
Return values
stringapplyRegisteredMediaId()
$source をコールバックに渡し、得られた media_id を $target の data-mid に設定する
private
applyRegisteredMediaId(DOMElement $target, string $source, callable(string $source): Array $registerCallback) : void
Parameters
- $target : DOMElement
- $source : string
- $registerCallback : callable(string $source): Array
expandFunctionTags()
機能タグを一意なトークンのコメントノードに置き換え、トークンと展開後HTMLの対応を返す
private
expandFunctionTags(DOMXPath $xpath, DOMDocument $doc) : array<string, string>
対応するハンドラが無い data-block-type はそのまま残す。将来追加される型や、 拡張アプリを外した状態の既存コンテンツを取りこぼして消さないため。
展開後HTMLは fix() が getInnerHTML() した直後に文字列として差し戻す。そのため 配信URL置換と filterBlockEditorHtml フックは展開後HTMLにも効くが、DOM を対象とする 後段の処理(最後の空段落の削除・メディア画像/ファイルの書き換え)は及ばない。
Why not DOM へ取り込む: ハンドラの戻り値を libxml で再パースすると、<script> 内の
</div> のような文字列が要素として解釈されて崩れ、@click [attr] のように libxml が
受け付けない属性名が落ちる。編集者が書いたHTMLを加工せず出力するため、DOM を経由させない。
Parameters
- $xpath : DOMXPath
- $doc : DOMDocument
Return values
array<string, string> —コメントノードとして出力されるトークン文字列 => 展開後HTML
extractFunctionTagAttributes()
ハンドラへ渡す機能タグの属性(id / class)を取り出す
private
extractFunctionTagAttributes(DOMElement $tag) : array{id?: string, class?: string}
Why not 全属性をコピー: data-block-* は保存形式の内部情報であり、任意属性を渡すと ハンドラが意図せずそれらを出力して公開HTMLの構造が保存形式に依存してしまうため、 用途が明確な id / class に限る。
Parameters
- $tag : DOMElement
Return values
array{id?: string, class?: string}fixMediaFiles()
メディアファイルの修正
private
fixMediaFiles(DOMXPath $xpath, array<string|int, array{path: string, width: string, height: string, permalink: string, icon: string, iconWidth: string, iconHeight: string, extension: string, fileSize: int, imagePermalink: string}> $mediaList) : void
Parameters
- $xpath : DOMXPath
- $mediaList : array<string|int, array{path: string, width: string, height: string, permalink: string, icon: string, iconWidth: string, iconHeight: string, extension: string, fileSize: int, imagePermalink: string}>
fixMediaImages()
メディア画像の修正
private
fixMediaImages(DOMXPath $xpath, array<string|int, array{path: string, width: string, height: string, permalink: string, icon: string, iconWidth: string, iconHeight: string, extension: string, fileSize: int, imagePermalink: string}> $mediaList[, bool $resize = true ]) : void
Parameters
- $xpath : DOMXPath
- $mediaList : array<string|int, array{path: string, width: string, height: string, permalink: string, icon: string, iconWidth: string, iconHeight: string, extension: string, fileSize: int, imagePermalink: string}>
- $resize : bool = true
getInnerHTML()
DOMDocumentからHTML文字列を取得する
private
getInnerHTML(DOMDocument $doc) : string
Parameters
- $doc : DOMDocument
Return values
stringhasAncestorTag()
$node の祖先に $tagName を持つ要素があるか判定する
private
hasAncestorTag(DOMElement $node, string $tagName) : bool
Parameters
- $node : DOMElement
- $tagName : string
Return values
boolisAttachedTo()
ノードが $doc のツリーに繋がっているか(置き換えで切り離された部分木の中でないか)
private
isAttachedTo(DOMNode $node, DOMDocument $doc) : bool
Parameters
- $node : DOMNode
- $doc : DOMDocument
Return values
boolloadHTML()
HTMLをDOMDocumentとしてロードする
private
loadHTML(string $html) : DOMDocument
Parameters
- $html : string
Return values
DOMDocumentloadMedia()
htmlに存在するメディア情報を取得する
private
loadMedia(DOMXPath $xpath) : array<string|int, array{path: string, width: string, height: string, permalink: string, icon: string, iconWidth: string, iconHeight: string, extension: string, fileSize: int, imagePermalink: string}>
Parameters
- $xpath : DOMXPath
Return values
array<string|int, array{path: string, width: string, height: string, permalink: string, icon: string, iconWidth: string, iconHeight: string, extension: string, fileSize: int, imagePermalink: string}>promoteToFullFileBlock()
$block(div[data-type="fileBlock"])の a 配下に、fixMediaFiles() が値を 埋める対象となる img/p.caption の箱を補う。既に img を持つ場合は何もしない。
private
promoteToFullFileBlock(DOMDocument $doc, DOMElement $block, DOMElement $linkTag) : void
Parameters
- $doc : DOMDocument
- $block : DOMElement
- $linkTag : DOMElement
promoteToFullImageBlock()
$img を管理画面のブロックエディターが「メディアを編集」操作を提供できる 完全な imageBlock 構造(class/data-align/data-width/data-eid/data-no-lightbox/ figure/figcaption)で包み直す
private
promoteToFullImageBlock(DOMDocument $doc, DOMElement $img, int $entryId) : void
既に <figure> の子孫であれば、手書き・既存データ由来の完全な構造とみなして
何もしない(align 等の既存指定を壊さないため)。
Parameters
- $doc : DOMDocument
- $img : DOMElement
- $entryId : int
removeLastEmptyParagraph()
最後の空の段落を削除する
private
removeLastEmptyParagraph(DOMXPath $xpath) : void
ブロックエディターがカーソル配置用に文書末尾へ残すトップレベルの空段落だけを対象にする。
//p で文書全体から探すと、末尾のブロックが group の場合に group 内の要素まで
対象になってしまう(group 内の空段落は group の中身であり、トップレベルの
末尾ダミー段落とは無関係)。loadHTML() が常に /html/body/... の構造で包むため、
body の直下(トップレベル)に絞る。
さらに body 直下の最後のノード(空白のみのテキストを除く)が p のときだけを対象にする。 展開済みの機能タグ(トークンのコメントノード)が末尾にある場合、その手前の空段落は 末尾のダミー段落ではなく編集者が置いた段落であるため残す。 段落の中に機能タグのトークンがある場合も、展開後に実体を持つため空段落として扱わない (通常のコメントだけの段落は従来どおり空とみなす)。
Parameters
- $xpath : DOMXPath