mirror of
https://github.com/zsviczian/obsidian-excalidraw-plugin.git
synced 2025-08-06 05:46:28 +00:00
Compare commits
3 Commits
2.6.4
...
fix-textwr
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bb83523c0f | ||
|
|
f83c0a8458 | ||
|
|
7411d51477 |
@@ -1,6 +1,7 @@
|
|||||||
import {
|
import {
|
||||||
App,
|
App,
|
||||||
Instruction,
|
Instruction,
|
||||||
|
normalizePath,
|
||||||
TAbstractFile,
|
TAbstractFile,
|
||||||
TFile,
|
TFile,
|
||||||
WorkspaceLeaf,
|
WorkspaceLeaf,
|
||||||
@@ -22,6 +23,7 @@ export type ScriptIconMap = {
|
|||||||
|
|
||||||
export class ScriptEngine {
|
export class ScriptEngine {
|
||||||
private plugin: ExcalidrawPlugin;
|
private plugin: ExcalidrawPlugin;
|
||||||
|
private app: App;
|
||||||
private scriptPath: string;
|
private scriptPath: string;
|
||||||
//https://stackoverflow.com/questions/60218638/how-to-force-re-render-if-map-value-changes
|
//https://stackoverflow.com/questions/60218638/how-to-force-re-render-if-map-value-changes
|
||||||
public scriptIconMap: ScriptIconMap;
|
public scriptIconMap: ScriptIconMap;
|
||||||
@@ -29,6 +31,7 @@ export class ScriptEngine {
|
|||||||
|
|
||||||
constructor(plugin: ExcalidrawPlugin) {
|
constructor(plugin: ExcalidrawPlugin) {
|
||||||
this.plugin = plugin;
|
this.plugin = plugin;
|
||||||
|
this.app = plugin.app;
|
||||||
this.scriptIconMap = {};
|
this.scriptIconMap = {};
|
||||||
this.loadScripts();
|
this.loadScripts();
|
||||||
this.registerEventHandlers();
|
this.registerEventHandlers();
|
||||||
@@ -58,7 +61,7 @@ export class ScriptEngine {
|
|||||||
if (!path.endsWith(".svg")) {
|
if (!path.endsWith(".svg")) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const scriptFile = app.vault.getAbstractFileByPath(
|
const scriptFile = this.app.vault.getAbstractFileByPath(
|
||||||
getIMGFilename(path, "md"),
|
getIMGFilename(path, "md"),
|
||||||
);
|
);
|
||||||
if (scriptFile && scriptFile instanceof TFile) {
|
if (scriptFile && scriptFile instanceof TFile) {
|
||||||
@@ -107,19 +110,19 @@ export class ScriptEngine {
|
|||||||
|
|
||||||
registerEventHandlers() {
|
registerEventHandlers() {
|
||||||
this.plugin.registerEvent(
|
this.plugin.registerEvent(
|
||||||
this.plugin.app.vault.on(
|
this.app.vault.on(
|
||||||
"delete",
|
"delete",
|
||||||
(file: TFile)=>this.deleteEventHandler(file)
|
(file: TFile)=>this.deleteEventHandler(file)
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
this.plugin.registerEvent(
|
this.plugin.registerEvent(
|
||||||
this.plugin.app.vault.on(
|
this.app.vault.on(
|
||||||
"create",
|
"create",
|
||||||
(file: TFile)=>this.createEventHandler(file)
|
(file: TFile)=>this.createEventHandler(file)
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
this.plugin.registerEvent(
|
this.plugin.registerEvent(
|
||||||
this.plugin.app.vault.on(
|
this.app.vault.on(
|
||||||
"rename",
|
"rename",
|
||||||
(file: TAbstractFile, oldPath: string)=>this.renameEventHandler(file, oldPath)
|
(file: TAbstractFile, oldPath: string)=>this.renameEventHandler(file, oldPath)
|
||||||
),
|
),
|
||||||
@@ -138,15 +141,16 @@ export class ScriptEngine {
|
|||||||
|
|
||||||
public getListofScripts(): TFile[] {
|
public getListofScripts(): TFile[] {
|
||||||
this.scriptPath = this.plugin.settings.scriptFolderPath;
|
this.scriptPath = this.plugin.settings.scriptFolderPath;
|
||||||
if (!app.vault.getAbstractFileByPath(this.scriptPath)) {
|
if(!this.scriptPath) return;
|
||||||
//this.scriptPath = null;
|
this.scriptPath = normalizePath(this.scriptPath);
|
||||||
|
if (!this.app.vault.getAbstractFileByPath(this.scriptPath)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
return app.vault
|
return this.app.vault
|
||||||
.getFiles()
|
.getFiles()
|
||||||
.filter(
|
.filter(
|
||||||
(f: TFile) =>
|
(f: TFile) =>
|
||||||
f.path.startsWith(this.scriptPath) && f.extension === "md",
|
f.path.startsWith(this.scriptPath+"/") && f.extension === "md",
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -166,7 +170,10 @@ export class ScriptEngine {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const subpath = path.split(`${this.scriptPath}/`)[1];
|
const subpath = path.split(`${this.scriptPath}/`)[1];
|
||||||
const lastSlash = subpath.lastIndexOf("/");
|
if(!subpath) {
|
||||||
|
console.warn(`ScriptEngine.getScriptName unexpected basename: ${basename}; path: ${path}`)
|
||||||
|
}
|
||||||
|
const lastSlash = subpath?.lastIndexOf("/");
|
||||||
if (lastSlash > -1) {
|
if (lastSlash > -1) {
|
||||||
return subpath.substring(0, lastSlash + 1) + basename;
|
return subpath.substring(0, lastSlash + 1) + basename;
|
||||||
}
|
}
|
||||||
@@ -175,10 +182,10 @@ export class ScriptEngine {
|
|||||||
|
|
||||||
async addScriptIconToMap(scriptPath: string, name: string) {
|
async addScriptIconToMap(scriptPath: string, name: string) {
|
||||||
const svgFilePath = getIMGFilename(scriptPath, "svg");
|
const svgFilePath = getIMGFilename(scriptPath, "svg");
|
||||||
const file = app.vault.getAbstractFileByPath(svgFilePath);
|
const file = this.app.vault.getAbstractFileByPath(svgFilePath);
|
||||||
const svgString: string =
|
const svgString: string =
|
||||||
file && file instanceof TFile
|
file && file instanceof TFile
|
||||||
? await app.vault.read(file)
|
? await this.app.vault.read(file)
|
||||||
: null;
|
: null;
|
||||||
this.scriptIconMap = {
|
this.scriptIconMap = {
|
||||||
...this.scriptIconMap,
|
...this.scriptIconMap,
|
||||||
@@ -199,12 +206,12 @@ export class ScriptEngine {
|
|||||||
name: `(Script) ${scriptName}`,
|
name: `(Script) ${scriptName}`,
|
||||||
checkCallback: (checking: boolean) => {
|
checkCallback: (checking: boolean) => {
|
||||||
if (checking) {
|
if (checking) {
|
||||||
return Boolean(app.workspace.getActiveViewOfType(ExcalidrawView));
|
return Boolean(this.app.workspace.getActiveViewOfType(ExcalidrawView));
|
||||||
}
|
}
|
||||||
const view = app.workspace.getActiveViewOfType(ExcalidrawView);
|
const view = this.app.workspace.getActiveViewOfType(ExcalidrawView);
|
||||||
if (view) {
|
if (view) {
|
||||||
(async()=>{
|
(async()=>{
|
||||||
const script = await app.vault.read(f);
|
const script = await this.app.vault.read(f);
|
||||||
if(script) {
|
if(script) {
|
||||||
//remove YAML frontmatter if present
|
//remove YAML frontmatter if present
|
||||||
this.executeScript(view, script, scriptName,f);
|
this.executeScript(view, script, scriptName,f);
|
||||||
@@ -218,7 +225,7 @@ export class ScriptEngine {
|
|||||||
}
|
}
|
||||||
|
|
||||||
unloadScripts() {
|
unloadScripts() {
|
||||||
const scripts = app.vault
|
const scripts = this.app.vault
|
||||||
.getFiles()
|
.getFiles()
|
||||||
.filter((f: TFile) => f.path.startsWith(this.scriptPath));
|
.filter((f: TFile) => f.path.startsWith(this.scriptPath));
|
||||||
scripts.forEach((f) => {
|
scripts.forEach((f) => {
|
||||||
@@ -236,11 +243,11 @@ export class ScriptEngine {
|
|||||||
|
|
||||||
const commandId = `${PLUGIN_ID}:${basename}`;
|
const commandId = `${PLUGIN_ID}:${basename}`;
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
if (!this.plugin.app.commands.commands[commandId]) {
|
if (!this.app.commands.commands[commandId]) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
delete this.plugin.app.commands.commands[commandId];
|
delete this.app.commands.commands[commandId];
|
||||||
}
|
}
|
||||||
|
|
||||||
async executeScript(view: ExcalidrawView, script: string, title: string, file: TFile) {
|
async executeScript(view: ExcalidrawView, script: string, title: string, file: TFile) {
|
||||||
@@ -271,7 +278,7 @@ export class ScriptEngine {
|
|||||||
ScriptEngine.inputPrompt(
|
ScriptEngine.inputPrompt(
|
||||||
view,
|
view,
|
||||||
this.plugin,
|
this.plugin,
|
||||||
this.plugin.app,
|
this.app,
|
||||||
header,
|
header,
|
||||||
placeholder,
|
placeholder,
|
||||||
value,
|
value,
|
||||||
@@ -288,7 +295,7 @@ export class ScriptEngine {
|
|||||||
instructions?: Instruction[],
|
instructions?: Instruction[],
|
||||||
) =>
|
) =>
|
||||||
ScriptEngine.suggester(
|
ScriptEngine.suggester(
|
||||||
this.plugin.app,
|
this.app,
|
||||||
displayItems,
|
displayItems,
|
||||||
items,
|
items,
|
||||||
hint,
|
hint,
|
||||||
@@ -304,7 +311,7 @@ export class ScriptEngine {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private updateToolPannels() {
|
private updateToolPannels() {
|
||||||
const excalidrawViews = getExcalidrawViews(this.plugin.app);
|
const excalidrawViews = getExcalidrawViews(this.app);
|
||||||
excalidrawViews.forEach(excalidrawView => {
|
excalidrawViews.forEach(excalidrawView => {
|
||||||
excalidrawView.toolsPanelRef?.current?.updateScriptIconMap(
|
excalidrawView.toolsPanelRef?.current?.updateScriptIconMap(
|
||||||
this.scriptIconMap,
|
this.scriptIconMap,
|
||||||
|
|||||||
@@ -6,6 +6,8 @@ import { TAG_AUTOEXPORT, TAG_MDREADINGMODE, TAG_PDFEXPORT } from "src/constants/
|
|||||||
import { labelALT, labelCTRL, labelMETA, labelSHIFT } from "src/utils/ModifierkeyHelper";
|
import { labelALT, labelCTRL, labelMETA, labelSHIFT } from "src/utils/ModifierkeyHelper";
|
||||||
|
|
||||||
const CJK_FONTS = "CJK Fonts";
|
const CJK_FONTS = "CJK Fonts";
|
||||||
|
declare const PLUGIN_VERSION:string;
|
||||||
|
|
||||||
// 简体中文
|
// 简体中文
|
||||||
export default {
|
export default {
|
||||||
// main.ts
|
// main.ts
|
||||||
@@ -870,6 +872,7 @@ FILENAME_HEAD: "文件名",
|
|||||||
对此带来的不便,我深表歉意。
|
对此带来的不便,我深表歉意。
|
||||||
</p>
|
</p>
|
||||||
`,
|
`,
|
||||||
|
|
||||||
//ObsidianMenu.tsx
|
//ObsidianMenu.tsx
|
||||||
GOTO_FULLSCREEN: "进入全屏模式",
|
GOTO_FULLSCREEN: "进入全屏模式",
|
||||||
EXIT_FULLSCREEN: "退出全屏模式",
|
EXIT_FULLSCREEN: "退出全屏模式",
|
||||||
@@ -958,4 +961,7 @@ FILENAME_HEAD: "文件名",
|
|||||||
IPM_GROUP_PAGES_DESC: "这将把所有页面建立为一个单独的组。如果您在导入后锁定页面,建议使用此方法,因为这样可以更方便地解锁整个组,而不是逐个解锁。",
|
IPM_GROUP_PAGES_DESC: "这将把所有页面建立为一个单独的组。如果您在导入后锁定页面,建议使用此方法,因为这样可以更方便地解锁整个组,而不是逐个解锁。",
|
||||||
IPM_SELECT_PDF: "请选择一个 PDF 文件",
|
IPM_SELECT_PDF: "请选择一个 PDF 文件",
|
||||||
|
|
||||||
};
|
//Utils.ts
|
||||||
|
UPDATE_AVAILABLE: `Excalidraw 的新版本已在社区插件中可用。\n\n您正在使用 ${PLUGIN_VERSION}。\n最新版本是`,
|
||||||
|
ERROR_PNG_TOO_LARGE: "导出 PNG 时出错 - PNG 文件过大,请尝试较小的分辨率",
|
||||||
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user