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.editMode
source === "preview"
の場合には view.previewMode
targetEl
は基本的には 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 時点ではまったくトリガーされない。
onHoverLink
Workspace の hover-link
イベントをハンドルする。
defaultMod
が true
なのに Mod
が押されていない場合は、後出しで Mod
を押した場合のためのイベントハンドラを一時的に追加する処理が行われる。
その後、onLinkHover を呼び出す。
onLinkHover
onHoverLink の最後に呼ばれる。
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 行目がハイライトされるはずだ。