Skip to content

Commit

Permalink
feat: provide commands for multilevel sort
Browse files Browse the repository at this point in the history
  • Loading branch information
1nVitr0 committed Jun 8, 2021
1 parent 789405a commit 9a856ba
Show file tree
Hide file tree
Showing 9 changed files with 2,955 additions and 2,145 deletions.
4,853 changes: 2,714 additions & 2,139 deletions package-lock.json

Large diffs are not rendered by default.

42 changes: 40 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -33,17 +33,55 @@
"commands": [
{
"command": "blocksort.sortBlocksAsc",
"title": "Sort Blocks Ascending"
"title": "Sort Blocks Ascending",
"category": "Sort",
"icon": {
"dark": "resources/icon_asc_dark.svg",
"light": "resources/icon_asc.svg"
}
},
{
"command": "blocksort.sortBlocksDesc",
"title": "Sort Blocks Descending"
"title": "Sort Blocks Descending",
"category": "Sort",
"icon": {
"dark": "resources/icon_desc_dark.svg",
"light": "resources/icon_desc.svg"
}
},
{
"command": "blocksort.sortBlocksMultilevelAsc",
"title": "Sort Blocks Deep Ascending (Multilevel)",
"category": "Sort",
"icon": {
"dark": "resources/icon_asc_dark.svg",
"light": "resources/icon_asc.svg"
}
},
{
"command": "blocksort.sortBlocksMultilevelDesc",
"title": "Sort Blocks Deep Descending (Multilevel)",
"category": "Sort",
"icon": {
"dark": "resources/icon_desc_dark.svg",
"light": "resources/icon_desc.svg"
}
}
],
"configuration": [
{
"title": "Block Sort",
"properties": {
"blocksort.defaultMultilevelDepth": {
"description": "Default depth used for depp (multilevel) sorting. Use `-1` for infinite depth",
"default": -1,
"type": "integer"
},
"blocksort.askForMultilevelDepth": {
"description": "Controls secondary dialog asking for multilevel Depth. When false, blocksort.defaultMultilevelDepth will be used",
"default": true,
"type": "boolean"
},
"blocksort.indentIgnoreMarkers": {
"description": "Lines starting with these will not be taken into account when checking indentation. This is ised for C++-Style blocks ('{' in separate line) and for non-bracketed blocks (begin-end style). '{', 'end.*' and 'esac|fi' are already provided ('end.* is a bit more complicated, feel free to submit issued when some instances do not work)').",
"default": [],
Expand Down
38 changes: 38 additions & 0 deletions resources/icon_asc.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
39 changes: 39 additions & 0 deletions resources/icon_asc_dark.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
38 changes: 38 additions & 0 deletions resources/icon_desc.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
39 changes: 39 additions & 0 deletions resources/icon_desc_dark.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
37 changes: 34 additions & 3 deletions src/commands/blockSort.ts
Original file line number Diff line number Diff line change
@@ -1,23 +1,54 @@
import { Selection, TextEditor, TextEditorEdit, window } from 'vscode';
import { InputBoxOptions, Selection, TextEditor, TextEditorEdit, window } from 'vscode';
import BlockSortProvider from '../providers/BlockSortProvider';

function blockSort(editor: TextEditor, editBuilder: TextEditorEdit, sortFunction: (a: string, b: string) => number) {
function blockSort(
editor: TextEditor,
editBuilder: TextEditorEdit,
sortFunction: (a: string, b: string) => number,
sortChildren = 0
) {
if (!window.activeTextEditor) return;
const { document, selection } = window.activeTextEditor;

const blockSort = new BlockSortProvider(document);
const range = blockSort.expandSelection(selection);
const blocks = blockSort.getBlocks(range);
const sorted = blockSort.sortBlocks(blocks, sortFunction);
const sorted = blockSort.sortBlocks(blocks, sortFunction, sortChildren);

editor.selection = new Selection(range.start, range.end);
editBuilder.replace(range, sorted.join('\n'));
}

export function blockSortMultilevel(
editor: TextEditor,
editBuilder: TextEditorEdit,
sortFunction: (a: string, b: string) => number
) {
let options: InputBoxOptions = {
prompt: 'Indentation Depth: ',
placeHolder: '(number)',
value: '-1',
validateInput: (value) => (/-?\d+/.test(value) ? value : null),
};

window.showInputBox(options).then((value) => {
if (!value) return;
blockSort(editor, editBuilder, sortFunction, parseInt(value));
});
}

export function blockSortAsc(editor: TextEditor, editBuilder: TextEditorEdit) {
blockSort(editor, editBuilder, BlockSortProvider.sort.asc);
}

export function blockSortDesc(editor: TextEditor, editBuilder: TextEditorEdit) {
blockSort(editor, editBuilder, BlockSortProvider.sort.desc);
}

export function blockSortMultilevelAsc(editor: TextEditor, editBuilder: TextEditorEdit) {
blockSortMultilevel(editor, editBuilder, BlockSortProvider.sort.asc);
}

export function blockSortMultilevelDesc(editor: TextEditor, editBuilder: TextEditorEdit) {
blockSortMultilevel(editor, editBuilder, BlockSortProvider.sort.desc);
}
4 changes: 3 additions & 1 deletion src/contribute/commands.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
import { commands } from 'vscode';
import { blockSortAsc, blockSortDesc } from '../commands/blockSort';
import { blockSortAsc, blockSortDesc, blockSortMultilevelAsc, blockSortMultilevelDesc } from '../commands/blockSort';

export default function contributeCommands() {
return [
commands.registerTextEditorCommand('blocksort.sortBlocksAsc', blockSortAsc),
commands.registerTextEditorCommand('blocksort.sortBlocksDesc', blockSortDesc),
commands.registerTextEditorCommand('blocksort.sortBlocksMultilevelAsc', blockSortMultilevelAsc),
commands.registerTextEditorCommand('blocksort.sortBlocksMultilevelDesc', blockSortMultilevelDesc),
];
}
10 changes: 10 additions & 0 deletions src/providers/ConfigurationProvider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,16 @@ export default class ConfigurationProvider {
return configuration === undefined ? true : configuration;
}

public static getDefaultMultilevelDepth(): number {
const configuration: number | undefined = workspace.getConfiguration('blocksort').get('defaultMultilevelDepth');
return configuration === undefined ? -1 : configuration;
}

public static getAskForMultilevelDepth(): boolean {
const configuration: boolean | undefined = workspace.getConfiguration('blocksort').get('askForMultilevelDepth');
return configuration === undefined ? true : configuration;
}

public static getForceBlockHeaderFirstRegex(): string {
return '$^';
}
Expand Down

0 comments on commit 9a856ba

Please sign in to comment.