@tooee/view 0.11.0 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/dist/components/subviews/markdown-subview.d.ts +3 -1
  2. package/dist/components/subviews/markdown-subview.d.ts.map +1 -1
  3. package/dist/components/subviews/markdown-subview.js +18 -4
  4. package/dist/components/subviews/markdown-subview.js.map +1 -1
  5. package/dist/components/view-screen.d.ts +3 -1
  6. package/dist/components/view-screen.d.ts.map +1 -1
  7. package/dist/components/view-screen.js +2 -2
  8. package/dist/components/view-screen.js.map +1 -1
  9. package/dist/folds/fold-model.d.ts +5 -0
  10. package/dist/folds/fold-model.d.ts.map +1 -1
  11. package/dist/folds/fold-model.js +9 -0
  12. package/dist/folds/fold-model.js.map +1 -1
  13. package/dist/folds/markdown-heading-folds.d.ts +3 -0
  14. package/dist/folds/markdown-heading-folds.d.ts.map +1 -1
  15. package/dist/folds/markdown-heading-folds.js +6 -2
  16. package/dist/folds/markdown-heading-folds.js.map +1 -1
  17. package/dist/folds/use-folds.d.ts +30 -5
  18. package/dist/folds/use-folds.d.ts.map +1 -1
  19. package/dist/folds/use-folds.js +65 -75
  20. package/dist/folds/use-folds.js.map +1 -1
  21. package/dist/launch.d.ts +2 -0
  22. package/dist/launch.d.ts.map +1 -1
  23. package/dist/launch.js.map +1 -1
  24. package/dist/outline/markdown-outline.d.ts +24 -0
  25. package/dist/outline/markdown-outline.d.ts.map +1 -0
  26. package/dist/outline/markdown-outline.js +25 -0
  27. package/dist/outline/markdown-outline.js.map +1 -0
  28. package/dist/outline/outline-panel.d.ts +17 -0
  29. package/dist/outline/outline-panel.d.ts.map +1 -0
  30. package/dist/outline/outline-panel.js +106 -0
  31. package/dist/outline/outline-panel.js.map +1 -0
  32. package/dist/outline/use-outline.d.ts +53 -0
  33. package/dist/outline/use-outline.d.ts.map +1 -0
  34. package/dist/outline/use-outline.js +131 -0
  35. package/dist/outline/use-outline.js.map +1 -0
  36. package/dist/standalone-router.d.ts.map +1 -1
  37. package/dist/standalone-router.js +1 -1
  38. package/dist/standalone-router.js.map +1 -1
  39. package/dist/view.d.ts +3 -1
  40. package/dist/view.d.ts.map +1 -1
  41. package/dist/view.js +2 -2
  42. package/dist/view.js.map +1 -1
  43. package/package.json +14 -13
  44. package/src/components/subviews/markdown-subview.tsx +21 -2
  45. package/src/components/view-screen.tsx +4 -0
  46. package/src/folds/fold-model.ts +14 -0
  47. package/src/folds/markdown-heading-folds.ts +7 -2
  48. package/src/folds/use-folds.ts +95 -81
  49. package/src/launch.tsx +2 -0
  50. package/src/outline/markdown-outline.ts +45 -0
  51. package/src/outline/outline-panel.tsx +171 -0
  52. package/src/outline/use-outline.ts +188 -0
  53. package/src/standalone-router.tsx +1 -0
  54. package/src/view.tsx +4 -0
@@ -6,7 +6,9 @@ interface MarkdownSubviewProps extends SubviewProps {
6
6
  content: MarkdownContent;
7
7
  codeBlockRenderers?: Record<string, CodeBlockRenderer>;
8
8
  onLinkActivate?: MarkdownLinkActivateHandler;
9
+ /** Open the heading outline beside the document at start. */
10
+ outline?: boolean;
9
11
  }
10
- export declare const MarkdownSubview: ({ content, codeBlockRenderers, onLinkActivate, decorations, actions, ...screen }: MarkdownSubviewProps) => ReactNode;
12
+ export declare const MarkdownSubview: ({ content, codeBlockRenderers, onLinkActivate, outline: initialOutline, decorations, actions, ...screen }: MarkdownSubviewProps) => ReactNode;
11
13
  export {};
12
14
  //# sourceMappingURL=markdown-subview.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"markdown-subview.d.ts","sourceRoot":"","sources":["../../../src/components/subviews/markdown-subview.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAa,MAAM,kBAAkB,CAAC;AAGrE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAKvC,OAAO,KAAK,EAAE,eAAe,EAAE,2BAA2B,EAAE,MAAM,gBAAgB,CAAC;AAEnF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,UAAU,oBAAqB,SAAQ,YAAY;IACjD,OAAO,EAAE,eAAe,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IACvD,cAAc,CAAC,EAAE,2BAA2B,CAAC;CAC9C;AAuBD,eAAO,MAAM,eAAe,qFAOzB,oBAAoB,KAAG,SAmFzB,CAAC"}
1
+ {"version":3,"file":"markdown-subview.d.ts","sourceRoot":"","sources":["../../../src/components/subviews/markdown-subview.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAa,MAAM,kBAAkB,CAAC;AAGrE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAOvC,OAAO,KAAK,EAAE,eAAe,EAAE,2BAA2B,EAAE,MAAM,gBAAgB,CAAC;AAEnF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,UAAU,oBAAqB,SAAQ,YAAY;IACjD,OAAO,EAAE,eAAe,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IACvD,cAAc,CAAC,EAAE,2BAA2B,CAAC;IAC7C,6DAA6D;IAC7D,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAuBD,eAAO,MAAM,eAAe,8GAQzB,oBAAoB,KAAG,SAgGzB,CAAC"}
@@ -1,10 +1,13 @@
1
1
  import { jsx as _jsx } from "@opentui/react/jsx-runtime";
2
+ import { useTerminalDimensions } from "@opentui/react";
2
3
  import { useBuildCommandContext, useCommand } from "@tooee/commands";
3
4
  import { MarkdownView, flattenMarkdown, getFlatBlockText } from "@tooee/renderers";
4
5
  import { useMemo, useRef } from "react";
5
6
  import { markdownHeadingFoldRanges } from "../../folds/markdown-heading-folds.js";
6
- import { useFoldCommands, useFoldState } from "../../folds/use-folds.js";
7
+ import { useFoldActions, useFoldCommands, useFoldState } from "../../folds/use-folds.js";
7
8
  import { useContentDocument } from "../../hooks/use-content-document.js";
9
+ import { OutlinePanel } from "../../outline/outline-panel.js";
10
+ import { useMarkdownOutline } from "../../outline/use-outline.js";
8
11
  import { ViewScreen } from "../view-screen.js";
9
12
  /** Columns moved per h/l press when scrolling a wide block horizontally. */
10
13
  const BLOCK_HSCROLL_STEP = 4;
@@ -23,7 +26,7 @@ const markdownBlockAdapter = function markdownBlockAdapter(blocks) {
23
26
  getText: (block) => getFlatBlockText(block),
24
27
  };
25
28
  };
26
- export const MarkdownSubview = function MarkdownSubview({ content, codeBlockRenderers, onLinkActivate, decorations, actions, ...screen }) {
29
+ export const MarkdownSubview = function MarkdownSubview({ content, codeBlockRenderers, onLinkActivate, outline: initialOutline = false, decorations, actions, ...screen }) {
27
30
  const textContent = content.markdown;
28
31
  const lineCount = useMemo(() => textContent.split("\n").length, [textContent]);
29
32
  const blocks = useMemo(() => flattenMarkdown(content.markdown), [content.markdown]);
@@ -40,7 +43,18 @@ export const MarkdownSubview = function MarkdownSubview({ content, codeBlockRend
40
43
  { label: "Lines:", value: String(lineCount) },
41
44
  ],
42
45
  });
43
- useFoldCommands(folds, document.navigation);
46
+ const foldActions = useFoldActions(folds, document.navigation);
47
+ useFoldCommands(folds, foldActions, document.navigation);
48
+ // Declared after the controller, so its jump effect runs after the
49
+ // controller has taken the new rows.
50
+ const outline = useMarkdownOutline({
51
+ blocks,
52
+ folds,
53
+ initialOpen: initialOutline,
54
+ navigation: document.navigation,
55
+ revealRow: document.revealRow,
56
+ });
57
+ const { width: terminalWidth } = useTerminalDimensions();
44
58
  const buildCommandContext = useBuildCommandContext();
45
59
  const handleLinkActivate = onLinkActivate
46
60
  ? (href) => onLinkActivate(href, buildCommandContext())
@@ -75,6 +89,6 @@ export const MarkdownSubview = function MarkdownSubview({ content, codeBlockRend
75
89
  title: "Scroll block right",
76
90
  when: () => cursorScrollable() !== undefined,
77
91
  });
78
- return (_jsx(ViewScreen, { content: content, controller: document, actions: actions, statusItems: statusItems, ...screen, children: _jsx(MarkdownView, { content: content.markdown, blocks: folds.rows, rowNumbers: folds.rowNumbers, foldedBlocks: folds.view.hiddenCounts, showLineNumbers: showLineNumbers, document: document, hScrollableBlocksRef: hScrollableBlocksRef, codeBlockRenderers: codeBlockRenderers, onLinkActivate: handleLinkActivate, imageBasePath: content.imageBasePath }) }));
92
+ return (_jsx(ViewScreen, { content: content, controller: document, actions: actions, statusItems: statusItems, aside: _jsx(OutlinePanel, { outline: outline, foldActions: foldActions }), ...screen, children: _jsx(MarkdownView, { content: content.markdown, blocks: folds.rows, rowNumbers: folds.rowNumbers, foldedBlocks: folds.view.hiddenCounts, showLineNumbers: showLineNumbers, document: document, hScrollableBlocksRef: hScrollableBlocksRef, codeBlockRenderers: codeBlockRenderers, onLinkActivate: handleLinkActivate, imageBasePath: content.imageBasePath, width: outline.visible ? terminalWidth - outline.width : undefined }) }));
79
93
  };
80
94
  //# sourceMappingURL=markdown-subview.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"markdown-subview.js","sourceRoot":"","sources":["../../../src/components/subviews/markdown-subview.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"markdown-subview.js","sourceRoot":"","sources":["../../../src/components/subviews/markdown-subview.tsx"],"names":[],"mappings":"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"}
@@ -17,6 +17,8 @@ export interface ViewScreenProps<T> {
17
17
  setMarkSet: (set: MarkSet) => void;
18
18
  clearMarkNamespace: (namespace: string) => void;
19
19
  clearAllUserMarks: () => void;
20
+ /** Optional side region beside the content, such as the Markdown outline. */
21
+ aside?: ReactNode;
20
22
  children: ReactNode;
21
23
  }
22
24
  /**
@@ -24,5 +26,5 @@ export interface ViewScreenProps<T> {
24
26
  * (theme/quit commands, actions, `ctx.document`, layout, standard status) plus
25
27
  * the content-only `ctx.view` slice that viewers contribute on top.
26
28
  */
27
- export declare const ViewScreen: <T>({ content, controller, streaming, actions, statusItems, reload, providerMarks, userMarks, setMarkSet, clearMarkNamespace, clearAllUserMarks, children, }: ViewScreenProps<T>) => ReactNode;
29
+ export declare const ViewScreen: <T>({ content, controller, streaming, actions, statusItems, reload, providerMarks, userMarks, setMarkSet, clearMarkNamespace, clearAllUserMarks, aside, children, }: ViewScreenProps<T>) => ReactNode;
28
30
  //# sourceMappingURL=view-screen.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"view-screen.d.ts","sourceRoot":"","sources":["../../src/components/view-screen.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,WAAW,eAAe,CAAC,CAAC;IAChC,OAAO,EAAE,UAAU,CAAC;IACpB,UAAU,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAC;IAClC,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC7B,6EAA6E;IAC7E,WAAW,CAAC,EAAE,aAAa,EAAE,CAAC;IAC9B,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,aAAa,EAAE,OAAO,EAAE,CAAC;IACzB,SAAS,EAAE,OAAO,EAAE,CAAC;IACrB,UAAU,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,kBAAkB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,iBAAiB,EAAE,MAAM,IAAI,CAAC;IAC9B,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED;;;;GAIG;AACH,eAAO,MAAM,UAAU,GAAuB,CAAC,4JAa5C,eAAe,CAAC,CAAC,CAAC,KAAG,SAiCvB,CAAC"}
1
+ {"version":3,"file":"view-screen.d.ts","sourceRoot":"","sources":["../../src/components/view-screen.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,WAAW,eAAe,CAAC,CAAC;IAChC,OAAO,EAAE,UAAU,CAAC;IACpB,UAAU,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAC;IAClC,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC7B,6EAA6E;IAC7E,WAAW,CAAC,EAAE,aAAa,EAAE,CAAC;IAC9B,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,aAAa,EAAE,OAAO,EAAE,CAAC;IACzB,SAAS,EAAE,OAAO,EAAE,CAAC;IACrB,UAAU,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,kBAAkB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,iBAAiB,EAAE,MAAM,IAAI,CAAC;IAC9B,6EAA6E;IAC7E,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED;;;;GAIG;AACH,eAAO,MAAM,UAAU,GAAuB,CAAC,mKAc5C,eAAe,CAAC,CAAC,CAAC,KAAG,SAkCvB,CAAC"}
@@ -6,7 +6,7 @@ import { useProvideViewCommandContext } from "../hooks/use-view-command-context.
6
6
  * (theme/quit commands, actions, `ctx.document`, layout, standard status) plus
7
7
  * the content-only `ctx.view` slice that viewers contribute on top.
8
8
  */
9
- export const ViewScreen = function ViewScreen({ content, controller, streaming, actions, statusItems, reload, providerMarks, userMarks, setMarkSet, clearMarkNamespace, clearAllUserMarks, children, }) {
9
+ export const ViewScreen = function ViewScreen({ content, controller, streaming, actions, statusItems, reload, providerMarks, userMarks, setMarkSet, clearMarkNamespace, clearAllUserMarks, aside, children, }) {
10
10
  useProvideViewCommandContext({
11
11
  content,
12
12
  marks: {
@@ -24,6 +24,6 @@ export const ViewScreen = function ViewScreen({ content, controller, streaming,
24
24
  ];
25
25
  return (_jsx(DocumentScreen, { controller: controller, titleBar: content.title !== undefined && content.title !== ""
26
26
  ? { subtitle: content.format, title: content.title }
27
- : { title: content.format }, statusItems: items, actions: actions, context: { kind: content.format, reload, title: content.title }, children: children }));
27
+ : { title: content.format }, statusItems: items, actions: actions, context: { kind: content.format, reload, title: content.title }, aside: aside, children: children }));
28
28
  };
29
29
  //# sourceMappingURL=view-screen.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"view-screen.js","sourceRoot":"","sources":["../../src/components/view-screen.tsx"],"names":[],"mappings":";AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAI9C,OAAO,EAAE,4BAA4B,EAAE,MAAM,sCAAsC,CAAC;AAmBpF;;;;GAIG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,SAAS,UAAU,CAAI,EAC/C,OAAO,EACP,UAAU,EACV,SAAS,EACT,OAAO,EACP,WAAW,EACX,MAAM,EACN,aAAa,EACb,SAAS,EACT,UAAU,EACV,kBAAkB,EAClB,iBAAiB,EACjB,QAAQ,GACW;IACnB,4BAA4B,CAAC;QAC3B,OAAO;QACP,KAAK,EAAE;YACL,QAAQ,EAAE,iBAAiB;YAC3B,cAAc,EAAE,kBAAkB;YAClC,aAAa;YACb,UAAU;YACV,SAAS;SACV;QACD,MAAM;KACP,CAAC,CAAC;IAEH,MAAM,KAAK,GAAoB;QAC7B,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC;QACtB,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KACjE,CAAC;IAEF,OAAO,CACL,KAAC,cAAc,IACb,UAAU,EAAE,UAAU,EACtB,QAAQ,EACN,OAAO,CAAC,KAAK,KAAK,SAAS,IAAI,OAAO,CAAC,KAAK,KAAK,EAAE;YACjD,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE;YACpD,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,EAE/B,WAAW,EAAE,KAAK,EAClB,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,YAE9D,QAAQ,GACM,CAClB,CAAC;AACJ,CAAC,CAAC"}
1
+ {"version":3,"file":"view-screen.js","sourceRoot":"","sources":["../../src/components/view-screen.tsx"],"names":[],"mappings":";AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAI9C,OAAO,EAAE,4BAA4B,EAAE,MAAM,sCAAsC,CAAC;AAqBpF;;;;GAIG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,SAAS,UAAU,CAAI,EAC/C,OAAO,EACP,UAAU,EACV,SAAS,EACT,OAAO,EACP,WAAW,EACX,MAAM,EACN,aAAa,EACb,SAAS,EACT,UAAU,EACV,kBAAkB,EAClB,iBAAiB,EACjB,KAAK,EACL,QAAQ,GACW;IACnB,4BAA4B,CAAC;QAC3B,OAAO;QACP,KAAK,EAAE;YACL,QAAQ,EAAE,iBAAiB;YAC3B,cAAc,EAAE,kBAAkB;YAClC,aAAa;YACb,UAAU;YACV,SAAS;SACV;QACD,MAAM;KACP,CAAC,CAAC;IAEH,MAAM,KAAK,GAAoB;QAC7B,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC;QACtB,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KACjE,CAAC;IAEF,OAAO,CACL,KAAC,cAAc,IACb,UAAU,EAAE,UAAU,EACtB,QAAQ,EACN,OAAO,CAAC,KAAK,KAAK,SAAS,IAAI,OAAO,CAAC,KAAK,KAAK,EAAE;YACjD,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE;YACpD,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,EAE/B,WAAW,EAAE,KAAK,EAClB,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,EAC/D,KAAK,EAAE,KAAK,YAEX,QAAQ,GACM,CAClB,CAAC;AACJ,CAAC,CAAC"}
@@ -27,6 +27,11 @@ export interface FoldView {
27
27
  export declare const computeFoldView: (rowCount: number, ranges: readonly FoldRange[], closedKeys: ReadonlySet<Key>) => FoldView;
28
28
  /** Ranges that contain `row` (header included), innermost first. */
29
29
  export declare const foldsAt: (ranges: readonly FoldRange[], row: number) => readonly FoldRange[];
30
+ /**
31
+ * Keys of the closed ranges that hide `row`: closed ranges whose body
32
+ * (`start + 1 ..= end`) contains it. Opening them all makes `row` visible.
33
+ */
34
+ export declare const closedFoldsHiding: (ranges: readonly FoldRange[], closedKeys: ReadonlySet<Key>, row: number) => Key[];
30
35
  /**
31
36
  * The full-array row the cursor should rest on once `view` applies: `row`
32
37
  * itself when it stays visible, otherwise the nearest visible row before it,
@@ -1 +1 @@
1
- {"version":3,"file":"fold-model.d.ts","sourceRoot":"","sources":["../../src/folds/fold-model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAEjC;;;;;GAKG;AACH,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,GAAG,CAAC;IACT,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED,8EAA8E;AAC9E,MAAM,WAAW,QAAQ;IACvB,sDAAsD;IACtD,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,iFAAiF;IACjF,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,oFAAoF;IACpF,YAAY,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC3C;AAED;;;;GAIG;AACH,eAAO,MAAM,eAAe,aAChB,MAAM,UACR,SAAS,SAAS,EAAE,cAChB,WAAW,CAAC,GAAG,CAAC,KAC3B,QA2BF,CAAC;AAEF,oEAAoE;AACpE,eAAO,MAAM,OAAO,WACV,SAAS,SAAS,EAAE,OACvB,MAAM,KACV,SAAS,SAAS,EAIpB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,SAAmC,QAAQ,OAAO,MAAM,KAAG,MAOvF,CAAC"}
1
+ {"version":3,"file":"fold-model.d.ts","sourceRoot":"","sources":["../../src/folds/fold-model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAEjC;;;;;GAKG;AACH,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,GAAG,CAAC;IACT,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED,8EAA8E;AAC9E,MAAM,WAAW,QAAQ;IACvB,sDAAsD;IACtD,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,iFAAiF;IACjF,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,oFAAoF;IACpF,YAAY,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC3C;AAED;;;;GAIG;AACH,eAAO,MAAM,eAAe,aAChB,MAAM,UACR,SAAS,SAAS,EAAE,cAChB,WAAW,CAAC,GAAG,CAAC,KAC3B,QA2BF,CAAC;AAEF,oEAAoE;AACpE,eAAO,MAAM,OAAO,WACV,SAAS,SAAS,EAAE,OACvB,MAAM,KACV,SAAS,SAAS,EAIpB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,WACpB,SAAS,SAAS,EAAE,cAChB,WAAW,CAAC,GAAG,CAAC,OACvB,MAAM,KACV,GAAG,EAIL,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,SAAmC,QAAQ,OAAO,MAAM,KAAG,MAOvF,CAAC"}
@@ -35,6 +35,15 @@ export const foldsAt = function foldsAt(ranges, row) {
35
35
  .filter((range) => range.end > range.start && range.start <= row && row <= range.end)
36
36
  .toSorted((left, right) => right.start - left.start || left.end - right.end);
37
37
  };
38
+ /**
39
+ * Keys of the closed ranges that hide `row`: closed ranges whose body
40
+ * (`start + 1 ..= end`) contains it. Opening them all makes `row` visible.
41
+ */
42
+ export const closedFoldsHiding = function closedFoldsHiding(ranges, closedKeys, row) {
43
+ return ranges
44
+ .filter((range) => closedKeys.has(range.key) && range.start < row && row <= range.end)
45
+ .map((range) => range.key);
46
+ };
38
47
  /**
39
48
  * The full-array row the cursor should rest on once `view` applies: `row`
40
49
  * itself when it stays visible, otherwise the nearest visible row before it,
@@ -1 +1 @@
1
- {"version":3,"file":"fold-model.js","sourceRoot":"","sources":["../../src/folds/fold-model.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fold-model.js","sourceRoot":"","sources":["../../src/folds/fold-model.ts"],"names":[],"mappings":"AAwBA;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,SAAS,eAAe,CACrD,QAAgB,EAChB,MAA4B,EAC5B,UAA4B;IAE5B,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC7C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,KAAK,IAAI,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YACzD,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7F,CAAC;IACH,CAAC;IAED,MAAM,eAAe,GAAa,EAAE,CAAC;IACrC,MAAM,eAAe,GAAa,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7E,MAAM,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC/C,IAAI,WAAW,GAAG,CAAC,CAAC,CAAC;IACrB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,QAAQ,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACjD,IAAI,KAAK,IAAI,WAAW,EAAE,CAAC;YACzB,SAAS;QACX,CAAC;QACD,MAAM,YAAY,GAAG,eAAe,CAAC,MAAM,CAAC;QAC5C,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5B,eAAe,CAAC,KAAK,CAAC,GAAG,YAAY,CAAC;QACtC,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAClC,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC;YAC1C,YAAY,CAAC,GAAG,CAAC,YAAY,EAAE,WAAW,GAAG,KAAK,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAED,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,CAAC;AAC5D,CAAC,CAAC;AAEF,oEAAoE;AACpE,MAAM,CAAC,MAAM,OAAO,GAAG,SAAS,OAAO,CACrC,MAA4B,EAC5B,GAAW;IAEX,OAAO,MAAM;SACV,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,IAAI,GAAG,IAAI,GAAG,IAAI,KAAK,CAAC,GAAG,CAAC;SACpF,QAAQ,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;AACjF,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,SAAS,iBAAiB,CACzD,MAA4B,EAC5B,UAA4B,EAC5B,GAAW;IAEX,OAAO,MAAM;SACV,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK,GAAG,GAAG,IAAI,GAAG,IAAI,KAAK,CAAC,GAAG,CAAC;SACrF,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAC/B,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,SAAS,gBAAgB,CAAC,IAAc,EAAE,GAAW;IACnF,KAAK,IAAI,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACxF,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YAC/C,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC,CAAC"}
@@ -1,5 +1,8 @@
1
1
  import type { FlatBlock } from "@tooee/renderers";
2
+ import type { Tokens } from "marked";
2
3
  import type { FoldRange } from "./fold-model.js";
4
+ /** The Marked heading token of a flattened block, or `null` when the block is not a heading. */
5
+ export declare const headingToken: (block: FlatBlock) => Tokens.Heading | null;
3
6
  /**
4
7
  * Heading fold ranges over flattened Markdown blocks. A heading at depth `d`
5
8
  * folds every following block up to the next heading of depth `d` or less, or
@@ -1 +1 @@
1
- {"version":3,"file":"markdown-heading-folds.d.ts","sourceRoot":"","sources":["../../src/folds/markdown-heading-folds.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAGlD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAWjD;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,WAC5B,SAAS,SAAS,EAAE,KAC3B,SAAS,EA2BX,CAAC"}
1
+ {"version":3,"file":"markdown-heading-folds.d.ts","sourceRoot":"","sources":["../../src/folds/markdown-heading-folds.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAErC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,gGAAgG;AAChG,eAAO,MAAM,YAAY,UAAgC,SAAS,KAAG,MAAM,CAAC,OAAO,GAAG,IAOrF,CAAC;AAMF;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,WAC5B,SAAS,SAAS,EAAE,KAC3B,SAAS,EA2BX,CAAC"}
@@ -1,10 +1,14 @@
1
- const headingDepth = function headingDepth(block) {
1
+ /** The Marked heading token of a flattened block, or `null` when the block is not a heading. */
2
+ export const headingToken = function headingToken(block) {
2
3
  if (block.token.type !== "heading") {
3
4
  return null;
4
5
  }
5
6
  // SAFETY: Marked creates a Heading token for the checked "heading" discriminator.
6
7
  // oxlint-disable-next-line typescript/no-unsafe-type-assertion -- Marked's Generic fallback prevents discriminator narrowing
7
- return block.token.depth;
8
+ return block.token;
9
+ };
10
+ const headingDepth = function headingDepth(block) {
11
+ return headingToken(block)?.depth ?? null;
8
12
  };
9
13
  /**
10
14
  * Heading fold ranges over flattened Markdown blocks. A heading at depth `d`
@@ -1 +1 @@
1
- {"version":3,"file":"markdown-heading-folds.js","sourceRoot":"","sources":["../../src/folds/markdown-heading-folds.ts"],"names":[],"mappings":"AAKA,MAAM,YAAY,GAAG,SAAS,YAAY,CAAC,KAAgB;IACzD,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,kFAAkF;IAClF,6HAA6H;IAC7H,OAAQ,KAAK,CAAC,KAAwB,CAAC,KAAK,CAAC;AAC/C,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,SAAS,yBAAyB,CACzE,MAA4B;IAE5B,MAAM,MAAM,GAAgB,EAAE,CAAC;IAC/B,MAAM,IAAI,GAAuC,EAAE,CAAC;IACpD,MAAM,KAAK,GAAG,CAAC,KAAa,EAAE,GAAW,EAAE,EAAE;QAC3C,IAAI,GAAG,GAAG,KAAK,EAAE,CAAC;YAChB,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC,CAAC;IAEF,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;QAC9C,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QAClC,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnB,SAAS;QACX,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC;YAC7D,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC5B,IAAI,QAAQ,EAAE,CAAC;gBACb,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IACrC,CAAC;IACD,KAAK,MAAM,QAAQ,IAAI,IAAI,EAAE,CAAC;QAC5B,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;AACpE,CAAC,CAAC"}
1
+ {"version":3,"file":"markdown-heading-folds.js","sourceRoot":"","sources":["../../src/folds/markdown-heading-folds.ts"],"names":[],"mappings":"AAKA,gGAAgG;AAChG,MAAM,CAAC,MAAM,YAAY,GAAG,SAAS,YAAY,CAAC,KAAgB;IAChE,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,kFAAkF;IAClF,6HAA6H;IAC7H,OAAO,KAAK,CAAC,KAAuB,CAAC;AACvC,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,SAAS,YAAY,CAAC,KAAgB;IACzD,OAAO,YAAY,CAAC,KAAK,CAAC,EAAE,KAAK,IAAI,IAAI,CAAC;AAC5C,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,SAAS,yBAAyB,CACzE,MAA4B;IAE5B,MAAM,MAAM,GAAgB,EAAE,CAAC;IAC/B,MAAM,IAAI,GAAuC,EAAE,CAAC;IACpD,MAAM,KAAK,GAAG,CAAC,KAAa,EAAE,GAAW,EAAE,EAAE;QAC3C,IAAI,GAAG,GAAG,KAAK,EAAE,CAAC;YAChB,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC,CAAC;IAEF,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;QAC9C,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QAClC,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnB,SAAS;QACX,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC;YAC7D,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC5B,IAAI,QAAQ,EAAE,CAAC;gBACb,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IACrC,CAAC;IACD,KAAK,MAAM,QAAQ,IAAI,IAAI,EAAE,CAAC;QAC5B,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;AACpE,CAAC,CAAC"}
@@ -1,3 +1,4 @@
1
+ import type { ActionDefinition } from "@tooee/commands";
1
2
  import type { DecorationLayer } from "@tooee/renderers";
2
3
  import type { NavigationState } from "@tooee/shell";
3
4
  import type { Key } from "react";
@@ -24,11 +25,35 @@ export interface FoldState<T> {
24
25
  * through unchanged.
25
26
  */
26
27
  export declare const useFoldState: <T>(rows: readonly T[], ranges: readonly FoldRange[], decorations: DecorationLayer[]) => FoldState<T>;
28
+ /** Fold operations. Row arguments are full-array row indices. */
29
+ export interface FoldActions {
30
+ /** Toggle the innermost fold that contains `row`. Returns false when no fold contains it. */
31
+ toggle: (row: number) => boolean;
32
+ /** Close the innermost open fold that contains `row`. Returns false when there is none. */
33
+ close: (row: number) => boolean;
34
+ /** Open the innermost closed fold that contains `row`. Returns false when there is none. */
35
+ open: (row: number) => boolean;
36
+ /** Open a fold at `row` when one is closed, else close the innermost open fold. */
37
+ toggleBlock: (row: number) => boolean;
38
+ closeAll: () => void;
39
+ openAll: () => void;
40
+ }
41
+ /**
42
+ * Fold operations over a fold state. Any change that hides the document
43
+ * cursor row first moves the cursor to the header of the outermost closed
44
+ * fold that hides it, and key preservation keeps it there. This holds for
45
+ * every target row, so a fold closed from the outline also keeps the cursor
46
+ * visible.
47
+ */
48
+ export declare const useFoldActions: <T>(folds: FoldState<T>, navigation: Pick<NavigationState, "cursor" | "setCursor">) => FoldActions;
27
49
  /**
28
- * Register the Vim fold commands (`z a`, `z c`, `z o`, `z shift+m`,
29
- * `z shift+r`) against a fold state and the controller's navigation. When a
30
- * close hides the cursor row, the cursor moves first to the header of the
31
- * outermost closed fold, and key preservation keeps it there.
50
+ * The Vim fold commands (`z a`, `z c`, `z o`, `z z`, `z shift+m`,
51
+ * `z shift+r`) as action definitions. The row commands act on `targetRow()`:
52
+ * the document cursor row on the root surface, or the selected heading in the
53
+ * outline. `idPrefix` keeps the ids apart on each surface, and `noFoldMessage`
54
+ * is the warning when no fold contains the target row.
32
55
  */
33
- export declare const useFoldCommands: <T>(folds: FoldState<T>, navigation: Pick<NavigationState, "cursor" | "setCursor">) => void;
56
+ export declare const foldActionDefinitions: (actions: FoldActions, targetRow: () => number | undefined, idPrefix: string, noFoldMessage: string) => ActionDefinition[];
57
+ /** Register the fold commands on the current surface, acting on the document cursor row. */
58
+ export declare const useFoldCommands: <T>(folds: FoldState<T>, actions: FoldActions, navigation: Pick<NavigationState, "cursor">) => void;
34
59
  //# sourceMappingURL=use-folds.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-folds.d.ts","sourceRoot":"","sources":["../../src/folds/use-folds.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEpD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAIjC,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAI3D,+EAA+E;AAC/E,MAAM,WAAW,SAAS,CAAC,CAAC;IAC1B,qFAAqF;IACrF,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC;IACnB,gCAAgC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,SAAS,SAAS,EAAE,CAAC;IAC7B,IAAI,EAAE,QAAQ,CAAC;IACf,UAAU,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC;IAC7B,aAAa,EAAE,CAAC,IAAI,EAAE,WAAW,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC;IAChD,kEAAkE;IAClE,WAAW,EAAE,eAAe,EAAE,CAAC;IAC/B,mGAAmG;IACnG,UAAU,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;CAC3C;AAED;;;;;GAKG;AACH,eAAO,MAAM,YAAY,GAAyB,CAAC,QAC3C,SAAS,CAAC,EAAE,UACV,SAAS,SAAS,EAAE,eACf,eAAe,EAAE,KAC7B,SAAS,CAAC,CAAC,CAqCb,CAAC;AAMF;;;;;GAKG;AACH,eAAO,MAAM,eAAe,GAA4B,CAAC,SAChD,SAAS,CAAC,CAAC,CAAC,cACP,IAAI,CAAC,eAAe,EAAE,QAAQ,GAAG,WAAW,CAAC,KACxD,IAiGF,CAAC"}
1
+ {"version":3,"file":"use-folds.d.ts","sourceRoot":"","sources":["../../src/folds/use-folds.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAkC,MAAM,iBAAiB,CAAC;AACxF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEpD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAIjC,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAI3D,+EAA+E;AAC/E,MAAM,WAAW,SAAS,CAAC,CAAC;IAC1B,qFAAqF;IACrF,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC;IACnB,gCAAgC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,SAAS,SAAS,EAAE,CAAC;IAC7B,IAAI,EAAE,QAAQ,CAAC;IACf,UAAU,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC;IAC7B,aAAa,EAAE,CAAC,IAAI,EAAE,WAAW,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC;IAChD,kEAAkE;IAClE,WAAW,EAAE,eAAe,EAAE,CAAC;IAC/B,mGAAmG;IACnG,UAAU,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;CAC3C;AAED;;;;;GAKG;AACH,eAAO,MAAM,YAAY,GAAyB,CAAC,QAC3C,SAAS,CAAC,EAAE,UACV,SAAS,SAAS,EAAE,eACf,eAAe,EAAE,KAC7B,SAAS,CAAC,CAAC,CAqCb,CAAC;AAEF,iEAAiE;AACjE,MAAM,WAAW,WAAW;IAC1B,6FAA6F;IAC7F,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;IACjC,2FAA2F;IAC3F,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;IAChC,4FAA4F;IAC5F,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;IAC/B,mFAAmF;IACnF,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;IACtC,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,GAA2B,CAAC,SAC9C,SAAS,CAAC,CAAC,CAAC,cACP,IAAI,CAAC,eAAe,EAAE,QAAQ,GAAG,WAAW,CAAC,KACxD,WAiDF,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,YACvB,WAAW,aACT,MAAM,MAAM,GAAG,SAAS,YACzB,MAAM,iBACD,MAAM,KACpB,gBAAgB,EAyBlB,CAAC;AAEF,4FAA4F;AAC5F,eAAO,MAAM,eAAe,GAA4B,CAAC,SAChD,SAAS,CAAC,CAAC,CAAC,WACV,WAAW,cACR,IAAI,CAAC,eAAe,EAAE,QAAQ,CAAC,KAC1C,IAKF,CAAC"}
@@ -1,4 +1,4 @@
1
- import { useCommand, useCommandGroup } from "@tooee/commands";
1
+ import { useActions, useCommandGroup } from "@tooee/commands";
2
2
  import { useMemo, useState } from "react";
3
3
  import { projectDecorationLayers } from "./fold-decorations.js";
4
4
  import { computeFoldView, foldsAt, visibleAnchorRow } from "./fold-model.js";
@@ -32,31 +32,31 @@ export const useFoldState = function useFoldState(rows, ranges, decorations) {
32
32
  view,
33
33
  };
34
34
  };
35
- const warnNoFold = function warnNoFold(ctx) {
36
- ctx.toast?.toast({ level: "warning", message: "No fold at cursor" });
37
- };
38
35
  /**
39
- * Register the Vim fold commands (`z a`, `z c`, `z o`, `z shift+m`,
40
- * `z shift+r`) against a fold state and the controller's navigation. When a
41
- * close hides the cursor row, the cursor moves first to the header of the
42
- * outermost closed fold, and key preservation keeps it there.
36
+ * Fold operations over a fold state. Any change that hides the document
37
+ * cursor row first moves the cursor to the header of the outermost closed
38
+ * fold that hides it, and key preservation keeps it there. This holds for
39
+ * every target row, so a fold closed from the outline also keeps the cursor
40
+ * visible.
43
41
  */
44
- export const useFoldCommands = function useFoldCommands(folds, navigation) {
42
+ export const useFoldActions = function useFoldActions(folds, navigation) {
45
43
  const { closedKeys, ranges, rowCount, setClosedKeys, view } = folds;
46
44
  const { cursor, setCursor } = navigation;
47
- const sourceRow = cursor === null ? undefined : view.visibleToSource[cursor];
48
- const atCursor = sourceRow === undefined ? [] : foldsAt(ranges, sourceRow);
45
+ const cursorRow = cursor === null ? undefined : view.visibleToSource[cursor];
49
46
  const apply = (next) => {
50
- if (sourceRow !== undefined) {
51
- const anchor = visibleAnchorRow(computeFoldView(rowCount, ranges, next), sourceRow);
47
+ if (cursorRow !== undefined) {
48
+ const anchor = visibleAnchorRow(computeFoldView(rowCount, ranges, next), cursorRow);
52
49
  const anchorIndex = view.sourceToVisible[anchor] ?? -1;
53
- if (anchor !== sourceRow && anchorIndex !== -1) {
50
+ if (anchor !== cursorRow && anchorIndex !== -1) {
54
51
  setCursor(anchorIndex);
55
52
  }
56
53
  }
57
54
  setClosedKeys(next);
58
55
  };
59
56
  const withKey = (key, closed) => {
57
+ if (key === undefined) {
58
+ return false;
59
+ }
60
60
  const next = new Set(closedKeys);
61
61
  if (closed) {
62
62
  next.add(key);
@@ -65,72 +65,62 @@ export const useFoldCommands = function useFoldCommands(folds, navigation) {
65
65
  next.delete(key);
66
66
  }
67
67
  apply(next);
68
+ return true;
68
69
  };
69
- useCommandGroup({ id: "fold", prefix: "z", title: "Fold" });
70
- useCommand({
71
- category: "Fold",
72
- handler: (ctx) => {
73
- const [innermost] = atCursor;
74
- if (innermost === undefined) {
75
- warnNoFold(ctx);
76
- return;
77
- }
78
- withKey(innermost.key, !closedKeys.has(innermost.key));
79
- },
80
- hotkey: "z a",
81
- id: "fold.toggle",
82
- modes: ["cursor"],
83
- title: "Toggle fold",
84
- });
85
- useCommand({
86
- category: "Fold",
87
- handler: (ctx) => {
88
- const target = atCursor.find((range) => !closedKeys.has(range.key));
89
- if (target === undefined) {
90
- warnNoFold(ctx);
91
- return;
92
- }
93
- withKey(target.key, true);
94
- },
95
- hotkey: "z c",
96
- id: "fold.close",
97
- modes: ["cursor"],
98
- title: "Close fold",
99
- });
100
- useCommand({
101
- category: "Fold",
102
- handler: (ctx) => {
103
- const target = atCursor.find((range) => closedKeys.has(range.key));
104
- if (target === undefined) {
105
- warnNoFold(ctx);
106
- return;
107
- }
108
- withKey(target.key, false);
109
- },
110
- hotkey: "z o",
111
- id: "fold.open",
112
- modes: ["cursor"],
113
- title: "Open fold",
114
- });
115
- useCommand({
116
- category: "Fold",
117
- handler: () => {
70
+ const close = (row) => withKey(foldsAt(ranges, row).find((range) => !closedKeys.has(range.key))?.key, true);
71
+ const open = (row) => withKey(foldsAt(ranges, row).find((range) => closedKeys.has(range.key))?.key, false);
72
+ return {
73
+ close,
74
+ closeAll: () => {
118
75
  apply(new Set(ranges.map((range) => range.key)));
119
76
  },
120
- hotkey: "z shift+m",
121
- id: "fold.close-all",
122
- modes: ["cursor"],
123
- title: "Close all folds",
124
- });
125
- useCommand({
126
- category: "Fold",
127
- handler: () => {
77
+ open,
78
+ openAll: () => {
128
79
  apply(EMPTY_KEYS);
129
80
  },
130
- hotkey: "z shift+r",
131
- id: "fold.open-all",
81
+ toggle: (row) => {
82
+ const [innermost] = foldsAt(ranges, row);
83
+ return withKey(innermost?.key, innermost !== undefined && !closedKeys.has(innermost.key));
84
+ },
85
+ toggleBlock: (row) => foldsAt(ranges, row).some((range) => closedKeys.has(range.key)) ? open(row) : close(row),
86
+ };
87
+ };
88
+ /**
89
+ * The Vim fold commands (`z a`, `z c`, `z o`, `z z`, `z shift+m`,
90
+ * `z shift+r`) as action definitions. The row commands act on `targetRow()`:
91
+ * the document cursor row on the root surface, or the selected heading in the
92
+ * outline. `idPrefix` keeps the ids apart on each surface, and `noFoldMessage`
93
+ * is the warning when no fold contains the target row.
94
+ */
95
+ export const foldActionDefinitions = function foldActionDefinitions(actions, targetRow, idPrefix, noFoldMessage) {
96
+ const atTarget = (run) => (ctx) => {
97
+ const row = targetRow();
98
+ if (row === undefined || !run(row)) {
99
+ ctx.toast?.toast({ level: "warning", message: noFoldMessage });
100
+ }
101
+ };
102
+ const definitions = [
103
+ ["z a", "toggle", "Toggle fold", atTarget(actions.toggle)],
104
+ ["z c", "close", "Close fold", atTarget(actions.close)],
105
+ ["z o", "open", "Open fold", atTarget(actions.open)],
106
+ ["z z", "toggle-block", "Open or close fold", atTarget(actions.toggleBlock)],
107
+ ["z shift+m", "close-all", "Close all folds", actions.closeAll],
108
+ ["z shift+r", "open-all", "Open all folds", actions.openAll],
109
+ ];
110
+ return definitions.map(([hotkey, id, title, handler]) => ({
111
+ category: "Fold",
112
+ handler,
113
+ hotkey,
114
+ id: `${idPrefix}.${id}`,
132
115
  modes: ["cursor"],
133
- title: "Open all folds",
134
- });
116
+ title,
117
+ }));
118
+ };
119
+ /** Register the fold commands on the current surface, acting on the document cursor row. */
120
+ export const useFoldCommands = function useFoldCommands(folds, actions, navigation) {
121
+ const { cursor } = navigation;
122
+ const cursorRow = cursor === null ? undefined : folds.view.visibleToSource[cursor];
123
+ useCommandGroup({ id: "fold", prefix: "z", title: "Fold" });
124
+ useActions(foldActionDefinitions(actions, () => cursorRow, "fold", "No fold at cursor"));
135
125
  };
136
126
  //# sourceMappingURL=use-folds.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-folds.js","sourceRoot":"","sources":["../../src/folds/use-folds.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"use-folds.js","sourceRoot":"","sources":["../../src/folds/use-folds.ts"],"names":[],"mappings":"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"}
package/dist/launch.d.ts CHANGED
@@ -16,6 +16,8 @@ export interface ViewLaunchOptions {
16
16
  * Unmatched types fall back to the default syntax-highlighted code block.
17
17
  */
18
18
  codeBlockRenderers?: Record<string, CodeBlockRenderer>;
19
+ /** Open the heading outline beside Markdown content at start. */
20
+ outline?: boolean;
19
21
  }
20
22
  export interface DirectoryLaunchOptions {
21
23
  dirPath: string;
@@ -1 +1 @@
1
- {"version":3,"file":"launch.d.ts","sourceRoot":"","sources":["../src/launch.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAM1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEnE,MAAM,WAAW,iBAAiB;IAChC,eAAe,EAAE,eAAe,CAAC;IACjC,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+DAA+D;IAC/D,YAAY,CAAC,EAAE,SAAS,WAAW,EAAE,CAAC;IACtC,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAC5C;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;CACxD;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAC;CAC9B;AAED,eAAO,MAAM,MAAM,YAAkC,iBAAiB,KAAG,OAAO,CAAC,IAAI,CAiBpF,CAAC;AAEF,eAAO,MAAM,eAAe,YACjB,sBAAsB,KAC9B,OAAO,CAAC,IAAI,CAId,CAAC"}
1
+ {"version":3,"file":"launch.d.ts","sourceRoot":"","sources":["../src/launch.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAM1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEnE,MAAM,WAAW,iBAAiB;IAChC,eAAe,EAAE,eAAe,CAAC;IACjC,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+DAA+D;IAC/D,YAAY,CAAC,EAAE,SAAS,WAAW,EAAE,CAAC;IACtC,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAC5C;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IACvD,iEAAiE;IACjE,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAC;CAC9B;AAED,eAAO,MAAM,MAAM,YAAkC,iBAAiB,KAAG,OAAO,CAAC,IAAI,CAiBpF,CAAC;AAEF,eAAO,MAAM,eAAe,YACjB,sBAAsB,KAC9B,OAAO,CAAC,IAAI,CAId,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"launch.js","sourceRoot":"","sources":["../src/launch.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAGxD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAwBhE,MAAM,CAAC,MAAM,MAAM,GAAG,KAAK,UAAU,MAAM,CAAC,OAA0B;IACpE,MAAM,EAAE,MAAM,EAAE,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;IACnD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACrC,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,uBAAuB,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3D,CAAC;IACD,MAAM,aAAa,CACjB,GAAc,EAAE,CAAC,CACf,KAAC,cAAc,IAAC,MAAM,EAAE,MAAM,YAC5B,KAAC,MAAM,KAAG,GACK,CAClB,EACD;QACE,WAAW,EAAE,cAAc;QAC3B,YAAY,EAAE,mBAAmB;KAClC,CACF,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,UAAU,eAAe,CAC3D,OAA+B;IAE/B,MAAM,SAAS,CAAC,KAAC,aAAa,IAAC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,GAAI,EAAE;QACrF,YAAY,EAAE,mBAAmB;KAClC,CAAC,CAAC;AACL,CAAC,CAAC"}
1
+ {"version":3,"file":"launch.js","sourceRoot":"","sources":["../src/launch.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAGxD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AA0BhE,MAAM,CAAC,MAAM,MAAM,GAAG,KAAK,UAAU,MAAM,CAAC,OAA0B;IACpE,MAAM,EAAE,MAAM,EAAE,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;IACnD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACrC,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,uBAAuB,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3D,CAAC;IACD,MAAM,aAAa,CACjB,GAAc,EAAE,CAAC,CACf,KAAC,cAAc,IAAC,MAAM,EAAE,MAAM,YAC5B,KAAC,MAAM,KAAG,GACK,CAClB,EACD;QACE,WAAW,EAAE,cAAc;QAC3B,YAAY,EAAE,mBAAmB;KAClC,CACF,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,UAAU,eAAe,CAC3D,OAA+B;IAE/B,MAAM,SAAS,CAAC,KAAC,aAAa,IAAC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,GAAI,EAAE;QACrF,YAAY,EAAE,mBAAmB;KAClC,CAAC,CAAC;AACL,CAAC,CAAC"}
@@ -0,0 +1,24 @@
1
+ import type { FlatBlock } from "@tooee/renderers";
2
+ /** One heading in a document outline. */
3
+ export interface OutlineEntry {
4
+ /** The heading's index in the full row array, the same key folds use. */
5
+ row: number;
6
+ /** Heading level, 1 for `#`. */
7
+ depth: number;
8
+ /** Indent level in the outline: depth relative to the shallowest heading. */
9
+ level: number;
10
+ /** Unstyled heading text. */
11
+ text: string;
12
+ }
13
+ /**
14
+ * The headings of flattened Markdown blocks, in document order. Levels start
15
+ * at 0 for the shallowest heading in the document, so a document that starts
16
+ * at `##` is not indented.
17
+ */
18
+ export declare const markdownOutline: (blocks: readonly FlatBlock[]) => OutlineEntry[];
19
+ /**
20
+ * Index of the entry for the heading that contains `row`: the last heading at
21
+ * or before it. Returns `-1` before the first heading or for an empty outline.
22
+ */
23
+ export declare const outlineIndexAt: (entries: readonly OutlineEntry[], row: number) => number;
24
+ //# sourceMappingURL=markdown-outline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-outline.d.ts","sourceRoot":"","sources":["../../src/outline/markdown-outline.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAIlD,yCAAyC;AACzC,MAAM,WAAW,YAAY;IAC3B,yEAAyE;IACzE,GAAG,EAAE,MAAM,CAAC;IACZ,gCAAgC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,6EAA6E;IAC7E,KAAK,EAAE,MAAM,CAAC;IACd,6BAA6B;IAC7B,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;GAIG;AACH,eAAO,MAAM,eAAe,WAClB,SAAS,SAAS,EAAE,KAC3B,YAAY,EASd,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,cAAc,YAChB,SAAS,YAAY,EAAE,OAC3B,MAAM,KACV,MAEF,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { getPlainText } from "@tooee/renderers";
2
+ import { headingToken } from "../folds/markdown-heading-folds.js";
3
+ /**
4
+ * The headings of flattened Markdown blocks, in document order. Levels start
5
+ * at 0 for the shallowest heading in the document, so a document that starts
6
+ * at `##` is not indented.
7
+ */
8
+ export const markdownOutline = function markdownOutline(blocks) {
9
+ const headings = blocks.flatMap((block, row) => {
10
+ const heading = headingToken(block);
11
+ return heading === null
12
+ ? []
13
+ : [{ depth: heading.depth, row, text: getPlainText(heading.tokens).trim() }];
14
+ });
15
+ const minDepth = Math.min(...headings.map((heading) => heading.depth));
16
+ return headings.map((heading) => ({ ...heading, level: heading.depth - minDepth }));
17
+ };
18
+ /**
19
+ * Index of the entry for the heading that contains `row`: the last heading at
20
+ * or before it. Returns `-1` before the first heading or for an empty outline.
21
+ */
22
+ export const outlineIndexAt = function outlineIndexAt(entries, row) {
23
+ return entries.findLastIndex((entry) => entry.row <= row);
24
+ };
25
+ //# sourceMappingURL=markdown-outline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-outline.js","sourceRoot":"","sources":["../../src/outline/markdown-outline.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAGhD,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAclE;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,SAAS,eAAe,CACrD,MAA4B;IAE5B,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QAC7C,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QACpC,OAAO,OAAO,KAAK,IAAI;YACrB,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACjF,CAAC,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IACvE,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,GAAG,QAAQ,EAAE,CAAC,CAAC,CAAC;AACtF,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,SAAS,cAAc,CACnD,OAAgC,EAChC,GAAW;IAEX,OAAO,OAAO,CAAC,aAAa,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;AAC5D,CAAC,CAAC"}