Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,15 @@ All notable changes to AS Notes will be documented here.
- Feature: Detects conflicting Markdown Inline Editor extensions and offers to disable them.
- Feature: Outliner mode awareness -- bullet markers and checkbox syntax always remain visible when outliner mode is active.

## [2.3.1] - 2026-03-31

- Feature: Improved page / wikilink rename merge behaviours.
- Feature: Mermaid / LaTeX rendering in published HTML (static site rendering).

## [2.3.0] - 2026-03-28

- Feature: Integration of inline markdown editing.

## [2.2.9] - 2026-03-24

- Feature: Improved default themes for static HTML publishing.
Expand Down
179 changes: 160 additions & 19 deletions TECHNICAL.md

Large diffs are not rendered by default.

21 changes: 18 additions & 3 deletions vs-code-extension/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -252,18 +252,33 @@
{
"command": "as-notes.outlinerIndent",
"key": "tab",
"when": "editorLangId == markdown && as-notes.outlinerMode && as-notes.onBulletLine"
"when": "editorLangId == markdown && as-notes.outlinerMode && (as-notes.onOutlinerBranchLine || as-notes.insideOutlinerFenceContent)"
},
{
"command": "as-notes.outlinerOutdent",
"key": "shift+tab",
"when": "editorLangId == markdown && as-notes.outlinerMode && as-notes.onBulletLine"
"when": "editorLangId == markdown && as-notes.outlinerMode && (as-notes.onOutlinerBranchLine || as-notes.insideOutlinerFenceContent)"
},
{
"command": "as-notes.outlinerPaste",
"key": "ctrl+v",
"mac": "cmd+v",
"when": "editorLangId == markdown && as-notes.outlinerMode && as-notes.onBulletLine && !editorReadonly"
"when": "editorLangId == markdown && as-notes.outlinerMode && (as-notes.onBulletLine || as-notes.insideOutlinerFenceContent) && !editorReadonly"
},
{
"command": "as-notes.outlinerBackspace",
"key": "backspace",
"when": "editorLangId == markdown && as-notes.outlinerMode && (as-notes.onOutlinerBackspaceMergePoint || as-notes.insideOutlinerFenceContent) && !editorReadonly && editorHasSelection == false && !suggestWidgetVisible && !inlineSuggestionVisible"
},
{
"command": "as-notes.outlinerFenceArrowDown",
"key": "down",
"when": "editorLangId == markdown && as-notes.outlinerMode && as-notes.insideOutlinerFenceContent && editorHasSelection == false && !suggestWidgetVisible && !inlineSuggestionVisible"
},
{
"command": "as-notes.outlinerFenceArrowUp",
"key": "up",
"when": "editorLangId == markdown && as-notes.outlinerMode && as-notes.insideOutlinerFenceContent && editorHasSelection == false && !suggestWidgetVisible && !inlineSuggestionVisible"
}
],
"configuration": {
Expand Down
40 changes: 23 additions & 17 deletions vs-code-extension/src/CompletionUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -107,28 +107,34 @@ export function isLineInsideFrontMatter(lines: string[], lineIndex: number): boo
*/
export function isPositionInsideCode(lines: string[], lineIndex: number, charIndex: number): boolean {
// Check fenced code block — scan up to lineIndex tracking open/close state
const fencePattern = /^(\s*(`{3,}|~{3,}))/;
const standaloneFencePattern = /^\s*(`{3,}|~{3,})/;
const bulletOwnedFencePattern = /^\s*-\s(?:\[[ xX]\]\s)?(?:.*\s)?(`{3,}|~{3,})\S*\s*$/;
let inFence = false;
let fenceChar = '';
let fenceLen = 0;
for (let i = 0; i <= lineIndex; i++) {
const m = fencePattern.exec(lines[i]);
if (m) {
const char = m[2][0]; // ` or ~
const len = m[2].length;
if (!inFence) {
// Opening fence
inFence = true;
fenceChar = char;
fenceLen = len;
} else if (char === fenceChar && len >= fenceLen) {
// Closing fence — same char, at least as many markers
inFence = false;
fenceChar = '';
fenceLen = 0;
}
// Otherwise it's a different fence type or shorter — ignored
const line = lines[i] ?? '';
const standaloneMatch = standaloneFencePattern.exec(line);
const bulletOwnedMatch = bulletOwnedFencePattern.exec(line);
const marker = standaloneMatch?.[1] ?? bulletOwnedMatch?.[1];
if (!marker) {
continue;
}

const char = marker[0]; // ` or ~
const len = marker.length;
if (!inFence) {
// Opening fence
inFence = true;
fenceChar = char;
fenceLen = len;
} else if (char === fenceChar && len >= fenceLen) {
// Closing fence — same char, at least as many markers
inFence = false;
fenceChar = '';
fenceLen = 0;
}
// Otherwise it's a different fence type or shorter — ignored
}
// If we're still inside a fence at lineIndex, cursor is in a code block.
// The opening fence line itself is part of the block, but content starts
Expand Down
Loading
Loading