From 8bc198f51fcd08b4bddd9fe93d6807cb9e6c72ba Mon Sep 17 00:00:00 2001 From: Maboroshy Date: Thu, 12 Oct 2017 22:24:19 +0400 Subject: [PATCH] New script --- list-maker/info.json | 10 +++ list-maker/list-maker.qml | 129 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 139 insertions(+) create mode 100644 list-maker/info.json create mode 100644 list-maker/list-maker.qml diff --git a/list-maker/info.json b/list-maker/info.json new file mode 100644 index 0000000..28e1ca4 --- /dev/null +++ b/list-maker/info.json @@ -0,0 +1,10 @@ +{ + "name": "Make list", + "identifier": "make-list", + "script": "make-list.qml", + "authors": ["@Maboroshy"], + "platforms": ["linux", "macos", "windows"], + "version": "0.0.1", + "minAppVersion": "17.07.8", + "description" : "This script adds toolbar buttons and context menu items to change selected text formatting:\n- make it an ordered list with numbers or letters;\n- make it an unordered list with markers of your choice;\n- clear any list formatting.\n\nUsing buttons on a list of will override it's formatting with the one you choose. If the first line is part of the ordered list, other lines will continue the list:\n\n2. First selected line\nSome new line\n3. Ordered list line\n- marked list line\na. A first line of another ordered list\nb. A second line of another ordered list\n\nWill become:\n\n2. First selected line\n3. Some new line\n4. Ordered list line\n5. marked list line\n6. A first line of another ordered list\n7. A second line of another ordered list\n\nUnordered list marks and letters used for ordered list can be altered in the script settings.\n\nYou can also replace letters with Chinese/Japanese numbers or any other characters to use them for ordered lists.\n" +} diff --git a/list-maker/list-maker.qml b/list-maker/list-maker.qml new file mode 100644 index 0000000..9fc2ad7 --- /dev/null +++ b/list-maker/list-maker.qml @@ -0,0 +1,129 @@ +import QtQml 2.2 +import QOwnNotesTypes 1.0 + +/* This script adds toolbar buttons and context menu items to change selected text formatting: + * - make it an ordered list with numbers or letters; + * - make it an unordered list with markers of your choice; + * - clear any list formatting. + */ + +Script { + property string orderedLetters + property string unorderedMarkers + + property variant settingsVariables: [ + { + "identifier": "orderedLetters", + "name": "Letters to use for ordered lists", + "description": "Letters/symbol and their order to use for ordered list", + "type": "string", + "default": "abcdefghijklmnopqrstuvwxyz", + }, + { + "identifier": "unorderedMarkers", + "name": "Unordered list item markers", + "description": "Put the symbols you want to use as marked list item markers. Spaces and commas are ignored.", + "type": "string", + "default": "- • ‣", + } + ] + + property string letters + property string markers + + function init() { + script.registerCustomAction("list 123", "1. 2. 3. list", "1.", "", true) + + if (orderedLetters) { + letters = orderedLetters.replace(/[\s,;]/g, "") + var orderedLettersListIcon = letters[0] + "." + var orderedLettersListName = "%1. %2. %3. list".arg(letters[0]).arg(letters[1]).arg(letters[2]) + + script.registerCustomAction("list abc", orderedLettersListName, orderedLettersListIcon, "", true) + } + + if (unorderedMarkers) { + markers = unorderedMarkers.replace(/[\s,;]/g, "") + for (var n = 0; n < markers.length; n++) { + if (markers[n] != " " && markers[n] != ",") + script.registerCustomAction("list " + markers[n], markers[n] + " list", markers[n]) + } + } + script.registerCustomAction("list " + markers[0], "%1 list".arg(markers[0]), "", "", true, true) + script.registerCustomAction("list clear", "Clear list formatting", "X", "", true) + } + + function getListType(text) { + if (text.search(/^\d+\. /) == 0) + var type = "number" + else if (letters.indexOf(text.substring(0, 1)) != -1 && text.substring(1, 3) == ". ") + var type = "letter" + else if (markers.indexOf(text.substring(0, 1)) != -1 && text.substring(1, 2) == " ") + var type = "mark" + else + var type = "none" + + return type + } + + function clearLine(text) { + var line = text + var lineType = getListType(line) + + while (lineType != "none") { + if (lineType == "number") + line = line.replace(/^\d+\. /, "") + else if (lineType == "letter") + line = line.substring(3) + else if (lineType == "mark") + line = line.substring(2) + + lineType = getListType(line) + } + return line + } + + function customActionInvoked(action) { + if (action.substring(0, 5) == "list ") { + + var type = getListType(script.noteTextEditSelectedText()) + var lines = script.noteTextEditSelectedText().split("\n") + var newText = [] + + if (action == "list 123" && type == "number") + number = lines[0].match(/^\d+/) - 1 + else if (action == "list abc" && type == "letter") + number = letters.indexOf(lines[0].substring(0, 1)) + else + var number = 0 + + for (var n = 0; n < lines.length; n++) { + + if (lines[n] == "" || lines[n].search(/^\s/) != -1) { + newText.push(lines[n]) + continue + } + + var line = (clearLine(lines[n])) + + if (action == "list clear") { + newText.push(line) + continue + } + else if (action == "list 123") { + number++ + var mark = number + ". " + } + else if (action == "list abc") + var mark = letters[number++] + ". " + else + var mark = action.substring(5, 6) + " " + + newText.push(mark + line) + } + + script.noteTextEditWrite(newText.join("\n")) + } + } +} +