onEnable(): コミュニティプラグインでいうところの onload。Setting tab をマウントしたり、onHoverLink/onLinkHover をイベントハンドラとして登録したりしている。disable()->enable() としないと変更が反映されない。(Hover Editor)onLinkHover は link-hover イベントとは無関係に呼ばれるため、onLinkHover だけをパッチした場合には disable()->enable() は必要ない。onHoverLink(): Workspace の `hover-link` イベント をハンドルする。onLinkHover(): 一応 Workspace の link-hover イベントのハンドラとして登録されてはいるのだが、実は link-hover イベントは全くトリガーされておらず、onHoverLink() の中で諸々の条件が揃うと onLinkHover が呼ばれるという実装になっている。hover-link イベントon(name: 'hover-link', callback: (data: HoverLinkInfo) => any, ctx?: any): EventRef;
interface HoverLinkInfo { // 勝手に命名
event: MouseEvent;
source: string;
hoverParent: HoverParent;
targetEl?: HTMLElement;
linktext: string;
sourcePath?: string;
state?: any;
}
event は、この hover-link イベントの原因となった mouseover イベント。source はイベントの発火元の情報を表す ID。以下の表を参照。hoverParent は割となんでもありだが、たとえば view を現在の MarkdownView とすると、source === "editor" の場合には view.editModesource === "preview" の場合には view.previewModetargetEl は基本的には mouseover イベントの currentTarget (addEventListener された人) だが、もし指定しなかった場合には event.document.body になる。linktext/sourcePath については Links を参照。デフォルトでは、 mouseover イベントが以下で発火するとトリガーされる。発火元の情報は source プロパティに格納される。
| 発火元 | source |
|---|---|
| Editing view 中の internal links | editor |
| Reading view 中の internal links | preview |
| Properties 中の internal links | properties |
| Search core plugin の検索結果 | search |
| Backlinks | search |
| Outgoing links | search |
| Graph view のノード | graph |
| Bookmarks | bookmarks |
| File explorer | file-explorer |
link-hover イベント実は、Obsidian v1.4.16 時点ではまったくトリガーされない。
onHoverLinkWorkspace の hover-link イベントをハンドルする。
defaultMod が true なのに Mod が押されていない場合は、後出しで Mod を押した場合のためのイベントハンドラを一時的に追加する処理が行われる。
その後、onLinkHover を呼び出す。
onLinkHoveronHoverLink の最後に呼ばれる。
onLinkHover(hoverParent: HoverParent, targetEl: HTMLElement | null, linktext: string, sourcePath: string, state: any)
hoverParent.hoverPopover が null の場合hoverParent.hoverPopover.state === PopoverState.Hidden の場合 (c.f. PopoverState)hoverParent.hoverPopover.targetEl !== targetEl の場合には、HoverPopover の コンストラクタ が
hoverParent.hoverPopover = new HoverPopover(hoverParent, targetEl);
というふうに呼ばれて hoverParent.hoverPopover にセットされる。
なので、こんな感じでコンソールから呼ぶことができる:
app.internalPlugins.getPluginById('page-preview').instance.onLinkHover({}, null, 'My note', '')
あるいは、先述の通り onLinkHover は link-hover イベントのハンドラとして登録されてはいるので
app.workspace.trigger('link-hover', {}, null, 'Page preview', "")
でも同じ効果がある。
その後、embed の場合とだいたい同様の処理が行われる。
これは Page preview コアプラグインというよりは HoverPopover クラスが担当する部分。
state についてPage preview は linktext を使うので、まだブロック ID が割り当てられていないブロックをターゲットにして preview することはできないように思える。でも実はできてしまう。
Sandbox vault で
app.workspace.trigger('link-hover', {}, null, 'Start Here', "", {scroll: 10})
としてみよう。すると hover popover が現れ、 "Start Here.md" の 10 行目がハイライトされるはずだ。