@commentray/core 0.0.2 → 0.0.4
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.
- package/dist/anchors.d.ts +6 -0
- package/dist/anchors.d.ts.map +1 -1
- package/dist/anchors.js +11 -0
- package/dist/anchors.js.map +1 -1
- package/dist/angles-toml.d.ts.map +1 -1
- package/dist/angles-toml.js.map +1 -1
- package/dist/block-scroll-pickers.d.ts +22 -0
- package/dist/block-scroll-pickers.d.ts.map +1 -0
- package/dist/block-scroll-pickers.js +41 -0
- package/dist/block-scroll-pickers.js.map +1 -0
- package/dist/block-snippet.d.ts +13 -0
- package/dist/block-snippet.d.ts.map +1 -0
- package/dist/block-snippet.js +30 -0
- package/dist/block-snippet.js.map +1 -0
- package/dist/blocks.d.ts.map +1 -1
- package/dist/blocks.js +13 -13
- package/dist/blocks.js.map +1 -1
- package/dist/commentray-index-renames.d.ts +21 -0
- package/dist/commentray-index-renames.d.ts.map +1 -0
- package/dist/commentray-index-renames.js +85 -0
- package/dist/commentray-index-renames.js.map +1 -0
- package/dist/commentray-path-resolution.js +1 -1
- package/dist/commentray-path-resolution.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +6 -4
- package/dist/config.js.map +1 -1
- package/dist/index-normalize.d.ts +10 -0
- package/dist/index-normalize.d.ts.map +1 -0
- package/dist/index-normalize.js +60 -0
- package/dist/index-normalize.js.map +1 -0
- package/dist/index-schema-messages.d.ts +6 -0
- package/dist/index-schema-messages.d.ts.map +1 -0
- package/dist/index-schema-messages.js +26 -0
- package/dist/index-schema-messages.js.map +1 -0
- package/dist/index.d.ts +14 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -3
- package/dist/index.js.map +1 -1
- package/dist/marker-ids.d.ts +19 -0
- package/dist/marker-ids.d.ts.map +1 -0
- package/dist/marker-ids.js +38 -0
- package/dist/marker-ids.js.map +1 -0
- package/dist/marker-validation.d.ts +22 -0
- package/dist/marker-validation.d.ts.map +1 -0
- package/dist/marker-validation.js +138 -0
- package/dist/marker-validation.js.map +1 -0
- package/dist/metadata.d.ts.map +1 -1
- package/dist/metadata.js +54 -25
- package/dist/metadata.js.map +1 -1
- package/dist/migrate.d.ts.map +1 -1
- package/dist/migrate.js +20 -4
- package/dist/migrate.js.map +1 -1
- package/dist/model.d.ts +13 -26
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +16 -0
- package/dist/model.js.map +1 -1
- package/dist/paths.d.ts +1 -1
- package/dist/paths.d.ts.map +1 -1
- package/dist/paths.js +3 -2
- package/dist/paths.js.map +1 -1
- package/dist/region-marker-convert.d.ts +27 -0
- package/dist/region-marker-convert.d.ts.map +1 -0
- package/dist/region-marker-convert.js +78 -0
- package/dist/region-marker-convert.js.map +1 -0
- package/dist/scm/git-scm-provider.d.ts +7 -1
- package/dist/scm/git-scm-provider.d.ts.map +1 -1
- package/dist/scm/git-scm-provider.js +42 -0
- package/dist/scm/git-scm-provider.js.map +1 -1
- package/dist/scm/scm-provider.d.ts +10 -0
- package/dist/scm/scm-provider.d.ts.map +1 -1
- package/dist/scroll-sync.d.ts +8 -23
- package/dist/scroll-sync.d.ts.map +1 -1
- package/dist/scroll-sync.js +31 -52
- package/dist/scroll-sync.js.map +1 -1
- package/dist/source-markers.d.ts +28 -0
- package/dist/source-markers.d.ts.map +1 -0
- package/dist/source-markers.js +241 -0
- package/dist/source-markers.js.map +1 -0
- package/dist/validate-project.d.ts +9 -1
- package/dist/validate-project.d.ts.map +1 -1
- package/dist/validate-project.js +57 -15
- package/dist/validate-project.js.map +1 -1
- package/package.json +6 -2
package/dist/model.d.ts
CHANGED
|
@@ -1,21 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Content fingerprint of a source range, used to re-resolve the block's
|
|
3
|
-
* anchor after lines drift (insertions or deletions in the source).
|
|
4
|
-
*
|
|
5
|
-
* A fingerprint is intentionally narrow: trimmed text of the first and last
|
|
6
|
-
* lines plus the original line count. Re-resolution is a search, not a
|
|
7
|
-
* guarantee: when the fingerprint still appears uniquely near the old
|
|
8
|
-
* location we silently update the line numbers; otherwise we surface a
|
|
9
|
-
* diagnostic so a human can decide.
|
|
10
|
-
*/
|
|
11
|
-
export type CommentrayBlockFingerprint = {
|
|
12
|
-
/** Trimmed content of the first line of the original range. */
|
|
13
|
-
startLine: string;
|
|
14
|
-
/** Trimmed content of the last line of the original range. */
|
|
15
|
-
endLine: string;
|
|
16
|
-
/** Number of lines the range originally spanned (end - start + 1). */
|
|
17
|
-
lineCount: number;
|
|
18
|
-
};
|
|
19
1
|
/** Commentray block aligned to a region of a primary source file. */
|
|
20
2
|
export type CommentrayBlock = {
|
|
21
3
|
/** Stable id within the commentray markdown file. */
|
|
@@ -23,16 +5,16 @@ export type CommentrayBlock = {
|
|
|
23
5
|
/** Human or machine anchor string (see anchor grammar in docs). */
|
|
24
6
|
anchor: string;
|
|
25
7
|
/**
|
|
26
|
-
* Optional
|
|
27
|
-
*
|
|
28
|
-
*
|
|
8
|
+
* Optional unified-diff–style capture of the anchored source lines (see
|
|
9
|
+
* `block-snippet.ts`). Self-contained string in index.json — not a nested
|
|
10
|
+
* JSON region object.
|
|
29
11
|
*/
|
|
30
|
-
|
|
12
|
+
snippet?: string;
|
|
31
13
|
/**
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
14
|
+
* When the anchor is `marker:<id>`, the same id appears in source as the
|
|
15
|
+
* region name `commentray:<id>` (e.g. `//#region` / `//#endregion` in
|
|
16
|
+
* TypeScript, aligned with the Region Marker extension), or in legacy
|
|
17
|
+
* `commentray:start id=…` / `commentray:end id=…` line comments.
|
|
36
18
|
*/
|
|
37
19
|
markerId?: string;
|
|
38
20
|
/** Last human-verified commit (full SHA) when this block was considered accurate. */
|
|
@@ -59,4 +41,9 @@ export type CommentrayIndex = {
|
|
|
59
41
|
byCommentrayPath: Record<string, SourceFileIndexEntry>;
|
|
60
42
|
};
|
|
61
43
|
export declare const CURRENT_SCHEMA_VERSION: 3;
|
|
44
|
+
/**
|
|
45
|
+
* Normalizes `index.json` `schemaVersion` after `JSON.parse` (integer, or
|
|
46
|
+
* rare string forms like `"3"`).
|
|
47
|
+
*/
|
|
48
|
+
export declare function coerceIndexSchemaVersion(raw: unknown): number | undefined | null;
|
|
62
49
|
//# sourceMappingURL=model.d.ts.map
|
package/dist/model.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,MAAM,MAAM,eAAe,GAAG;IAC5B,qDAAqD;IACrD,EAAE,EAAE,MAAM,CAAC;IACX,mEAAmE;IACnE,MAAM,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qFAAqF;IACrF,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,0EAA0E;IAC1E,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,8CAA8C;IAC9C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,yEAAyE;IACzE,UAAU,EAAE,MAAM,CAAC;IACnB,0DAA0D;IAC1D,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,eAAe,EAAE,CAAC;CAC3B,CAAC;AAEF,2EAA2E;AAC3E,MAAM,MAAM,eAAe,GAAG;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;CACxD,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAG,CAAU,CAAC;AAEjD;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,GAAG,IAAI,CAQhF"}
|
package/dist/model.js
CHANGED
|
@@ -1,2 +1,18 @@
|
|
|
1
1
|
export const CURRENT_SCHEMA_VERSION = 3;
|
|
2
|
+
/**
|
|
3
|
+
* Normalizes `index.json` `schemaVersion` after `JSON.parse` (integer, or
|
|
4
|
+
* rare string forms like `"3"`).
|
|
5
|
+
*/
|
|
6
|
+
export function coerceIndexSchemaVersion(raw) {
|
|
7
|
+
if (raw === undefined)
|
|
8
|
+
return undefined;
|
|
9
|
+
if (typeof raw === "number" && Number.isInteger(raw))
|
|
10
|
+
return raw;
|
|
11
|
+
if (typeof raw === "string") {
|
|
12
|
+
const t = raw.trim();
|
|
13
|
+
if (/^\d+$/.test(t))
|
|
14
|
+
return Number.parseInt(t, 10);
|
|
15
|
+
}
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
2
18
|
//# sourceMappingURL=model.js.map
|
package/dist/model.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.js","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AA6CA,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAU,CAAC;AAEjD;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CAAC,GAAY;IACnD,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACxC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC;IACjE,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QACrB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;YAAE,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
package/dist/paths.d.ts
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
*/
|
|
13
13
|
export declare function normalizeRepoRelativePath(relativePath: string): string;
|
|
14
14
|
/** Commentray Markdown path for a repo-relative source file (implicit default angle, flat layout). */
|
|
15
|
-
export declare function commentrayMarkdownPath(sourceRepoRelativePath: string): string;
|
|
15
|
+
export declare function commentrayMarkdownPath(sourceRepoRelativePath: string, storageDir?: string): string;
|
|
16
16
|
/**
|
|
17
17
|
* Repo-relative path to the **Angles sentinel**: if this path exists as a file or directory under
|
|
18
18
|
* the storage root, the repository opts into per-source **Angles** layout (see `docs/spec/storage.md`).
|
package/dist/paths.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;GAWG;AACH,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAWtE;AAED,sGAAsG;AACtG,wBAAgB,sBAAsB,
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;GAWG;AACH,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAWtE;AAED,sGAAsG;AACtG,wBAAgB,sBAAsB,CACpC,sBAAsB,EAAE,MAAM,EAC9B,UAAU,SAAgB,GACzB,MAAM,CAIR;AAED;;;;GAIG;AACH,wBAAgB,4BAA4B,CAAC,UAAU,SAAgB,GAAG,MAAM,CAG/E;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CAC3C,QAAQ,EAAE,MAAM,EAChB,UAAU,SAAgB,GACzB,OAAO,CAIT;AAED;;;GAGG;AACH,wBAAgB,8BAA8B,CAC5C,sBAAsB,EAAE,MAAM,EAC9B,OAAO,EAAE,MAAM,EACf,UAAU,SAAgB,GACzB,MAAM,CAKR;AAED,uDAAuD;AACvD,wBAAgB,wBAAwB,IAAI,MAAM,CAEjD"}
|
package/dist/paths.js
CHANGED
|
@@ -26,9 +26,10 @@ export function normalizeRepoRelativePath(relativePath) {
|
|
|
26
26
|
return segments.join("/");
|
|
27
27
|
}
|
|
28
28
|
/** Commentray Markdown path for a repo-relative source file (implicit default angle, flat layout). */
|
|
29
|
-
export function commentrayMarkdownPath(sourceRepoRelativePath) {
|
|
29
|
+
export function commentrayMarkdownPath(sourceRepoRelativePath, storageDir = ".commentray") {
|
|
30
30
|
const normalized = normalizeRepoRelativePath(sourceRepoRelativePath);
|
|
31
|
-
|
|
31
|
+
const root = normalizeRepoRelativePath(storageDir.replaceAll("\\", "/"));
|
|
32
|
+
return path.posix.join(root, "source", `${normalized}.md`);
|
|
32
33
|
}
|
|
33
34
|
/**
|
|
34
35
|
* Repo-relative path to the **Angles sentinel**: if this path exists as a file or directory under
|
package/dist/paths.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,yBAAyB,CAAC,YAAoB;IAC5D,MAAM,KAAK,GAAG,YAAY,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACjD,IAAI,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,mDAAmD,YAAY,GAAG,CAAC,CAAC;IACtF,CAAC;IACD,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;IAC1E,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,iCAAiC,YAAY,EAAE,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC5B,CAAC;AAED,sGAAsG;AACtG,MAAM,UAAU,sBAAsB,
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/** One paired Commentray delimiter span in source (0-based line indices). */
|
|
2
|
+
export type CommentrayMarkerPair = {
|
|
3
|
+
id: string;
|
|
4
|
+
/** Line index of the opening delimiter. */
|
|
5
|
+
startLine0: number;
|
|
6
|
+
/** Line index of the closing delimiter. */
|
|
7
|
+
endLine0: number;
|
|
8
|
+
};
|
|
9
|
+
/** Leading tabs/spaces on a line (used when rewriting markers). */
|
|
10
|
+
export declare function leadingIndentOfLine(line: string): string;
|
|
11
|
+
/**
|
|
12
|
+
* Finds well-formed start/end pairs in source order. Unmatched starts (same id
|
|
13
|
+
* opened twice without an end) keep the first start; orphan ends are ignored.
|
|
14
|
+
*/
|
|
15
|
+
export declare function findCommentrayMarkerPairs(sourceText: string): CommentrayMarkerPair[];
|
|
16
|
+
/**
|
|
17
|
+
* Rewrites every detected Commentray marker pair to the delimiter style for
|
|
18
|
+
* `targetLanguageId` (see {@link commentrayRegionInsertions}). Processes from
|
|
19
|
+
* the bottom of the file upward so line indices stay valid. Preserves inner
|
|
20
|
+
* lines exactly; normalises CRLF to LF in the result.
|
|
21
|
+
*/
|
|
22
|
+
export declare function convertCommentraySourceMarkersToLanguage(sourceText: string, targetLanguageId: string): {
|
|
23
|
+
sourceText: string;
|
|
24
|
+
changed: boolean;
|
|
25
|
+
convertedPairs: number;
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=region-marker-convert.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"region-marker-convert.d.ts","sourceRoot":"","sources":["../src/region-marker-convert.ts"],"names":[],"mappings":"AAEA,6EAA6E;AAC7E,MAAM,MAAM,oBAAoB,GAAG;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,2CAA2C;IAC3C,UAAU,EAAE,MAAM,CAAC;IACnB,2CAA2C;IAC3C,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,mEAAmE;AACnE,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGxD;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,MAAM,GAAG,oBAAoB,EAAE,CAkBpF;AAoBD;;;;;GAKG;AACH,wBAAgB,wCAAwC,CACtD,UAAU,EAAE,MAAM,EAClB,gBAAgB,EAAE,MAAM,GACvB;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAsBlE"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { commentrayRegionInsertions, parseCommentrayRegionBoundary } from "./source-markers.js";
|
|
2
|
+
/** Leading tabs/spaces on a line (used when rewriting markers). */
|
|
3
|
+
export function leadingIndentOfLine(line) {
|
|
4
|
+
const m = /^[\t ]*/.exec(line);
|
|
5
|
+
return m ? m[0] : "";
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Finds well-formed start/end pairs in source order. Unmatched starts (same id
|
|
9
|
+
* opened twice without an end) keep the first start; orphan ends are ignored.
|
|
10
|
+
*/
|
|
11
|
+
export function findCommentrayMarkerPairs(sourceText) {
|
|
12
|
+
const lines = sourceText.replaceAll("\r\n", "\n").split("\n");
|
|
13
|
+
const pending = new Map();
|
|
14
|
+
const pairs = [];
|
|
15
|
+
for (let i = 0; i < lines.length; i++) {
|
|
16
|
+
const hit = parseCommentrayRegionBoundary(lines[i]);
|
|
17
|
+
if (!hit)
|
|
18
|
+
continue;
|
|
19
|
+
if (hit.kind === "start") {
|
|
20
|
+
if (!pending.has(hit.id))
|
|
21
|
+
pending.set(hit.id, i);
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
const start0 = pending.get(hit.id);
|
|
25
|
+
if (start0 === undefined)
|
|
26
|
+
continue;
|
|
27
|
+
if (i <= start0)
|
|
28
|
+
continue;
|
|
29
|
+
pairs.push({ id: hit.id, startLine0: start0, endLine0: i });
|
|
30
|
+
pending.delete(hit.id);
|
|
31
|
+
}
|
|
32
|
+
return pairs;
|
|
33
|
+
}
|
|
34
|
+
function replaceOnePair(lines, pair, targetLanguageId) {
|
|
35
|
+
if (pair.endLine0 <= pair.startLine0)
|
|
36
|
+
return null;
|
|
37
|
+
const indent = leadingIndentOfLine(lines[pair.startLine0] ?? "");
|
|
38
|
+
const { start, end } = commentrayRegionInsertions(targetLanguageId, pair.id, indent);
|
|
39
|
+
const innerLines = lines.slice(pair.startLine0 + 1, pair.endLine0);
|
|
40
|
+
const inner = innerLines.join("\n");
|
|
41
|
+
const combined = innerLines.length === 0 ? `${start.replace(/\n$/, "")}${end}` : `${start}${inner}${end}`;
|
|
42
|
+
const inserted = combined.split("\n");
|
|
43
|
+
const before = lines.slice(0, pair.startLine0);
|
|
44
|
+
const after = lines.slice(pair.endLine0 + 1);
|
|
45
|
+
return [...before, ...inserted, ...after];
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Rewrites every detected Commentray marker pair to the delimiter style for
|
|
49
|
+
* `targetLanguageId` (see {@link commentrayRegionInsertions}). Processes from
|
|
50
|
+
* the bottom of the file upward so line indices stay valid. Preserves inner
|
|
51
|
+
* lines exactly; normalises CRLF to LF in the result.
|
|
52
|
+
*/
|
|
53
|
+
export function convertCommentraySourceMarkersToLanguage(sourceText, targetLanguageId) {
|
|
54
|
+
const normalised = sourceText.replaceAll("\r\n", "\n");
|
|
55
|
+
const pairs = findCommentrayMarkerPairs(normalised);
|
|
56
|
+
if (pairs.length === 0) {
|
|
57
|
+
return { sourceText: normalised, changed: normalised !== sourceText, convertedPairs: 0 };
|
|
58
|
+
}
|
|
59
|
+
let lines = normalised.split("\n");
|
|
60
|
+
let converted = 0;
|
|
61
|
+
for (const pair of [...pairs].sort((a, b) => b.startLine0 - a.startLine0)) {
|
|
62
|
+
const snapshot = lines.join("\n");
|
|
63
|
+
const next = replaceOnePair(lines, pair, targetLanguageId);
|
|
64
|
+
if (next === null)
|
|
65
|
+
continue;
|
|
66
|
+
const nextStr = next.join("\n");
|
|
67
|
+
if (nextStr !== snapshot)
|
|
68
|
+
converted++;
|
|
69
|
+
lines = next;
|
|
70
|
+
}
|
|
71
|
+
const out = lines.join("\n");
|
|
72
|
+
return {
|
|
73
|
+
sourceText: out,
|
|
74
|
+
changed: out !== normalised,
|
|
75
|
+
convertedPairs: converted,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=region-marker-convert.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"region-marker-convert.js","sourceRoot":"","sources":["../src/region-marker-convert.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,12 @@
|
|
|
1
|
-
import type { ScmProvider } from "./scm-provider.js";
|
|
1
|
+
import type { ScmPathRename, ScmProvider } from "./scm-provider.js";
|
|
2
|
+
/**
|
|
3
|
+
* Parses `git diff --name-status` output for `R` (rename) lines. Tab-separated
|
|
4
|
+
* `R086\told/path\tnew/path` (score optional).
|
|
5
|
+
*/
|
|
6
|
+
export declare function parseGitRenameLines(stdout: string): ScmPathRename[];
|
|
2
7
|
export declare class GitScmProvider implements ScmProvider {
|
|
3
8
|
getBlobIdAtHead(repoRoot: string, repoRelativePath: string): Promise<string | null>;
|
|
4
9
|
isAncestor(repoRoot: string, possibleAncestor: string, commit: string): Promise<boolean>;
|
|
10
|
+
listPathRenamesBetweenTreeishes(repoRoot: string, fromTreeish: string, toTreeish: string): Promise<ScmPathRename[]>;
|
|
5
11
|
}
|
|
6
12
|
//# sourceMappingURL=git-scm-provider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git-scm-provider.d.ts","sourceRoot":"","sources":["../../src/scm/git-scm-provider.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"git-scm-provider.d.ts","sourceRoot":"","sources":["../../src/scm/git-scm-provider.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AA0BpE;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,EAAE,CAmBnE;AAED,qBAAa,cAAe,YAAW,WAAW;IAC1C,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAgBnF,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAYxF,+BAA+B,CACnC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,aAAa,EAAE,CAAC;CAa5B"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { spawn } from "node:child_process";
|
|
2
|
+
import { normalizeRepoRelativePath } from "../paths.js";
|
|
2
3
|
function runGit(repoRoot, args) {
|
|
3
4
|
return new Promise((resolve, reject) => {
|
|
4
5
|
const child = spawn("git", args, {
|
|
@@ -19,6 +20,34 @@ function runGit(repoRoot, args) {
|
|
|
19
20
|
});
|
|
20
21
|
});
|
|
21
22
|
}
|
|
23
|
+
/**
|
|
24
|
+
* Parses `git diff --name-status` output for `R` (rename) lines. Tab-separated
|
|
25
|
+
* `R086\told/path\tnew/path` (score optional).
|
|
26
|
+
*/
|
|
27
|
+
export function parseGitRenameLines(stdout) {
|
|
28
|
+
const out = [];
|
|
29
|
+
for (const line of stdout.split("\n")) {
|
|
30
|
+
const t = line.trim();
|
|
31
|
+
if (!t)
|
|
32
|
+
continue;
|
|
33
|
+
const parts = t.split("\t");
|
|
34
|
+
if (parts.length < 3)
|
|
35
|
+
continue;
|
|
36
|
+
const status = parts[0] ?? "";
|
|
37
|
+
if (!status.startsWith("R"))
|
|
38
|
+
continue;
|
|
39
|
+
try {
|
|
40
|
+
out.push({
|
|
41
|
+
from: normalizeRepoRelativePath(parts[1] ?? ""),
|
|
42
|
+
to: normalizeRepoRelativePath(parts[2] ?? ""),
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return out;
|
|
50
|
+
}
|
|
22
51
|
export class GitScmProvider {
|
|
23
52
|
async getBlobIdAtHead(repoRoot, repoRelativePath) {
|
|
24
53
|
const posixPath = repoRelativePath.replaceAll("\\", "/").replace(/^\/+/, "");
|
|
@@ -46,5 +75,18 @@ export class GitScmProvider {
|
|
|
46
75
|
return false;
|
|
47
76
|
throw new Error(`git merge-base failed (${code}): ${stderr.trim()}`);
|
|
48
77
|
}
|
|
78
|
+
async listPathRenamesBetweenTreeishes(repoRoot, fromTreeish, toTreeish) {
|
|
79
|
+
const { code, stdout, stderr } = await runGit(repoRoot, [
|
|
80
|
+
"diff",
|
|
81
|
+
"--name-status",
|
|
82
|
+
"-M30%",
|
|
83
|
+
fromTreeish,
|
|
84
|
+
toTreeish,
|
|
85
|
+
]);
|
|
86
|
+
if (code !== 0) {
|
|
87
|
+
throw new Error(`git diff --name-status failed (${code}): ${stderr.trim() || stdout.trim()}`);
|
|
88
|
+
}
|
|
89
|
+
return parseGitRenameLines(stdout);
|
|
90
|
+
}
|
|
49
91
|
}
|
|
50
92
|
//# sourceMappingURL=git-scm-provider.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git-scm-provider.js","sourceRoot":"","sources":["../../src/scm/git-scm-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"git-scm-provider.js","sourceRoot":"","sources":["../../src/scm/git-scm-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,18 @@
|
|
|
1
|
+
/** A path Git detected as renamed between two tree-ish objects (`git diff --name-status -M`). */
|
|
2
|
+
export type ScmPathRename = {
|
|
3
|
+
from: string;
|
|
4
|
+
to: string;
|
|
5
|
+
};
|
|
1
6
|
/** Pluggable SCM integration; Git is the default implementation. */
|
|
2
7
|
export type ScmProvider = {
|
|
3
8
|
/** Object id for file at HEAD (Git blob), or null if unknown/untracked. */
|
|
4
9
|
getBlobIdAtHead(repoRoot: string, repoRelativePath: string): Promise<string | null>;
|
|
5
10
|
/** True if `possibleAncestor` is an ancestor of `commit` (inclusive). */
|
|
6
11
|
isAncestor(repoRoot: string, possibleAncestor: string, commit: string): Promise<boolean>;
|
|
12
|
+
/**
|
|
13
|
+
* Optional: list file renames Git detected between `fromTreeish` and `toTreeish`
|
|
14
|
+
* (same semantics as `git diff --name-status -M30% fromTreeish toTreeish`).
|
|
15
|
+
*/
|
|
16
|
+
listPathRenamesBetweenTreeishes?: (repoRoot: string, fromTreeish: string, toTreeish: string) => Promise<ScmPathRename[]>;
|
|
7
17
|
};
|
|
8
18
|
//# sourceMappingURL=scm-provider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scm-provider.d.ts","sourceRoot":"","sources":["../../src/scm/scm-provider.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,MAAM,MAAM,WAAW,GAAG;IACxB,2EAA2E;IAC3E,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACpF,yEAAyE;IACzE,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"scm-provider.d.ts","sourceRoot":"","sources":["../../src/scm/scm-provider.ts"],"names":[],"mappings":"AAAA,iGAAiG;AACjG,MAAM,MAAM,aAAa,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzD,oEAAoE;AACpE,MAAM,MAAM,WAAW,GAAG;IACxB,2EAA2E;IAC3E,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACpF,yEAAyE;IACzE,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACzF;;;OAGG;IACH,+BAA+B,CAAC,EAAE,CAChC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,KACd,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;CAC/B,CAAC"}
|
package/dist/scroll-sync.d.ts
CHANGED
|
@@ -1,27 +1,12 @@
|
|
|
1
|
+
import type { BlockScrollLink } from "./block-scroll-pickers.js";
|
|
1
2
|
import type { CommentrayIndex } from "./model.js";
|
|
2
|
-
|
|
3
|
-
export
|
|
4
|
-
commentrayLine: number;
|
|
5
|
-
sourceStart: number;
|
|
6
|
-
sourceEnd: number;
|
|
7
|
-
};
|
|
3
|
+
export type { BlockScrollLink } from "./block-scroll-pickers.js";
|
|
4
|
+
export { pickCommentrayLineForSourceScroll, pickSourceLine0ForCommentrayScroll, } from "./block-scroll-pickers.js";
|
|
8
5
|
/**
|
|
9
|
-
* Correlate index blocks
|
|
10
|
-
*
|
|
11
|
-
* marker
|
|
6
|
+
* Correlate index blocks with `<!-- commentray:block id=… -->` markers in
|
|
7
|
+
* commentray. Supports legacy `lines:` anchors and `marker:` anchors (the
|
|
8
|
+
* latter needs `sourceText` to resolve marker comments in the primary file).
|
|
9
|
+
* Sorted by `sourceStart`.
|
|
12
10
|
*/
|
|
13
|
-
export declare function buildBlockScrollLinks(index: CommentrayIndex | null | undefined, sourceRelative: string, commentrayPath: string, commentrayMarkdown: string): BlockScrollLink[];
|
|
14
|
-
/**
|
|
15
|
-
* Choose which commentray line (0-based) to reveal so the commentary matches
|
|
16
|
-
* the top of the source viewport. Prefers the block whose source range
|
|
17
|
-
* **contains** the top line; otherwise the nearest preceding block; if above
|
|
18
|
-
* all blocks, the first block.
|
|
19
|
-
*/
|
|
20
|
-
export declare function pickCommentrayLineForSourceScroll(blocks: BlockScrollLink[], topSourceLine1Based: number): number | null;
|
|
21
|
-
/**
|
|
22
|
-
* Choose a 0-based source line to reveal from the top of the commentray
|
|
23
|
-
* viewport: the block whose marker is at or above that line wins; reveal the
|
|
24
|
-
* start of its source range.
|
|
25
|
-
*/
|
|
26
|
-
export declare function pickSourceLine0ForCommentrayScroll(blocks: BlockScrollLink[], topCommentrayLine0Based: number): number | null;
|
|
11
|
+
export declare function buildBlockScrollLinks(index: CommentrayIndex | null | undefined, sourceRelative: string, commentrayPath: string, commentrayMarkdown: string, sourceText?: string): BlockScrollLink[];
|
|
27
12
|
//# sourceMappingURL=scroll-sync.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scroll-sync.d.ts","sourceRoot":"","sources":["../src/scroll-sync.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"scroll-sync.d.ts","sourceRoot":"","sources":["../src/scroll-sync.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAEjE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGlD,YAAY,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EACL,iCAAiC,EACjC,kCAAkC,GACnC,MAAM,2BAA2B,CAAC;AAcnC;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,eAAe,GAAG,IAAI,GAAG,SAAS,EACzC,cAAc,EAAE,MAAM,EACtB,cAAc,EAAE,MAAM,EACtB,kBAAkB,EAAE,MAAM,EAC1B,UAAU,CAAC,EAAE,MAAM,GAClB,eAAe,EAAE,CAgCnB"}
|
package/dist/scroll-sync.js
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { parseAnchor } from "./anchors.js";
|
|
2
|
-
|
|
2
|
+
import { MARKER_ID_BODY } from "./marker-ids.js";
|
|
3
|
+
import { sourceLineRangeForMarkerId } from "./source-markers.js";
|
|
4
|
+
export { pickCommentrayLineForSourceScroll, pickSourceLine0ForCommentrayScroll, } from "./block-scroll-pickers.js";
|
|
5
|
+
const BLOCK_MARKER_RE = new RegExp(`<!-- commentray:block id=(${MARKER_ID_BODY}) -->`);
|
|
3
6
|
function markerLineByIdFromMarkdown(markdown) {
|
|
4
7
|
const map = new Map();
|
|
5
8
|
const lines = markdown.split("\n");
|
|
@@ -11,11 +14,12 @@ function markerLineByIdFromMarkdown(markdown) {
|
|
|
11
14
|
return map;
|
|
12
15
|
}
|
|
13
16
|
/**
|
|
14
|
-
* Correlate index blocks
|
|
15
|
-
*
|
|
16
|
-
* marker
|
|
17
|
+
* Correlate index blocks with `<!-- commentray:block id=… -->` markers in
|
|
18
|
+
* commentray. Supports legacy `lines:` anchors and `marker:` anchors (the
|
|
19
|
+
* latter needs `sourceText` to resolve marker comments in the primary file).
|
|
20
|
+
* Sorted by `sourceStart`.
|
|
17
21
|
*/
|
|
18
|
-
export function buildBlockScrollLinks(index, sourceRelative, commentrayPath, commentrayMarkdown) {
|
|
22
|
+
export function buildBlockScrollLinks(index, sourceRelative, commentrayPath, commentrayMarkdown, sourceText) {
|
|
19
23
|
const entry = index?.byCommentrayPath[commentrayPath];
|
|
20
24
|
if (!entry || entry.sourcePath !== sourceRelative || entry.blocks.length === 0)
|
|
21
25
|
return [];
|
|
@@ -23,58 +27,33 @@ export function buildBlockScrollLinks(index, sourceRelative, commentrayPath, com
|
|
|
23
27
|
const links = [];
|
|
24
28
|
for (const block of entry.blocks) {
|
|
25
29
|
const anchor = parseAnchor(block.anchor);
|
|
26
|
-
if (anchor.kind !== "lines")
|
|
27
|
-
continue;
|
|
28
30
|
const commentrayLine = markerLineById.get(block.id);
|
|
29
31
|
if (commentrayLine === undefined)
|
|
30
32
|
continue;
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
33
|
+
if (anchor.kind === "lines") {
|
|
34
|
+
links.push({
|
|
35
|
+
id: block.id,
|
|
36
|
+
commentrayLine,
|
|
37
|
+
sourceStart: anchor.range.start,
|
|
38
|
+
sourceEnd: anchor.range.end,
|
|
39
|
+
});
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
if (anchor.kind === "marker") {
|
|
43
|
+
if (sourceText === undefined)
|
|
44
|
+
continue;
|
|
45
|
+
const range = sourceLineRangeForMarkerId(sourceText, anchor.id);
|
|
46
|
+
if (range === null)
|
|
47
|
+
continue;
|
|
48
|
+
links.push({
|
|
49
|
+
id: block.id,
|
|
50
|
+
commentrayLine,
|
|
51
|
+
sourceStart: range.start,
|
|
52
|
+
sourceEnd: range.end,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
36
55
|
}
|
|
37
56
|
links.sort((a, b) => a.sourceStart - b.sourceStart);
|
|
38
57
|
return links;
|
|
39
58
|
}
|
|
40
|
-
/**
|
|
41
|
-
* Choose which commentray line (0-based) to reveal so the commentary matches
|
|
42
|
-
* the top of the source viewport. Prefers the block whose source range
|
|
43
|
-
* **contains** the top line; otherwise the nearest preceding block; if above
|
|
44
|
-
* all blocks, the first block.
|
|
45
|
-
*/
|
|
46
|
-
export function pickCommentrayLineForSourceScroll(blocks, topSourceLine1Based) {
|
|
47
|
-
if (blocks.length === 0)
|
|
48
|
-
return null;
|
|
49
|
-
const inside = blocks.find((b) => b.sourceStart <= topSourceLine1Based && topSourceLine1Based <= b.sourceEnd);
|
|
50
|
-
if (inside)
|
|
51
|
-
return inside.commentrayLine;
|
|
52
|
-
if (topSourceLine1Based < blocks[0].sourceStart)
|
|
53
|
-
return blocks[0].commentrayLine;
|
|
54
|
-
let best = blocks[0];
|
|
55
|
-
for (const b of blocks) {
|
|
56
|
-
if (b.sourceStart <= topSourceLine1Based)
|
|
57
|
-
best = b;
|
|
58
|
-
else
|
|
59
|
-
break;
|
|
60
|
-
}
|
|
61
|
-
return best.commentrayLine;
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Choose a 0-based source line to reveal from the top of the commentray
|
|
65
|
-
* viewport: the block whose marker is at or above that line wins; reveal the
|
|
66
|
-
* start of its source range.
|
|
67
|
-
*/
|
|
68
|
-
export function pickSourceLine0ForCommentrayScroll(blocks, topCommentrayLine0Based) {
|
|
69
|
-
if (blocks.length === 0)
|
|
70
|
-
return null;
|
|
71
|
-
let best = blocks[0];
|
|
72
|
-
for (const b of blocks) {
|
|
73
|
-
if (b.commentrayLine <= topCommentrayLine0Based)
|
|
74
|
-
best = b;
|
|
75
|
-
else
|
|
76
|
-
break;
|
|
77
|
-
}
|
|
78
|
-
return best.sourceStart - 1;
|
|
79
|
-
}
|
|
80
59
|
//# sourceMappingURL=scroll-sync.js.map
|
package/dist/scroll-sync.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scroll-sync.js","sourceRoot":"","sources":["../src/scroll-sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"scroll-sync.js","sourceRoot":"","sources":["../src/scroll-sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AAGjE,OAAO,EACL,iCAAiC,EACjC,kCAAkC,GACnC,MAAM,2BAA2B,CAAC;AAEnC,MAAM,eAAe,GAAG,IAAI,MAAM,CAAC,6BAA6B,cAAc,OAAO,CAAC,CAAC;AAEvF,SAAS,0BAA0B,CAAC,QAAgB;IAClD,MAAM,GAAG,GAAG,IAAI,GAAG,EAAkB,CAAC;IACtC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7C,IAAI,KAAK;YAAE,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CACnC,KAAyC,EACzC,cAAsB,EACtB,cAAsB,EACtB,kBAA0B,EAC1B,UAAmB;IAEnB,MAAM,KAAK,GAAG,KAAK,EAAE,gBAAgB,CAAC,cAAc,CAAC,CAAC;IACtD,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,UAAU,KAAK,cAAc,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC1F,MAAM,cAAc,GAAG,0BAA0B,CAAC,kBAAkB,CAAC,CAAC;IACtE,MAAM,KAAK,GAAsB,EAAE,CAAC;IACpC,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACzC,MAAM,cAAc,GAAG,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACpD,IAAI,cAAc,KAAK,SAAS;YAAE,SAAS;QAC3C,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC5B,KAAK,CAAC,IAAI,CAAC;gBACT,EAAE,EAAE,KAAK,CAAC,EAAE;gBACZ,cAAc;gBACd,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK;gBAC/B,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG;aAC5B,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,IAAI,UAAU,KAAK,SAAS;gBAAE,SAAS;YACvC,MAAM,KAAK,GAAG,0BAA0B,CAAC,UAAU,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;YAChE,IAAI,KAAK,KAAK,IAAI;gBAAE,SAAS;YAC7B,KAAK,CAAC,IAAI,CAAC;gBACT,EAAE,EAAE,KAAK,CAAC,EAAE;gBACZ,cAAc;gBACd,WAAW,EAAE,KAAK,CAAC,KAAK;gBACxB,SAAS,EAAE,KAAK,CAAC,GAAG;aACrB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC;IACpD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Line comment leader for **generic** `commentray:start` / `end` markers
|
|
3
|
+
* (`// …`, `# …`, etc.). Not used for `#region` family languages.
|
|
4
|
+
*/
|
|
5
|
+
export declare function lineCommentLeaderForLanguage(languageId: string): string;
|
|
6
|
+
/**
|
|
7
|
+
* Insertion fragments for wrapping the selection (apply **end** first, then
|
|
8
|
+
* **start**, so stable offsets). Pass the same indentation string Region Marker
|
|
9
|
+
* uses (leading whitespace of the first selected line).
|
|
10
|
+
*/
|
|
11
|
+
export declare function commentrayRegionInsertions(languageId: string, markerId: string, indent?: string): {
|
|
12
|
+
start: string;
|
|
13
|
+
end: string;
|
|
14
|
+
};
|
|
15
|
+
export type RegionBoundaryKind = "start" | "end";
|
|
16
|
+
/** Detect a Commentray region, generic marker, or legacy marker line; id is lower-case. */
|
|
17
|
+
export declare function parseCommentrayRegionBoundary(line: string): {
|
|
18
|
+
kind: RegionBoundaryKind;
|
|
19
|
+
id: string;
|
|
20
|
+
} | null;
|
|
21
|
+
/**
|
|
22
|
+
* 1-based inclusive source lines **between** paired region / generic / legacy marker lines.
|
|
23
|
+
*/
|
|
24
|
+
export declare function sourceLineRangeForMarkerId(sourceText: string, markerId: string): {
|
|
25
|
+
start: number;
|
|
26
|
+
end: number;
|
|
27
|
+
} | null;
|
|
28
|
+
//# sourceMappingURL=source-markers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-markers.d.ts","sourceRoot":"","sources":["../src/source-markers.ts"],"names":[],"mappings":"AAyGA;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAMvE;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CACxC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,MAAM,SAAK,GACV;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAuDhC;AAED,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,KAAK,CAAC;AAEjD,2FAA2F;AAC3F,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,MAAM,GACX;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CA8CjD;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf;IACD,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb,GAAG,IAAI,CAgBP"}
|