Skip to content

Commit

Permalink
feat:
Browse files Browse the repository at this point in the history
- replace the two convertBetween commands by one toggleCommand
  • Loading branch information
John Tao committed Oct 6, 2022
1 parent c707d42 commit 0abedea
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 26 deletions.
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# Change Log

## [0.0.2] - 2022-10-06
### Changed
- Replace command "convertHeadingsToList" and "convertListToHeadings" by "toggleHeadingsAndList"

## [0.0.1] - 2022-09-28
### Added
- 4 commands to help work with markdown outline (see commands below)
Expand All @@ -8,4 +12,5 @@
- Sort list
- Sort and flatten list

[0.0.2]: https://github.com/johntao/keep-a-changelog/releases/tag/v0.0.2
[0.0.1]: https://github.com/johntao/keep-a-changelog/releases/tag/v0.0.1
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@
###   2.3) A practice project (node.js, typescript, unit test, vscode extension api...)
####     2.3.1) Hence, I didn't do the market research before starting
## 3) Demo
###   3.1) Convert between list and headings
![Convert between list and headings](https://i.imgur.com/sRJL6oc.gif)
###   3.1) Toggle between list and headings
![Toggle between list and headings](https://i.imgur.com/YKQVcVI.gif)
###   3.2) Sort hierarchical list
![Sort hierarchical list](https://i.imgur.com/AmHuDF4.gif)
###   3.3) Convert hierarchical list into flat items
Expand Down
13 changes: 4 additions & 9 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"displayName": "markdown-outline-helper",
"version": "0.0.1",
"publisher": "JohnTao",
"description": "A minimal markdown outline helper to convert between list and headings, convert hierarchical list into flat items, and to sort hierarchical items",
"description": "A minimal markdown outline helper to toggle between list and headings, convert hierarchical list into flat items, and to sort hierarchical items",
"author": {
"name": "John Tao"
},
Expand All @@ -14,21 +14,16 @@
"Other"
],
"activationEvents": [
"onCommand:markdown-outline-helper.convertHeadingsToList",
"onCommand:markdown-outline-helper.convertListToHeadings",
"onCommand:markdown-outline-helper.toggleHeadingsAndList",
"onCommand:markdown-outline-helper.sortList",
"onCommand:markdown-outline-helper.sortAndFlattenList"
],
"main": "./out/extension.js",
"contributes": {
"commands": [
{
"command": "markdown-outline-helper.convertHeadingsToList",
"title": "Convert headings to list"
},
{
"command": "markdown-outline-helper.convertListToHeadings",
"title": "Convert list to headings"
"command": "markdown-outline-helper.toggleHeadingsAndList",
"title": "Toggle between headings and list"
},
{
"command": "markdown-outline-helper.sortList",
Expand Down
53 changes: 38 additions & 15 deletions src/extension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,31 +5,53 @@ import * as configs from './configs';

export function activate(context: vscode.ExtensionContext) {
context.subscriptions.push(
registerEditorCommand('convertHeadingsToList', 'GitHubHeadingToList'),
registerEditorCommand('convertListToHeadings', 'GitHubListToHeading'),
registerEditorCommand2('toggleHeadingsAndList'),
registerEditorCommand('sortList', 'LogSeqList'),
registerEditorCommand('sortAndFlattenList', 'LogSeqFlatList'));
}
function registerEditorCommand(cmdId: string, kind: tn.TreeNodeTypes): vscode.Disposable {
return vscode.commands.registerTextEditorCommand(`markdown-outline-helper.${cmdId}`, (app: vscode.TextEditor) => {
const { start: startDir, end: endDir, isAllEmpty } = inspectRange(app);
if (isAllEmpty) { return; }
const oldRng = app.selection;
const { start } = adjustRange(app, startDir, oldRng.start);
const { end } = adjustRange(app, endDir, oldRng.end);
const newRng = oldRng.with(start, end);
configs.refreshConfiguration();
app.edit(ed => {
const root: tn.ISortable = tn.treeNodeFactory(kind);
const itrCtxt: ut.ItrContext = new ut.ItrContext(root);
ut.parseTreeFromLines([...readLines(app, start.line, end.line)], itrCtxt);
const text = ut.printTree(root);
ed.delete(newRng);
ed.insert(start, text.slice(0, -1));
});
const newRng = getNewRangeRefreshConfig(app, startDir, endDir);
app.edit(editRange(kind, app, newRng));
});
}

function registerEditorCommand2(cmdId: string): vscode.Disposable {
return vscode.commands.registerTextEditorCommand(`markdown-outline-helper.${cmdId}`, (app: vscode.TextEditor) => {
const { start: startDir, end: endDir, isAllEmpty } = inspectRange(app);
if (isAllEmpty) { return; }
const newRng = getNewRangeRefreshConfig(app, startDir, endDir);
const kind = peekRangeGetKind(app, newRng);
app.edit(editRange(kind, app, newRng));
});
}

function getNewRangeRefreshConfig(app: vscode.TextEditor, startDir: SearchDirection, endDir: SearchDirection) {
const oldRng = app.selection;
const { start } = adjustRange(app, startDir, oldRng.start);
const { end } = adjustRange(app, endDir, oldRng.end);
configs.refreshConfiguration();
return oldRng.with(start, end);
}

function editRange(kind: tn.TreeNodeTypes, app: vscode.TextEditor, newRng: vscode.Range): (editBuilder: vscode.TextEditorEdit) => void {
return ed => {
const root: tn.ISortable = tn.treeNodeFactory(kind);
const itrCtxt: ut.ItrContext = new ut.ItrContext(root);
ut.parseTreeFromLines([...readLines(app, newRng.start.line, newRng.end.line)], itrCtxt);
const text = ut.printTree(root);
ed.delete(newRng);
ed.insert(newRng.start, text.slice(0, -1));
};
}

function peekRangeGetKind(app: vscode.TextEditor, newRng: vscode.Range): tn.TreeNodeTypes {
const txt = app.document.lineAt(newRng.start.line).text.trimStart();
return txt.startsWith('#') ? 'GitHubHeadingToList' : 'GitHubListToHeading';
}

function adjustRange(app: vscode.TextEditor, searchDirection: SearchDirection, position: vscode.Position): vscode.Range {
let ln: number = position.line;
const doc = app.document;
Expand Down Expand Up @@ -103,3 +125,4 @@ function* readLines(app: vscode.TextEditor, start: number, end: number) {

// eslint-disable-next-line @typescript-eslint/no-empty-function
export function deactivate() { }

0 comments on commit 0abedea

Please sign in to comment.