Page preview
...

  • onEnable(): コミュニティプラグインでいうところの onload。Setting tab をマウントしたり、onHoverLink/onLinkHover をイベントハンドラとして登録したりしている。
    • このため、イベントハンドラをパッチした場合、一度 disable()->enable() としないと変更が反映されない。(Hover Editor)
    • しかし実は onLinkHoverlink-hover イベントとは無関係に呼ばれるため、onLinkHover だけをパッチした場合には disable()->enable() は必要ない。
  • onHoverLink(): Workspace`hover-link` イベント をハンドルする。
  • onLinkHover(): 一応 Workspacelink-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
      になっている(cf. MarkdownView)。
  • targetEl は基本的には mouseover イベントの currentTarget (addEventListener された人) だが、もし指定しなかった場合には event.document.body になる。
  • linktext/sourcePath については Links を参照。

デフォルトでは、 mouseover イベントが以下で発火するとトリガーされる。発火元の情報は source プロパティに格納される。

発火元source
Editing view 中の internal linkseditor
Reading view 中の internal linkspreview
Properties 中の internal linksproperties
Search core plugin の検索結果search
Backlinkssearch
Outgoing linkssearch
Graph view のノードgraph
Bookmarksbookmarks
File explorerfile-explorer

実は、Obsidian v1.4.16 時点ではまったくトリガーされない。

onHoverLink
...

Workspacehover-link イベントをハンドルする。

defaultModtrue なのに Mod が押されていない場合は、後出しで Mod を押した場合のためのイベントハンドラを一時的に追加する処理が行われる。

その後、onLinkHover を呼び出す。

onLinkHover
...

onHoverLink の最後に呼ばれる。

onLinkHover(hoverParent: HoverParent, targetEl: HTMLElement | null, linktext: string, sourcePath: string, state: any)
  • hoverParent.hoverPopovernull の場合
  • hoverParent.hoverPopover.state === PopoverState.Hidden の場合 (c.f. PopoverState)
  • hoverParent.hoverPopover.targetEl !== targetEl の場合
hoverParent.hoverPopover = new HoverPopover(hoverParent, targetEl);

というふうに呼ばれて hoverParent.hoverPopover にセットされる。

Tip

なので、こんな感じでコンソールから呼ぶことができる:

app.internalPlugins.getPluginById('page-preview').instance.onLinkHover({}, null, 'My note', '')

あるいは、先述の通り onLinkHoverlink-hover イベントのハンドラとして登録されてはいるので

app.workspace.trigger('link-hover', {}, null, 'Page preview', "")

でも同じ効果がある。

その後、embed の場合とだいたい同様の処理が行われる。

どうやって hide しているのか?
...

これは 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 行目がハイライトされるはずだ。