├── .gitignore ├── .prettierrc.json ├── LICENSE ├── README.md ├── main.ts ├── manifest.json ├── package-lock.json ├── package.json ├── rollup.config.js ├── tsconfig.json ├── versions.json └── workspace.code-workspace /.gitignore: -------------------------------------------------------------------------------- 1 | # Intellij 2 | *.iml 3 | .idea 4 | 5 | # npm 6 | node_modules 7 | 8 | # build 9 | main.js 10 | *.js.map 11 | data.json 12 | -------------------------------------------------------------------------------- /.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "trailingComma": "es5", 3 | "tabWidth": 2, 4 | "useTabs": false, 5 | "semi": true, 6 | "singleQuote": false, 7 | "arrowParens": "avoid" 8 | } 9 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Dmitry Savosh (d.savosh@gmail.com) 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Code block from selection 2 | 3 | This plugin for [Obsidian](https://obsidian.md/) adds a "Code block from selection" command that turns the selected text into a code block. It just adds \`\`\` before and after the selected text. In the plugin settings you can specify which language to use in the code block. You can add as many languages as you like and assign hotkeys to them. 4 | 5 | ## How to configure 6 | 7 | Specify the programming language in the plugin settings (for example "c++"), then add the desired hotkey for the "Code block from selection" command on the Obsidian hotkeys panel. 8 | 9 | ## How to use 10 | 11 | Just select the text with code or put the cursor on the desired line and press hotkey. 12 | 13 | -------------------------------------------------------------------------------- /main.ts: -------------------------------------------------------------------------------- 1 | import { 2 | App, 3 | Plugin, 4 | PluginSettingTab, 5 | Setting, 6 | MarkdownView, 7 | addIcon, 8 | } from "obsidian"; 9 | import * as CodeMirror from "codemirror"; 10 | 11 | interface languageMap { 12 | [name: string]: string; 13 | } 14 | interface PluginSettings { 15 | languages: languageMap; 16 | } 17 | 18 | const DEFAULT_SETTINGS: PluginSettings = { 19 | languages: { "e3dea0f5-37f2-4d79-ae58-490af3228069": "js" }, 20 | }; 21 | 22 | interface SelectionRange { 23 | start: { line: number; ch: number }; 24 | end: { line: number; ch: number }; 25 | } 26 | 27 | export default class CodeBlockFromSelection extends Plugin { 28 | settings: PluginSettings; 29 | 30 | async onload() { 31 | await this.loadSettings(); 32 | this.initCommands(); 33 | this.addSettingTab(new SettingTab(this.app, this)); 34 | } 35 | 36 | initCommands(): void { 37 | for (const [uuid, language] of Object.entries(this.settings.languages)) { 38 | this.addCommand({ 39 | id: uuid, 40 | name: language, 41 | callback: () => this.insertCodeBlock(language), 42 | }); 43 | } 44 | } 45 | 46 | _addCommand(id: string, language: string) { 47 | this.addCommand({ 48 | id: id, 49 | name: language, 50 | callback: () => this.insertCodeBlock(language), 51 | }); 52 | } 53 | 54 | uuid(): string { 55 | var d = Date.now(); 56 | if ( 57 | typeof performance !== "undefined" && 58 | typeof performance.now === "function" 59 | ) { 60 | d += performance.now(); //use high-precision timer if available 61 | } 62 | return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace( 63 | /[xy]/g, 64 | function (c) { 65 | var r = (d + Math.random() * 16) % 16 | 0; 66 | d = Math.floor(d / 16); 67 | return (c === "x" ? r : (r & 0x3) | 0x8).toString(16); 68 | } 69 | ); 70 | } 71 | 72 | insertCodeBlock(language: string): void { 73 | let editor = this.getEditor(); 74 | if (editor) { 75 | let selectedText = this.getSelectedText(editor); 76 | let line = this.getLineUnderCursor(editor).start.line; 77 | 78 | editor.replaceSelection(`\`\`\`${language}\n${selectedText}\n\`\`\`\n`); 79 | if (!selectedText) { 80 | editor.setSelection({ line: line + 1, ch: 0 }); 81 | } 82 | } 83 | } 84 | 85 | getEditor(): CodeMirror.Editor { 86 | return this.app.workspace.getActiveViewOfType(MarkdownView)?.sourceMode 87 | .cmEditor; 88 | } 89 | 90 | getSelectedText(editor: CodeMirror.Editor): string { 91 | if (!editor.somethingSelected()) this.selectLineUnderCursor(editor); 92 | 93 | return editor.getSelection(); 94 | } 95 | 96 | selectLineUnderCursor(editor: CodeMirror.Editor) { 97 | let selection = this.getLineUnderCursor(editor); 98 | editor.getDoc().setSelection(selection.start, selection.end); 99 | } 100 | 101 | getLineUnderCursor(editor: CodeMirror.Editor): SelectionRange { 102 | let fromCh, toCh: number; 103 | let cursor = editor.getCursor(); 104 | 105 | fromCh = 0; 106 | toCh = editor.getLine(cursor.line).length; 107 | 108 | return { 109 | start: { line: cursor.line, ch: fromCh }, 110 | end: { line: cursor.line, ch: toCh }, 111 | }; 112 | } 113 | 114 | async loadSettings() { 115 | this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData()); 116 | } 117 | 118 | async saveSettings() { 119 | await this.saveData(this.settings); 120 | } 121 | } 122 | 123 | class SettingTab extends PluginSettingTab { 124 | plugin: CodeBlockFromSelection; 125 | 126 | constructor(app: App, plugin: CodeBlockFromSelection) { 127 | super(app, plugin); 128 | this.plugin = plugin; 129 | } 130 | 131 | display(): void { 132 | let { containerEl } = this; 133 | 134 | containerEl.empty(); 135 | 136 | containerEl.createEl("h2", { 137 | text: "Code block from selection - Settings", 138 | }); 139 | 140 | new Setting(containerEl).setName("Add new language").addButton(cb => { 141 | cb.setButtonText("Add"); 142 | cb.setCta(); 143 | cb.onClick(() => { 144 | this.addNewLanguage(); 145 | }); 146 | }); 147 | 148 | // init settingtab 149 | for (const [uuid, language] of Object.entries( 150 | this.plugin.settings.languages 151 | )) { 152 | const setting = new Setting(containerEl); 153 | setting 154 | .setName("Language") 155 | .setDesc("") 156 | .addText(text => 157 | text 158 | .setPlaceholder("add new language") 159 | .setValue(language) 160 | .onChange(async value => { 161 | this.plugin.settings.languages[uuid] = value; 162 | await this.plugin.saveSettings(); 163 | 164 | this.plugin._addCommand(uuid, value); 165 | }) 166 | ); 167 | this.addExtraButton(setting, uuid); 168 | } 169 | } 170 | 171 | addNewLanguage() { 172 | let setting = new Setting(this.containerEl); 173 | let uuid = this.plugin.uuid(); 174 | 175 | setting 176 | .setName("language") 177 | .setDesc("") 178 | .addText(text => 179 | text.setPlaceholder("add new language").onChange(async value => { 180 | this.plugin.settings.languages[uuid] = value; 181 | await this.plugin.saveSettings(); 182 | 183 | this.plugin._addCommand(uuid, value); 184 | }) 185 | ); 186 | 187 | this.addExtraButton(setting, uuid); 188 | } 189 | 190 | addExtraButton(setting: Setting, uuid: string) { 191 | setting.addExtraButton(cb => { 192 | cb.setIcon("cross"); 193 | cb.setTooltip("Remove"); 194 | cb.onClick(() => { 195 | delete this.plugin.settings.languages[uuid]; 196 | this.plugin.saveSettings(); 197 | (this.plugin.app as any).commands.removeCommand( 198 | `${this.plugin.manifest.id}:${uuid}` 199 | ); 200 | setting.settingEl.hide(); 201 | }); 202 | }); 203 | } 204 | } 205 | -------------------------------------------------------------------------------- /manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "code-block-from-selection", 3 | "name": "Code block from selection", 4 | "version": "1.0.7", 5 | "minAppVersion": "0.9.12", 6 | "description": "Adds code block for the selected text", 7 | "author": "Dmitry Savosh", 8 | "authorUrl": "https://github.com/dy-sh/", 9 | "isDesktopOnly": false 10 | } 11 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "obsidian-code-block-from-selection", 3 | "version": "1.0.6", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@rollup/plugin-commonjs": { 8 | "version": "15.1.0", 9 | "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-15.1.0.tgz", 10 | "integrity": "sha512-xCQqz4z/o0h2syQ7d9LskIMvBSH4PX5PjYdpSSvgS+pQik3WahkQVNWg3D8XJeYjZoVWnIUQYDghuEMRGrmQYQ==", 11 | "dev": true, 12 | "requires": { 13 | "@rollup/pluginutils": "^3.1.0", 14 | "commondir": "^1.0.1", 15 | "estree-walker": "^2.0.1", 16 | "glob": "^7.1.6", 17 | "is-reference": "^1.2.1", 18 | "magic-string": "^0.25.7", 19 | "resolve": "^1.17.0" 20 | } 21 | }, 22 | "@rollup/plugin-node-resolve": { 23 | "version": "9.0.0", 24 | "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-9.0.0.tgz", 25 | "integrity": "sha512-gPz+utFHLRrd41WMP13Jq5mqqzHL3OXrfj3/MkSyB6UBIcuNt9j60GCbarzMzdf1VHFpOxfQh/ez7wyadLMqkg==", 26 | "dev": true, 27 | "requires": { 28 | "@rollup/pluginutils": "^3.1.0", 29 | "@types/resolve": "1.17.1", 30 | "builtin-modules": "^3.1.0", 31 | "deepmerge": "^4.2.2", 32 | "is-module": "^1.0.0", 33 | "resolve": "^1.17.0" 34 | } 35 | }, 36 | "@rollup/plugin-typescript": { 37 | "version": "6.1.0", 38 | "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-6.1.0.tgz", 39 | "integrity": "sha512-hJxaiE6WyNOsK+fZpbFh9CUijZYqPQuAOWO5khaGTUkM8DYNNyA2TDlgamecE+qLOG1G1+CwbWMAx3rbqpp6xQ==", 40 | "dev": true, 41 | "requires": { 42 | "@rollup/pluginutils": "^3.1.0", 43 | "resolve": "^1.17.0" 44 | } 45 | }, 46 | "@rollup/pluginutils": { 47 | "version": "3.1.0", 48 | "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", 49 | "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", 50 | "dev": true, 51 | "requires": { 52 | "@types/estree": "0.0.39", 53 | "estree-walker": "^1.0.1", 54 | "picomatch": "^2.2.2" 55 | }, 56 | "dependencies": { 57 | "estree-walker": { 58 | "version": "1.0.1", 59 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", 60 | "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", 61 | "dev": true 62 | } 63 | } 64 | }, 65 | "@types/codemirror": { 66 | "version": "0.0.108", 67 | "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-0.0.108.tgz", 68 | "integrity": "sha512-3FGFcus0P7C2UOGCNUVENqObEb4SFk+S8Dnxq7K6aIsLVs/vDtlangl3PEO0ykaKXyK56swVF6Nho7VsA44uhw==", 69 | "dev": true, 70 | "requires": { 71 | "@types/tern": "*" 72 | } 73 | }, 74 | "@types/estree": { 75 | "version": "0.0.39", 76 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", 77 | "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", 78 | "dev": true 79 | }, 80 | "@types/node": { 81 | "version": "14.14.43", 82 | "resolved": "https://registry.nlark.com/@types/node/download/@types/node-14.14.43.tgz?cache=0&sync_timestamp=1619534652156&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Fnode%2Fdownload%2F%40types%2Fnode-14.14.43.tgz", 83 | "integrity": "sha1-Jry7BZWzBUAOjOr5oSen+QWuScg=", 84 | "dev": true 85 | }, 86 | "@types/resolve": { 87 | "version": "1.17.1", 88 | "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", 89 | "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", 90 | "dev": true, 91 | "requires": { 92 | "@types/node": "*" 93 | } 94 | }, 95 | "@types/tern": { 96 | "version": "0.23.4", 97 | "resolved": "https://registry.npmjs.org/@types/tern/-/tern-0.23.4.tgz", 98 | "integrity": "sha512-JAUw1iXGO1qaWwEOzxTKJZ/5JxVeON9kvGZ/osgZaJImBnyjyn0cjovPsf6FNLmyGY8Vw9DoXZCMlfMkMwHRWg==", 99 | "dev": true, 100 | "requires": { 101 | "@types/estree": "*" 102 | } 103 | }, 104 | "balanced-match": { 105 | "version": "1.0.2", 106 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 107 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 108 | "dev": true 109 | }, 110 | "brace-expansion": { 111 | "version": "1.1.11", 112 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 113 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 114 | "dev": true, 115 | "requires": { 116 | "balanced-match": "^1.0.0", 117 | "concat-map": "0.0.1" 118 | } 119 | }, 120 | "builtin-modules": { 121 | "version": "3.2.0", 122 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz", 123 | "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==", 124 | "dev": true 125 | }, 126 | "commondir": { 127 | "version": "1.0.1", 128 | "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", 129 | "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", 130 | "dev": true 131 | }, 132 | "concat-map": { 133 | "version": "0.0.1", 134 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 135 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 136 | "dev": true 137 | }, 138 | "deepmerge": { 139 | "version": "4.2.2", 140 | "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", 141 | "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", 142 | "dev": true 143 | }, 144 | "estree-walker": { 145 | "version": "2.0.2", 146 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", 147 | "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", 148 | "dev": true 149 | }, 150 | "fs.realpath": { 151 | "version": "1.0.0", 152 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 153 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 154 | "dev": true 155 | }, 156 | "fsevents": { 157 | "version": "2.3.2", 158 | "resolved": "https://registry.npm.taobao.org/fsevents/download/fsevents-2.3.2.tgz?cache=0&sync_timestamp=1612537044236&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffsevents%2Fdownload%2Ffsevents-2.3.2.tgz", 159 | "integrity": "sha1-ilJveLj99GI7cJ4Ll1xSwkwC/Ro=", 160 | "dev": true, 161 | "optional": true 162 | }, 163 | "function-bind": { 164 | "version": "1.1.1", 165 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 166 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 167 | "dev": true 168 | }, 169 | "glob": { 170 | "version": "7.1.7", 171 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", 172 | "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", 173 | "dev": true, 174 | "requires": { 175 | "fs.realpath": "^1.0.0", 176 | "inflight": "^1.0.4", 177 | "inherits": "2", 178 | "minimatch": "^3.0.4", 179 | "once": "^1.3.0", 180 | "path-is-absolute": "^1.0.0" 181 | } 182 | }, 183 | "has": { 184 | "version": "1.0.3", 185 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 186 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 187 | "dev": true, 188 | "requires": { 189 | "function-bind": "^1.1.1" 190 | } 191 | }, 192 | "inflight": { 193 | "version": "1.0.6", 194 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 195 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 196 | "dev": true, 197 | "requires": { 198 | "once": "^1.3.0", 199 | "wrappy": "1" 200 | } 201 | }, 202 | "inherits": { 203 | "version": "2.0.4", 204 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 205 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 206 | "dev": true 207 | }, 208 | "is-core-module": { 209 | "version": "2.6.0", 210 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.6.0.tgz", 211 | "integrity": "sha512-wShG8vs60jKfPWpF2KZRaAtvt3a20OAn7+IJ6hLPECpSABLcKtFKTTI4ZtH5QcBruBHlq+WsdHWyz0BCZW7svQ==", 212 | "dev": true, 213 | "requires": { 214 | "has": "^1.0.3" 215 | } 216 | }, 217 | "is-module": { 218 | "version": "1.0.0", 219 | "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", 220 | "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", 221 | "dev": true 222 | }, 223 | "is-reference": { 224 | "version": "1.2.1", 225 | "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", 226 | "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", 227 | "dev": true, 228 | "requires": { 229 | "@types/estree": "*" 230 | } 231 | }, 232 | "magic-string": { 233 | "version": "0.25.7", 234 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", 235 | "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", 236 | "dev": true, 237 | "requires": { 238 | "sourcemap-codec": "^1.4.4" 239 | } 240 | }, 241 | "minimatch": { 242 | "version": "3.0.4", 243 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 244 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 245 | "dev": true, 246 | "requires": { 247 | "brace-expansion": "^1.1.7" 248 | } 249 | }, 250 | "moment": { 251 | "version": "2.29.1", 252 | "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", 253 | "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==", 254 | "dev": true 255 | }, 256 | "obsidian": { 257 | "version": "https://github.com/obsidianmd/obsidian-api/tarball/master", 258 | "integrity": "sha512-uUVTUpsk+LqhCdPJCxBwOuQ3cXOf63vbman1iOa/X6cjEguzqIsv+nomMZVnrmyXedbP1hM+YJYYh+gVSrKAlg==", 259 | "dev": true, 260 | "requires": { 261 | "@types/codemirror": "0.0.108", 262 | "moment": "2.29.1" 263 | } 264 | }, 265 | "once": { 266 | "version": "1.4.0", 267 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 268 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 269 | "dev": true, 270 | "requires": { 271 | "wrappy": "1" 272 | } 273 | }, 274 | "path-is-absolute": { 275 | "version": "1.0.1", 276 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 277 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 278 | "dev": true 279 | }, 280 | "path-parse": { 281 | "version": "1.0.7", 282 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 283 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 284 | "dev": true 285 | }, 286 | "picomatch": { 287 | "version": "2.3.0", 288 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", 289 | "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", 290 | "dev": true 291 | }, 292 | "resolve": { 293 | "version": "1.20.0", 294 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", 295 | "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", 296 | "dev": true, 297 | "requires": { 298 | "is-core-module": "^2.2.0", 299 | "path-parse": "^1.0.6" 300 | } 301 | }, 302 | "rollup": { 303 | "version": "2.45.2", 304 | "resolved": "https://registry.npm.taobao.org/rollup/download/rollup-2.45.2.tgz", 305 | "integrity": "sha1-j7hZF8nzVgVyDpIyjzzL+6b3i0g=", 306 | "dev": true, 307 | "requires": { 308 | "fsevents": "~2.3.1" 309 | } 310 | }, 311 | "sourcemap-codec": { 312 | "version": "1.4.8", 313 | "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", 314 | "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", 315 | "dev": true 316 | }, 317 | "tslib": { 318 | "version": "2.2.0", 319 | "resolved": "https://registry.nlark.com/tslib/download/tslib-2.2.0.tgz?cache=0&sync_timestamp=1618847132149&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftslib%2Fdownload%2Ftslib-2.2.0.tgz", 320 | "integrity": "sha1-+yxHWXfjXiQTEe3iaTzuHsZpj1w=", 321 | "dev": true 322 | }, 323 | "typescript": { 324 | "version": "4.2.4", 325 | "resolved": "https://registry.nlark.com/typescript/download/typescript-4.2.4.tgz", 326 | "integrity": "sha1-hhC1l0feAo/aiYqK7w4QPxVtCWE=", 327 | "dev": true 328 | }, 329 | "wrappy": { 330 | "version": "1.0.2", 331 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 332 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 333 | "dev": true 334 | } 335 | } 336 | } 337 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "obsidian-code-block-from-selection", 3 | "version": "1.0.7", 4 | "description": "Adds code block for the selected text", 5 | "main": "main.js", 6 | "scripts": { 7 | "dev": "rollup --config rollup.config.js -w", 8 | "build": "rollup --config rollup.config.js" 9 | }, 10 | "keywords": [], 11 | "author": "", 12 | "license": "MIT", 13 | "devDependencies": { 14 | "@rollup/plugin-commonjs": "^15.1.0", 15 | "@rollup/plugin-node-resolve": "^9.0.0", 16 | "@rollup/plugin-typescript": "^6.0.0", 17 | "@types/node": "^14.14.2", 18 | "obsidian": "https://github.com/obsidianmd/obsidian-api/tarball/master", 19 | "rollup": "^2.32.1", 20 | "tslib": "^2.0.3", 21 | "typescript": "^4.0.3" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /rollup.config.js: -------------------------------------------------------------------------------- 1 | import typescript from '@rollup/plugin-typescript'; 2 | import {nodeResolve} from '@rollup/plugin-node-resolve'; 3 | import commonjs from '@rollup/plugin-commonjs'; 4 | 5 | const banner = 6 | `/* 7 | THIS IS A GENERATED/BUNDLED FILE BY ROLLUP 8 | if you want to view the source visit the plugins github repository 9 | */ 10 | `; 11 | 12 | export default { 13 | input: 'main.ts', 14 | output: { 15 | dir: '.', 16 | sourcemap: 'inline', 17 | format: 'cjs', 18 | exports: 'default', 19 | banner, 20 | }, 21 | external: ['obsidian'], 22 | plugins: [ 23 | typescript(), 24 | nodeResolve({browser: true}), 25 | commonjs(), 26 | ] 27 | }; -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "baseUrl": ".", 4 | "inlineSourceMap": true, 5 | "inlineSources": true, 6 | "module": "ESNext", 7 | "target": "es6", 8 | "allowJs": true, 9 | "noImplicitAny": true, 10 | "moduleResolution": "node", 11 | "importHelpers": true, 12 | "lib": ["dom", "es5", "scripthost", "es2015", "es2019"] 13 | }, 14 | "include": ["**/*.ts"] 15 | } 16 | -------------------------------------------------------------------------------- /versions.json: -------------------------------------------------------------------------------- 1 | { 2 | "1.0.7": "0.9.12", 3 | "1.0.6": "0.9.12", 4 | "1.0.5": "0.9.12", 5 | "1.0.4": "0.9.12", 6 | "1.0.3": "0.9.12", 7 | "1.0.2": "0.9.12", 8 | "1.0.1": "0.9.12" 9 | } 10 | -------------------------------------------------------------------------------- /workspace.code-workspace: -------------------------------------------------------------------------------- 1 | { 2 | "folders": [ 3 | { 4 | "path": "." 5 | } 6 | ], 7 | "settings": { 8 | "editor.defaultFormatter": "esbenp.prettier-vscode", 9 | "editor.formatOnSave": true, 10 | "editor.tabSize": 2 11 | } 12 | } 13 | --------------------------------------------------------------------------------