94 lines
2.2 KiB
TypeScript
94 lines
2.2 KiB
TypeScript
import { App, Editor, Plugin, PluginSettingTab, Setting } from 'obsidian';
|
|
|
|
const hljs = require('highlight.js/lib/common');
|
|
|
|
interface CodeBlockPluginSettings {
|
|
languages: string[];
|
|
}
|
|
|
|
function getDefaultLanguages() {
|
|
return hljs.listLanguages();
|
|
}
|
|
|
|
const DEFAULT_SETTINGS: CodeBlockPluginSettings = {
|
|
languages: getDefaultLanguages()
|
|
}
|
|
|
|
export default class CodeBlockPlugin extends Plugin {
|
|
settings: CodeBlockPluginSettings;
|
|
|
|
async onload() {
|
|
await this.loadSettings();
|
|
|
|
this.addCommand({
|
|
id: 'Code block',
|
|
name: 'Add code block',
|
|
editorCallback: (editor: Editor) => {
|
|
const selection = editor.getSelection();
|
|
if (selection.length == 0) {
|
|
const pos = editor.getCursor();
|
|
editor.replaceRange( '```\n\n```\n', pos);
|
|
editor.setCursor(pos.line + 1);
|
|
return;
|
|
}
|
|
editor.replaceSelection(CodeBlockPlugin.addCodeBlock(this.getLanguage(selection), selection));
|
|
}
|
|
});
|
|
|
|
this.addSettingTab(new CodeBlockTab(this.app, this));
|
|
}
|
|
|
|
private static addCodeBlock(language: string, selection: string) {
|
|
return '```' + language + '\n' + selection + '\n```' + '\n';
|
|
}
|
|
|
|
private getLanguage(selection: string) {
|
|
return hljs.highlightAuto(selection, this.settings.languages).language;
|
|
}
|
|
|
|
onunload() {
|
|
}
|
|
|
|
async loadSettings() {
|
|
this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData());
|
|
}
|
|
|
|
async saveSettings() {
|
|
await this.saveData(this.settings);
|
|
}
|
|
}
|
|
|
|
|
|
class CodeBlockTab extends PluginSettingTab {
|
|
plugin: CodeBlockPlugin;
|
|
|
|
constructor(app: App, plugin: CodeBlockPlugin) {
|
|
super(app, plugin);
|
|
this.plugin = plugin;
|
|
}
|
|
|
|
display(): void {
|
|
const { containerEl } = this;
|
|
containerEl.empty();
|
|
containerEl.createEl('h2', { text: 'Settings for code-block plugin' });
|
|
|
|
hljs.listLanguages().sort().forEach((language: string) => {
|
|
const index = this.plugin.settings.languages.indexOf(language);
|
|
const active = index !== -1;
|
|
|
|
return new Setting(containerEl)
|
|
.setName(language)
|
|
.addToggle(toggle => toggle
|
|
.setValue(active)
|
|
.onChange(async () => {
|
|
if (active) {
|
|
this.plugin.settings.languages.splice(index, 1);
|
|
} else {
|
|
this.plugin.settings.languages.push(language);
|
|
}
|
|
await this.plugin.saveSettings();
|
|
}));
|
|
});
|
|
}
|
|
}
|