Compare commits

..

1 Commits

Author SHA1 Message Date
Zsolt Viczian
75b9083ec8 WIP 2022-10-09 08:10:58 +02:00
12 changed files with 7616 additions and 7658 deletions

View File

@@ -18,7 +18,7 @@
"license": "MIT",
"dependencies": {
"@types/lz-string": "^1.3.34",
"@zsviczian/excalidraw": "0.12.0-obsidian-11",
"@zsviczian/excalidraw": "0.12.0-obsidian-9",
"clsx": "^1.1.1",
"lz-string": "^1.4.4",
"monkey-around": "^2.3.0",

View File

@@ -1,6 +1,6 @@
import { FileId } from "@zsviczian/excalidraw/types/element/types";
import { BinaryFileData, DataURL } from "@zsviczian/excalidraw/types/types";
import { App, MarkdownRenderer, Notice, TFile, request } from "obsidian";
import { App, MarkdownRenderer, Notice, TFile } from "obsidian";
import {
CASCADIA_FONT,
DEFAULT_MD_EMBED_CSS,
@@ -41,9 +41,6 @@ export declare type MimeType =
| "image/png"
| "image/jpeg"
| "image/gif"
| "image/webp"
| "image/bmp"
| "image/x-icon"
| "application/octet-stream";
export type FileData = BinaryFileData & {
size: Size;
@@ -57,7 +54,6 @@ export type Size = {
export class EmbeddedFile {
public file: TFile = null;
public isHyperlink: boolean = false;
public isSVGwithBitmap: boolean = false;
private img: string = ""; //base64
private imgInverted: string = ""; //base64
@@ -84,12 +80,8 @@ export class EmbeddedFile {
}*/
this.imgInverted = this.img = "";
this.mtime = 0;
this.isHyperlink = imgPath.startsWith("http");
this.hostPath = hostPath;
this.linkParts = getLinkParts(imgPath);
if(this.isHyperlink) return;
this.hostPath = hostPath;
if (!this.linkParts.path) {
new Notice(`Excalidraw Error\nIncorrect embedded filename: ${imgPath}`);
return;
@@ -115,7 +107,6 @@ export class EmbeddedFile {
}
private fileChanged(): boolean {
if(this.isHyperlink) return false;
if (!this.file) {
this.file = app.metadataCache.getFirstLinkpathDest(
this.linkParts.path,
@@ -136,13 +127,13 @@ export class EmbeddedFile {
isDark: boolean,
isSVGwithBitmap: boolean,
) {
if (!this.isHyperlink && !this.file) {
if (!this.file) {
return;
}
if (this.fileChanged()) {
this.imgInverted = this.img = "";
}
this.mtime = this.file ? this.file.stat.mtime : 0;
this.mtime = this.file.stat.mtime;
this.size = size;
this.mimeType = mimeType;
switch (isDark && isSVGwithBitmap) {
@@ -157,13 +148,6 @@ export class EmbeddedFile {
}
public isLoaded(isDark: boolean): boolean {
if(this.isHyperlink) {
if (this.isSVGwithBitmap && isDark) {
return this.imgInverted !== "";
}
return this.img !== "";
}
if (!this.file) {
this.file = app.metadataCache.getFirstLinkpathDest(
this.linkParts.path,
@@ -184,7 +168,10 @@ export class EmbeddedFile {
}
public getImage(isDark: boolean) {
if (!this.isHyperlink && !this.file) {
/*if(this.isHyperlink) {
return this.img;
}*/
if (!this.file) {
return "";
}
if (isDark && this.isSVGwithBitmap) {
@@ -206,11 +193,6 @@ export class EmbeddedFilesLoader {
this.uid = nanoid();
}
private async fetchFromURL(inFile: EmbeddedFile): Promise<string> {
if(!inFile.isHyperlink) return null;
return await request({url: inFile.linkParts.original});
}
public async getObsidianImage(inFile: TFile | EmbeddedFile, depth: number): Promise<{
mimeType: MimeType;
fileId: FileId;
@@ -222,6 +204,31 @@ export class EmbeddedFilesLoader {
if (!this.plugin || !inFile) {
return null;
}
const file: TFile = inFile instanceof EmbeddedFile ? inFile.file : inFile;
const linkParts =
inFile instanceof EmbeddedFile
? inFile.linkParts
: {
original: file.path,
path: file.path,
isBlockRef: false,
ref: null,
width: this.plugin.settings.mdSVGwidth,
height: this.plugin.settings.mdSVGmaxHeight,
};
let hasSVGwithBitmap = false;
const isExcalidrawFile = this.plugin.isExcalidrawFile(file);
if (
!(
IMAGE_TYPES.contains(file.extension) ||
isExcalidrawFile ||
file.extension === "md"
)
) {
return null;
}
const ab = await app.vault.readBinary(file);
const getExcalidrawSVG = async (isDark: boolean) => {
//debug({where:"EmbeddedFileLoader.getExcalidrawSVG",uid:this.uid,file:file.name});
@@ -269,37 +276,6 @@ export class EmbeddedFilesLoader {
return dURL as DataURL;
};
let dataURL: DataURL = inFile instanceof EmbeddedFile
? await this.fetchFromURL(inFile) as DataURL
: null;
if(!dataURL) {
const file: TFile = inFile instanceof EmbeddedFile ? inFile.file : inFile;
const linkParts =
inFile instanceof EmbeddedFile
? inFile.linkParts
: {
original: file.path,
path: file.path,
isBlockRef: false,
ref: null,
width: this.plugin.settings.mdSVGwidth,
height: this.plugin.settings.mdSVGmaxHeight,
};
let hasSVGwithBitmap = false;
const isExcalidrawFile = this.plugin.isExcalidrawFile(file);
if (
!(
IMAGE_TYPES.contains(file.extension) ||
isExcalidrawFile ||
file.extension === "md"
)
) {
return null;
}
const ab = await app.vault.readBinary(file);
const excalidrawSVG = isExcalidrawFile
? await getExcalidrawSVG(this.isDark)
: null;
@@ -318,15 +294,6 @@ export class EmbeddedFilesLoader {
case "gif":
mimeType = "image/gif";
break;
case "webp":
mimeType = "image/webp";
break;
case "bmp":
mimeType = "image/bmp";
break;
case "ico":
mimeType = "image/x-icon"
break;
case "svg":
case "md":
mimeType = "image/svg+xml";
@@ -335,7 +302,7 @@ export class EmbeddedFilesLoader {
mimeType = "application/octet-stream";
}
}
dataURL =
let dataURL =
excalidrawSVG ??
(file.extension === "svg"
? await getSVGData(app, file)
@@ -348,7 +315,6 @@ export class EmbeddedFilesLoader {
dataURL = result.dataURL;
hasSVGwithBitmap = result.hasSVGwithBitmap;
}
}
const size = await getImageSize(dataURL);
return {
mimeType,

View File

@@ -488,7 +488,7 @@ export class ExcalidrawData {
let res = data.matchAll(/\s\^(.{8})[\n]+/g);
let parts;
while (!(parts = res.next()).done) {
let text = data.substring(position, parts.value.index);
const text = data.substring(position, parts.value.index);
const id: string = parts.value[1];
const textEl = this.scene.elements.filter((el: any) => el.id === id)[0];
if (textEl) {
@@ -502,13 +502,6 @@ export class ExcalidrawData {
this.elementLinks.set(id, text);
} else {
const wrapAt = estimateMaxLineLen(textEl.text, textEl.originalText);
//https://github.com/zsviczian/obsidian-excalidraw-plugin/issues/566
const elementLinkRes = text.matchAll(/^%%\*\*\*>>>text element-link:(\[\[[^<*\]]*]])<<<\*\*\*%%/gm);
const elementLink = elementLinkRes.next();
if(!elementLink.done) {
text = text.replace(/^%%\*\*\*>>>text element-link:\[\[[^<*\]]*]]<<<\*\*\*%%/gm,"");
textEl.link = elementLink.value[1];
}
const parseRes = await this.parse(text);
this.textElements.set(id, {
raw: text,
@@ -877,14 +870,8 @@ export class ExcalidrawData {
}
if (REGEX_LINK.isTransclusion(parts)) {
//transclusion //parts.value[1] || parts.value[4]
let contents = this
.parseCheckbox((await this.getTransclusion(REGEX_LINK.getLink(parts))).contents)
.replaceAll(/%%[^%]*%%/gm,""); //remove comments, consequence of https://github.com/zsviczian/obsidian-excalidraw-plugin/issues/566
if(this.plugin.settings.removeTransclusionQuoteSigns) {
//remove leading > signs from transcluded quotations; the first > sign is not explicitlyl removed becuse
//Obsidian app.metadataCache.blockCache returns the block position already discarding the first '> '
contents = contents.replaceAll(/\n\s*>\s?/gm,"\n");
}
const contents = this.parseCheckbox((await this.getTransclusion(REGEX_LINK.getLink(parts)))
.contents);
outString +=
text.substring(position, parts.value.index) +
wrapText(
@@ -1004,15 +991,7 @@ export class ExcalidrawData {
generateMD(deletedElements: ExcalidrawElement[] = []): string {
let outString = "# Text Elements\n";
for (const key of this.textElements.keys()) {
//https://github.com/zsviczian/obsidian-excalidraw-plugin/issues/566
const element = this.scene.elements.filter((el:any)=>el.id===key);
let elementString = this.textElements.get(key).raw;
if(element && element.length===1 && element[0].link && element[0].rawText === element[0].originalText) {
if(element[0].link.match(/^\[\[[^\]]*]]$/g)) { //apply this only to markdown links
elementString = `%%***>>>text element-link:${element[0].link}<<<***%%` + elementString;
}
}
outString += `${elementString} ^${key}\n\n`;
outString += `${this.textElements.get(key).raw} ^${key}\n\n`;
}
for (const key of this.elementLinks.keys()) {
@@ -1030,13 +1009,7 @@ export class ExcalidrawData {
}
if (this.files.size > 0) {
for (const key of this.files.keys()) {
const PATHREG = /(^[^#\|]*)/;
const ef = this.files.get(key);
//https://github.com/zsviczian/obsidian-excalidraw-plugin/issues/829
const path = ef.file
? ef.linkParts.original.replace(PATHREG,app.metadataCache.fileToLinktext(ef.file,this.file.path))
: ef.linkParts.original;
outString += `${key}: [[${path}]]\n`;
outString += `${key}: [[${this.files.get(key).linkParts.original}]]\n`;
}
}
outString += this.equations.size > 0 || this.files.size > 0 ? "\n" : "";
@@ -1087,7 +1060,7 @@ export class ExcalidrawData {
});
//check if there are any images that need to be processed in the new scene
if (!scene.files || Object.keys(scene.files).length === 0) {
if (!scene.files || scene.files == {}) {
return false;
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -20,7 +20,7 @@ export const REG_LINKINDEX_INVALIDCHARS = /[<>:"\\|?*#]/g;
export const REG_BLOCK_REF_CLEAN =
/[!"#$%&()*+,.:;<=>?@^`{|}~\/\[\]\\]/g; //https://discord.com/channels/686053708261228577/989603365606531104/1000128926619816048
// /\+|\/|~|=|%|\(|\)|{|}|,|&|\.|\$|!|\?|;|\[|]|\^|#|\*|<|>|&|@|\||\\|"|:|\s/g;
export const IMAGE_TYPES = ["jpeg", "jpg", "png", "gif", "svg", "webp", "bmp", "ico"];
export const IMAGE_TYPES = ["jpeg", "jpg", "png", "gif", "svg"];
export const EXPORT_TYPES = ["svg", "dark.svg", "light.svg", "png", "dark.png", "light.png"];
export const MAX_IMAGE_SIZE = 500;
export const FRONTMATTER_KEY = "excalidraw-plugin";

View File

@@ -259,9 +259,6 @@ export default {
PAGE_TRANSCLUSION_CHARCOUNT_DESC:
"The maximum number of characters to display from the page when transcluding an entire page with the " +
"![[markdown page]] format.",
QUOTE_TRANSCLUSION_REMOVE_NAME: "Quote translusion: remove leading '> ' from each line",
QUOTE_TRANSCLUSION_REMOVE_DESC: "Remove the leading '> ' from each line of the transclusion. This will improve readibility of quotes in text only transclusions<br>" +
"<b>Toggle ON:</b> Remove leading '> '<br><b>Toggle OFF:</b> Do not remove leading '> ' (note it will still be removed from the first row due to Obsidian API functionality)",
GET_URL_TITLE_NAME: "Use iframely to resolve page title",
GET_URL_TITLE_DESC:
"Use the <code>http://iframely.server.crestify.com/iframely?url=</code> to get title of page when dropping a link into Excalidraw",

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -58,7 +58,6 @@ export interface ExcalidrawSettings {
forceWrap: boolean;
pageTransclusionCharLimit: number;
wordWrappingDefault: number;
removeTransclusionQuoteSigns: boolean;
iframelyAllowed: boolean;
pngExportScale: number;
exportWithTheme: boolean;
@@ -150,7 +149,6 @@ export const DEFAULT_SETTINGS: ExcalidrawSettings = {
forceWrap: false,
pageTransclusionCharLimit: 200,
wordWrappingDefault: 0,
removeTransclusionQuoteSigns: true,
iframelyAllowed: true,
pngExportScale: 1,
exportWithTheme: true,
@@ -811,19 +809,6 @@ export class ExcalidrawSettingTab extends PluginSettingTab {
}),
);
new Setting(containerEl)
.setName(t("QUOTE_TRANSCLUSION_REMOVE_NAME"))
.setDesc(fragWithHTML(t("QUOTE_TRANSCLUSION_REMOVE_DESC")))
.addToggle(toggle =>
toggle
.setValue(this.plugin.settings.removeTransclusionQuoteSigns)
.onChange(value => {
this.plugin.settings.removeTransclusionQuoteSigns = value;
this.requestEmbedUpdate = true;
this.applySettingsUpdate(true);
})
);
new Setting(containerEl)
.setName(t("GET_URL_TITLE_NAME"))
.setDesc(fragWithHTML(t("GET_URL_TITLE_DESC")))

File diff suppressed because it is too large Load Diff

View File

@@ -2216,10 +2216,10 @@
dependencies:
"@zerollup/ts-helpers" "^1.7.18"
"@zsviczian/excalidraw@0.12.0-obsidian-11":
"integrity" "sha512-DoCXKyjFFkpBQ5GTK5Ud3RocqAxwbHzy9fWZIgWqznMqy2sdR9QDg0y/QILMKG4cOuiRlXXvHnpMxfOPkT4eeA=="
"resolved" "https://registry.npmjs.org/@zsviczian/excalidraw/-/excalidraw-0.12.0-obsidian-11.tgz"
"version" "0.12.0-obsidian-11"
"@zsviczian/excalidraw@0.12.0-obsidian-9":
"integrity" "sha512-mJ1MB0eKgHjtXPxSCCQkn/z/hdg3pI9vQQuwyCqNs5hjspuLJ+DdGkhaHvX+HrDuFdwPl/s+vfPC/tjTj6tmbA=="
"resolved" "https://registry.npmjs.org/@zsviczian/excalidraw/-/excalidraw-0.12.0-obsidian-9.tgz"
"version" "0.12.0-obsidian-9"
"abab@^2.0.3", "abab@^2.0.5":
"integrity" "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q=="