mirror of
https://github.com/Ellpeck/ObsidianJustSharePlease.git
synced 2024-05-30 06:13:37 +02:00
Compare commits
6 commits
be3d5837de
...
b8c1ddbc96
Author | SHA1 | Date | |
---|---|---|---|
Ell | b8c1ddbc96 | ||
Ell | 144d2c6ed2 | ||
Ell | 7a5f3f5b38 | ||
Ell | e4b04174b7 | ||
Ell | a5ab364ff9 | ||
Ell | 521b3fbfaf |
|
@ -8,12 +8,24 @@
|
|||
<title>Just Share Please</title>
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/jquery@3.7.0/dist/jquery.min.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/showdown@2.1.0/dist/showdown.min.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/dompurify@3.0.5/dist/purify.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11.8.0/build/highlight.min.js"></script>
|
||||
|
||||
<!-- TODO consider parsing markdown on the server instead? -->
|
||||
<script src="https://cdn.jsdelivr.net/npm/marked@7.0.2/lib/marked.umd.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/marked-katex-extension@3.0.3/lib/index.umd.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/marked-highlight@2.0.4/lib/index.umd.js"></script>
|
||||
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Inter&display=swap">
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=JetBrains+Mono&display=swap">
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.8/dist/katex.min.css">
|
||||
<link href="https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11.8.0/build/styles/github-dark.min.css" media="(prefers-color-scheme:dark)" rel="stylesheet">
|
||||
<link href="https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11.8.0/build/styles/github.min.css" media="(prefers-color-scheme:light),(prefers-color-scheme:no-preference)" rel="stylesheet">
|
||||
|
||||
|
||||
<link rel="icon" href="favicon.ico">
|
||||
|
||||
<!-- TODO consider improving the style or using Obsidian's default style as a basis? -->
|
||||
<style>
|
||||
html {
|
||||
position: relative;
|
||||
|
@ -26,6 +38,8 @@
|
|||
|
||||
code {
|
||||
font-family: "JetBrains Mono", monospace;
|
||||
font-variant-ligatures: none;
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
img {
|
||||
|
@ -52,7 +66,7 @@
|
|||
|
||||
body {
|
||||
color: #d8d8d8;
|
||||
background-color: #1b1b1b;
|
||||
background-color: #1e1e1e;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -65,6 +79,8 @@
|
|||
<script>
|
||||
let main = $("#main");
|
||||
|
||||
// TODO display nice message when there is no hash
|
||||
|
||||
$(window).on("hashchange", display);
|
||||
display();
|
||||
|
||||
|
@ -76,14 +92,15 @@
|
|||
method: "get",
|
||||
url: `share.php?id=${hash}`,
|
||||
success: t => {
|
||||
let converter = new showdown.Converter({
|
||||
simplifiedAutoLink: true,
|
||||
strikethrough: true,
|
||||
tables: true,
|
||||
tasklists: true,
|
||||
metadata: true
|
||||
});
|
||||
main.html(converter.makeHtml(t));
|
||||
marked.use(markedKatex());
|
||||
marked.use(markedHighlight.markedHighlight({
|
||||
langPrefix: "hljs language-",
|
||||
highlight: (c, l) => {
|
||||
const language = hljs.getLanguage(l) ? l : "plaintext";
|
||||
return hljs.highlight(c, {language}).value;
|
||||
}
|
||||
}));
|
||||
main.html(DOMPurify.sanitize(marked.parse(t)));
|
||||
},
|
||||
// TODO display this error more nicely
|
||||
error: (r, s, e) => main.html(e)
|
||||
|
|
|
@ -1,70 +1,118 @@
|
|||
<?php
|
||||
|
||||
header("Access-Control-Allow-Origin: *");
|
||||
|
||||
switch ($_SERVER["REQUEST_METHOD"]) {
|
||||
case "GET":
|
||||
parse_str($_SERVER["QUERY_STRING"], $query);
|
||||
$content = file_get_contents(get_markdown_path($query["id"]));
|
||||
if (!$content) {
|
||||
http_response_code(404);
|
||||
echo "Not found";
|
||||
break;
|
||||
}
|
||||
echo $content;
|
||||
handle_get();
|
||||
break;
|
||||
case "POST":
|
||||
$body = json_decode(file_get_contents("php://input"), true);
|
||||
$content = $body["content"];
|
||||
if (!$content) {
|
||||
http_response_code(400);
|
||||
echo "No content";
|
||||
break;
|
||||
}
|
||||
|
||||
try {
|
||||
// generate id and deletion/edit password
|
||||
$id = bin2hex(random_bytes(4));
|
||||
$password = bin2hex(random_bytes(16));
|
||||
} catch (Exception $e) {
|
||||
http_response_code(500);
|
||||
echo $e->getMessage();
|
||||
break;
|
||||
}
|
||||
|
||||
$meta = json_encode([
|
||||
"id" => $id,
|
||||
"deletion_password" => $password
|
||||
]);
|
||||
|
||||
// store markdown and metadata in data path
|
||||
file_put_contents(get_markdown_path($id), $content);
|
||||
file_put_contents(get_meta_path($id), $meta);
|
||||
|
||||
echo $meta;
|
||||
handle_post();
|
||||
break;
|
||||
case "PATCH":
|
||||
// TODO update using PATCH
|
||||
case "DELETE":
|
||||
parse_str($_SERVER["QUERY_STRING"], $query);
|
||||
$id = $query["id"];
|
||||
$password = $_SERVER["HTTP_PASSWORD"];
|
||||
if (!$id || !$password) {
|
||||
http_response_code(400);
|
||||
echo "No id or password";
|
||||
break;
|
||||
}
|
||||
|
||||
// check deletion password match
|
||||
$meta = json_decode(file_get_contents(get_meta_path($id)), true);
|
||||
if ($password != $meta["deletion_password"]) {
|
||||
http_response_code(401);
|
||||
echo "Unauthorized";
|
||||
break;
|
||||
}
|
||||
|
||||
// delete content and meta
|
||||
unlink(get_markdown_path($id));
|
||||
unlink(get_meta_path($id));
|
||||
handle_patch();
|
||||
break;
|
||||
case "DELETE":
|
||||
handle_delete();
|
||||
break;
|
||||
default:
|
||||
http_response_code(405);
|
||||
echo "Unsupported method";
|
||||
}
|
||||
|
||||
function handle_get(): void {
|
||||
parse_str($_SERVER["QUERY_STRING"], $query);
|
||||
$content = file_get_contents(get_markdown_path($query["id"]));
|
||||
if ($content === false) {
|
||||
http_response_code(404);
|
||||
echo "Not found";
|
||||
return;
|
||||
}
|
||||
echo $content;
|
||||
}
|
||||
|
||||
function handle_post(): void {
|
||||
$content = get_markdown_content();
|
||||
if ($content === null)
|
||||
return;
|
||||
|
||||
try {
|
||||
// generate id and deletion/edit password
|
||||
$id = bin2hex(random_bytes(4));
|
||||
$password = bin2hex(random_bytes(16));
|
||||
} catch (Exception $e) {
|
||||
http_response_code(500);
|
||||
echo $e->getMessage();
|
||||
return;
|
||||
}
|
||||
|
||||
$meta = json_encode([
|
||||
"id" => $id,
|
||||
"password" => $password
|
||||
]);
|
||||
|
||||
// store markdown and metadata in data path
|
||||
file_put_contents(get_markdown_path($id), $content);
|
||||
file_put_contents(get_meta_path($id), $meta);
|
||||
|
||||
echo $meta;
|
||||
}
|
||||
|
||||
function handle_patch(): void {
|
||||
$info = get_patch_delete_info();
|
||||
$content = get_markdown_content();
|
||||
if (!$info || $content === null)
|
||||
return;
|
||||
[$id, $password] = $info;
|
||||
if (!check_password($id, $password))
|
||||
return;
|
||||
|
||||
file_put_contents(get_markdown_path($id), $content);
|
||||
}
|
||||
|
||||
function handle_delete(): void {
|
||||
$info = get_patch_delete_info();
|
||||
if (!$info)
|
||||
return;
|
||||
[$id, $password] = $info;
|
||||
if (!check_password($id, $password))
|
||||
return;
|
||||
|
||||
// delete content and meta
|
||||
unlink(get_markdown_path($id));
|
||||
unlink(get_meta_path($id));
|
||||
}
|
||||
|
||||
function check_password(string $id, string $password): bool {
|
||||
$meta = json_decode(file_get_contents(get_meta_path($id)), true);
|
||||
if ($password != $meta["password"]) {
|
||||
http_response_code(401);
|
||||
echo "Unauthorized";
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
function get_patch_delete_info(): ?array {
|
||||
parse_str($_SERVER["QUERY_STRING"], $query);
|
||||
$id = $query["id"];
|
||||
$password = $_SERVER["HTTP_PASSWORD"];
|
||||
if (!$id || !$password) {
|
||||
http_response_code(400);
|
||||
echo "No id or password";
|
||||
return null;
|
||||
}
|
||||
return [$id, $password];
|
||||
}
|
||||
|
||||
function get_markdown_content(): ?string {
|
||||
$body = json_decode(file_get_contents("php://input"), true);
|
||||
if (!array_key_exists("content", $body)) {
|
||||
http_response_code(400);
|
||||
echo "No content";
|
||||
return null;
|
||||
}
|
||||
return $body["content"];
|
||||
}
|
||||
|
||||
function get_markdown_path(string $id): string {
|
||||
|
|
86
src/main.ts
86
src/main.ts
|
@ -1,11 +1,10 @@
|
|||
import {Plugin} from "obsidian";
|
||||
import {defaultSettings, JSPSettings} from "./settings";
|
||||
import {Plugin, requestUrl, TFile} from "obsidian";
|
||||
import {defaultSettings, JSPSettings, SharedItem} from "./settings";
|
||||
import {JSPSettingsTab} from "./settings-tab";
|
||||
|
||||
export default class JustSharePleasePlugin extends Plugin {
|
||||
|
||||
// TODO when uploading, store server-returned Guid and deletion password of each file in plugin settings
|
||||
// TODO when deleting, also allow deleting uploads whose local files have been deleted by querying the settings!
|
||||
// TODO allow deleting uploads whose local files have been deleted (through command?)
|
||||
// TODO add a setting for auto-refreshing uploads when saving
|
||||
// TODO strip frontmatter before uploading? maybe optionally
|
||||
settings: JSPSettings;
|
||||
|
@ -13,6 +12,85 @@ export default class JustSharePleasePlugin extends Plugin {
|
|||
async onload(): Promise<void> {
|
||||
await this.loadSettings();
|
||||
this.addSettingTab(new JSPSettingsTab(this.app, this));
|
||||
|
||||
this.registerEvent(this.app.workspace.on("file-menu", async (m, f) => {
|
||||
if (f instanceof TFile) {
|
||||
let shared = this.settings.shared.find(i => i.path == f.path);
|
||||
if (!shared) {
|
||||
// (newly) share a note
|
||||
m.addItem(i => {
|
||||
i.setTitle("Share to JSP");
|
||||
i.setIcon("share");
|
||||
i.onClick(async () => {
|
||||
let response = await requestUrl({
|
||||
url: `${this.settings.url}/share.php`,
|
||||
method: "POST",
|
||||
body: JSON.stringify({content: await this.app.vault.cachedRead(f)}),
|
||||
throw: false
|
||||
});
|
||||
|
||||
// TODO display message about status success/fail and copy URL to clipboard
|
||||
console.log(response.status + " " + response.text);
|
||||
|
||||
if (response.status == 200) {
|
||||
shared = response.json;
|
||||
shared.path = f.path;
|
||||
this.settings.shared.push(shared);
|
||||
await this.saveSettings();
|
||||
}
|
||||
});
|
||||
});
|
||||
} else {
|
||||
// copy note link
|
||||
m.addItem(i => {
|
||||
i.setTitle("Copy JSP link");
|
||||
i.setIcon("link");
|
||||
// TODO let people know this happened
|
||||
i.onClick(() => navigator.clipboard.writeText(`${this.settings.url}#${shared.id}`));
|
||||
});
|
||||
|
||||
// update
|
||||
m.addItem(i => {
|
||||
i.setTitle("Update in JSP");
|
||||
i.setIcon("share");
|
||||
i.onClick(async () => {
|
||||
let response = await requestUrl({
|
||||
url: `${this.settings.url}/share.php?id=${shared.id}`,
|
||||
method: "PATCH",
|
||||
headers: {"Password": shared.password},
|
||||
body: JSON.stringify({content: await this.app.vault.cachedRead(f)}),
|
||||
throw: false
|
||||
});
|
||||
|
||||
// TODO display message about status success/fail after updating
|
||||
console.log(response.status + " " + response.text);
|
||||
});
|
||||
});
|
||||
|
||||
// delete
|
||||
m.addItem(i => {
|
||||
i.setTitle("Delete from JSP");
|
||||
i.setIcon("trash");
|
||||
i.onClick(async () => {
|
||||
let response = await requestUrl({
|
||||
url: `${this.settings.url}/share.php?id=${shared.id}`,
|
||||
method: "DELETE",
|
||||
headers: {"Password": shared.password},
|
||||
throw: false
|
||||
});
|
||||
|
||||
// TODO display message about status success/fail when deleting
|
||||
console.log(response.status);
|
||||
|
||||
if (response.status == 200) {
|
||||
this.settings.shared.remove(shared);
|
||||
await this.saveSettings();
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
}));
|
||||
}
|
||||
|
||||
async loadSettings(): Promise<void> {
|
||||
|
|
|
@ -1,6 +1,19 @@
|
|||
export const defaultSettings: JSPSettings = {};
|
||||
export const defaultSettings: JSPSettings = {
|
||||
url: "http://localhost:8080",
|
||||
shared: []
|
||||
};
|
||||
|
||||
export interface JSPSettings {
|
||||
|
||||
url: string;
|
||||
shared: SharedItem[];
|
||||
|
||||
}
|
||||
|
||||
export interface SharedItem {
|
||||
|
||||
id: string;
|
||||
password: string;
|
||||
path: string;
|
||||
|
||||
}
|
||||
|
|
2
test-vault/.obsidian/community-plugins.json
vendored
2
test-vault/.obsidian/community-plugins.json
vendored
|
@ -1,3 +1,3 @@
|
|||
[
|
||||
"just-share-please"
|
||||
]
|
||||
]
|
|
@ -25,5 +25,6 @@
|
|||
"publish": false,
|
||||
"sync": false,
|
||||
"canvas": true,
|
||||
"bookmarks": true
|
||||
"bookmarks": true,
|
||||
"properties": true
|
||||
}
|
1
test-vault/.obsidian/core-plugins.json
vendored
1
test-vault/.obsidian/core-plugins.json
vendored
|
@ -7,6 +7,7 @@
|
|||
"canvas",
|
||||
"outgoing-link",
|
||||
"tag-pane",
|
||||
"properties",
|
||||
"page-preview",
|
||||
"daily-notes",
|
||||
"templates",
|
||||
|
|
3
test-vault/.obsidian/plugins/just-share-please/.gitignore
vendored
Normal file
3
test-vault/.obsidian/plugins/just-share-please/.gitignore
vendored
Normal file
|
@ -0,0 +1,3 @@
|
|||
*
|
||||
!.gitignore
|
||||
!data.json
|
4
test-vault/.obsidian/plugins/just-share-please/data.json
vendored
Normal file
4
test-vault/.obsidian/plugins/just-share-please/data.json
vendored
Normal file
|
@ -0,0 +1,4 @@
|
|||
{
|
||||
"url": "http://localhost:8080",
|
||||
"shared": []
|
||||
}
|
|
@ -1,96 +0,0 @@
|
|||
/*
|
||||
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
||||
if you want to view the source, please visit the github repository of this plugin
|
||||
*/
|
||||
var __create = Object.create;
|
||||
var __defProp = Object.defineProperty;
|
||||
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
||||
var __getOwnPropNames = Object.getOwnPropertyNames;
|
||||
var __getProtoOf = Object.getPrototypeOf;
|
||||
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
||||
var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
|
||||
var __export = (target, all) => {
|
||||
__markAsModule(target);
|
||||
for (var name in all)
|
||||
__defProp(target, name, { get: all[name], enumerable: true });
|
||||
};
|
||||
var __reExport = (target, module2, desc) => {
|
||||
if (module2 && typeof module2 === "object" || typeof module2 === "function") {
|
||||
for (let key of __getOwnPropNames(module2))
|
||||
if (!__hasOwnProp.call(target, key) && key !== "default")
|
||||
__defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
|
||||
}
|
||||
return target;
|
||||
};
|
||||
var __toModule = (module2) => {
|
||||
return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2);
|
||||
};
|
||||
var __async = (__this, __arguments, generator) => {
|
||||
return new Promise((resolve, reject) => {
|
||||
var fulfilled = (value) => {
|
||||
try {
|
||||
step(generator.next(value));
|
||||
} catch (e) {
|
||||
reject(e);
|
||||
}
|
||||
};
|
||||
var rejected = (value) => {
|
||||
try {
|
||||
step(generator.throw(value));
|
||||
} catch (e) {
|
||||
reject(e);
|
||||
}
|
||||
};
|
||||
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
|
||||
step((generator = generator.apply(__this, __arguments)).next());
|
||||
});
|
||||
};
|
||||
|
||||
// src/main.ts
|
||||
__export(exports, {
|
||||
default: () => JustSharePleasePlugin
|
||||
});
|
||||
var import_obsidian2 = __toModule(require("obsidian"));
|
||||
|
||||
// src/settings.ts
|
||||
var defaultSettings = {};
|
||||
|
||||
// src/settings-tab.ts
|
||||
var import_obsidian = __toModule(require("obsidian"));
|
||||
var JSPSettingsTab = class extends import_obsidian.PluginSettingTab {
|
||||
constructor(app, plugin) {
|
||||
super(app, plugin);
|
||||
this.plugin = plugin;
|
||||
}
|
||||
display() {
|
||||
this.containerEl.empty();
|
||||
this.containerEl.createEl("h2", { text: "Just Share Please Settings" });
|
||||
this.containerEl.createEl("hr");
|
||||
this.containerEl.createEl("p", { text: "If you like this plugin and want to support its development, you can do so through my website by clicking this fancy image!" });
|
||||
this.containerEl.createEl("a", { href: "https://ellpeck.de/support" }).createEl("img", {
|
||||
attr: { src: "https://ellpeck.de/res/generalsupport.png" },
|
||||
cls: "just-share-please-support"
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
// src/main.ts
|
||||
var JustSharePleasePlugin = class extends import_obsidian2.Plugin {
|
||||
onload() {
|
||||
return __async(this, null, function* () {
|
||||
yield this.loadSettings();
|
||||
this.addSettingTab(new JSPSettingsTab(this.app, this));
|
||||
});
|
||||
}
|
||||
loadSettings() {
|
||||
return __async(this, null, function* () {
|
||||
this.settings = Object.assign({}, defaultSettings, yield this.loadData());
|
||||
});
|
||||
}
|
||||
saveSettings() {
|
||||
return __async(this, null, function* () {
|
||||
yield this.saveData(this.settings);
|
||||
});
|
||||
}
|
||||
};
|
||||
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL21haW4udHMiLCAic3JjL3NldHRpbmdzLnRzIiwgInNyYy9zZXR0aW5ncy10YWIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7UGx1Z2lufSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHtkZWZhdWx0U2V0dGluZ3MsIEpTUFNldHRpbmdzfSBmcm9tIFwiLi9zZXR0aW5nc1wiO1xyXG5pbXBvcnQge0pTUFNldHRpbmdzVGFifSBmcm9tIFwiLi9zZXR0aW5ncy10YWJcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEp1c3RTaGFyZVBsZWFzZVBsdWdpbiBleHRlbmRzIFBsdWdpbiB7XHJcblxyXG4gICAgc2V0dGluZ3M6IEpTUFNldHRpbmdzO1xyXG5cclxuICAgIGFzeW5jIG9ubG9hZCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICBhd2FpdCB0aGlzLmxvYWRTZXR0aW5ncygpO1xyXG4gICAgICAgIHRoaXMuYWRkU2V0dGluZ1RhYihuZXcgSlNQU2V0dGluZ3NUYWIodGhpcy5hcHAsIHRoaXMpKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBsb2FkU2V0dGluZ3MoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgdGhpcy5zZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRTZXR0aW5ncywgYXdhaXQgdGhpcy5sb2FkRGF0YSgpKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBzYXZlU2V0dGluZ3MoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5zYXZlRGF0YSh0aGlzLnNldHRpbmdzKTtcclxuICAgIH1cclxufVxyXG4iLCAiZXhwb3J0IGNvbnN0IGRlZmF1bHRTZXR0aW5nczogSlNQU2V0dGluZ3MgPSB7fTtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSlNQU2V0dGluZ3Mge1xyXG5cclxuXHJcbn1cclxuIiwgImltcG9ydCB7QXBwLCBQbHVnaW5TZXR0aW5nVGFiLCBTZXR0aW5nfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHtkZWZhdWx0U2V0dGluZ3N9IGZyb20gXCIuL3NldHRpbmdzXCI7XHJcbmltcG9ydCBKdXN0U2hhcmVQbGVhc2VQbHVnaW4gZnJvbSBcIi4vbWFpblwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEpTUFNldHRpbmdzVGFiIGV4dGVuZHMgUGx1Z2luU2V0dGluZ1RhYiB7XHJcblxyXG4gICAgcGx1Z2luOiBKdXN0U2hhcmVQbGVhc2VQbHVnaW47XHJcblxyXG4gICAgY29uc3RydWN0b3IoYXBwOiBBcHAsIHBsdWdpbjogSnVzdFNoYXJlUGxlYXNlUGx1Z2luKSB7XHJcbiAgICAgICAgc3VwZXIoYXBwLCBwbHVnaW4pO1xyXG4gICAgICAgIHRoaXMucGx1Z2luID0gcGx1Z2luO1xyXG4gICAgfVxyXG5cclxuICAgIGRpc3BsYXkoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jb250YWluZXJFbC5lbXB0eSgpO1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVyRWwuY3JlYXRlRWwoXCJoMlwiLCB7dGV4dDogXCJKdXN0IFNoYXJlIFBsZWFzZSBTZXR0aW5nc1wifSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gVE9ETyBzZXR0aW5nc1xyXG5cclxuICAgICAgICB0aGlzLmNvbnRhaW5lckVsLmNyZWF0ZUVsKFwiaHJcIik7XHJcbiAgICAgICAgdGhpcy5jb250YWluZXJFbC5jcmVhdGVFbChcInBcIiwge3RleHQ6IFwiSWYgeW91IGxpa2UgdGhpcyBwbHVnaW4gYW5kIHdhbnQgdG8gc3VwcG9ydCBpdHMgZGV2ZWxvcG1lbnQsIHlvdSBjYW4gZG8gc28gdGhyb3VnaCBteSB3ZWJzaXRlIGJ5IGNsaWNraW5nIHRoaXMgZmFuY3kgaW1hZ2UhXCJ9KTtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lckVsLmNyZWF0ZUVsKFwiYVwiLCB7aHJlZjogXCJodHRwczovL2VsbHBlY2suZGUvc3VwcG9ydFwifSlcclxuICAgICAgICAgICAgLmNyZWF0ZUVsKFwiaW1nXCIsIHtcclxuICAgICAgICAgICAgICAgIGF0dHI6IHtzcmM6IFwiaHR0cHM6Ly9lbGxwZWNrLmRlL3Jlcy9nZW5lcmFsc3VwcG9ydC5wbmdcIn0sXHJcbiAgICAgICAgICAgICAgICBjbHM6IFwianVzdC1zaGFyZS1wbGVhc2Utc3VwcG9ydFwiXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQSx1QkFBcUI7OztBQ0FkLElBQU0sa0JBQStCOzs7QUNBNUMsc0JBQTZDO0FBSXRDLG1DQUE2QixpQ0FBaUI7QUFBQSxFQUlqRCxZQUFZLEtBQVUsUUFBK0I7QUFDakQsVUFBTSxLQUFLO0FBQ1gsU0FBSyxTQUFTO0FBQUE7QUFBQSxFQUdsQixVQUFnQjtBQUNaLFNBQUssWUFBWTtBQUNqQixTQUFLLFlBQVksU0FBUyxNQUFNLEVBQUMsTUFBTTtBQUl2QyxTQUFLLFlBQVksU0FBUztBQUMxQixTQUFLLFlBQVksU0FBUyxLQUFLLEVBQUMsTUFBTTtBQUN0QyxTQUFLLFlBQVksU0FBUyxLQUFLLEVBQUMsTUFBTSxnQ0FDakMsU0FBUyxPQUFPO0FBQUEsTUFDYixNQUFNLEVBQUMsS0FBSztBQUFBLE1BQ1osS0FBSztBQUFBO0FBQUE7QUFBQTs7O0FGcEJyQiwwQ0FBbUQsd0JBQU87QUFBQSxFQUloRCxTQUF3QjtBQUFBO0FBQzFCLFlBQU0sS0FBSztBQUNYLFdBQUssY0FBYyxJQUFJLGVBQWUsS0FBSyxLQUFLO0FBQUE7QUFBQTtBQUFBLEVBRzlDLGVBQThCO0FBQUE7QUFDaEMsV0FBSyxXQUFXLE9BQU8sT0FBTyxJQUFJLGlCQUFpQixNQUFNLEtBQUs7QUFBQTtBQUFBO0FBQUEsRUFHNUQsZUFBOEI7QUFBQTtBQUNoQyxZQUFNLEtBQUssU0FBUyxLQUFLO0FBQUE7QUFBQTtBQUFBOyIsCiAgIm5hbWVzIjogW10KfQo=
|
|
@ -1,96 +0,0 @@
|
|||
/*
|
||||
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
||||
if you want to view the source, please visit the github repository of this plugin
|
||||
*/
|
||||
var __create = Object.create;
|
||||
var __defProp = Object.defineProperty;
|
||||
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
||||
var __getOwnPropNames = Object.getOwnPropertyNames;
|
||||
var __getProtoOf = Object.getPrototypeOf;
|
||||
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
||||
var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
|
||||
var __export = (target, all) => {
|
||||
__markAsModule(target);
|
||||
for (var name in all)
|
||||
__defProp(target, name, { get: all[name], enumerable: true });
|
||||
};
|
||||
var __reExport = (target, module2, desc) => {
|
||||
if (module2 && typeof module2 === "object" || typeof module2 === "function") {
|
||||
for (let key of __getOwnPropNames(module2))
|
||||
if (!__hasOwnProp.call(target, key) && key !== "default")
|
||||
__defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
|
||||
}
|
||||
return target;
|
||||
};
|
||||
var __toModule = (module2) => {
|
||||
return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2);
|
||||
};
|
||||
var __async = (__this, __arguments, generator) => {
|
||||
return new Promise((resolve, reject) => {
|
||||
var fulfilled = (value) => {
|
||||
try {
|
||||
step(generator.next(value));
|
||||
} catch (e) {
|
||||
reject(e);
|
||||
}
|
||||
};
|
||||
var rejected = (value) => {
|
||||
try {
|
||||
step(generator.throw(value));
|
||||
} catch (e) {
|
||||
reject(e);
|
||||
}
|
||||
};
|
||||
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
|
||||
step((generator = generator.apply(__this, __arguments)).next());
|
||||
});
|
||||
};
|
||||
|
||||
// src/main.ts
|
||||
__export(exports, {
|
||||
default: () => JustSharePleasePlugin
|
||||
});
|
||||
var import_obsidian2 = __toModule(require("obsidian"));
|
||||
|
||||
// src/settings.ts
|
||||
var defaultSettings = {};
|
||||
|
||||
// src/settings-tab.ts
|
||||
var import_obsidian = __toModule(require("obsidian"));
|
||||
var JSPSettingsTab = class extends import_obsidian.PluginSettingTab {
|
||||
constructor(app, plugin) {
|
||||
super(app, plugin);
|
||||
this.plugin = plugin;
|
||||
}
|
||||
display() {
|
||||
this.containerEl.empty();
|
||||
this.containerEl.createEl("h2", { text: "Just Share Please Settings" });
|
||||
this.containerEl.createEl("hr");
|
||||
this.containerEl.createEl("p", { text: "If you like this plugin and want to support its development, you can do so through my website by clicking this fancy image!" });
|
||||
this.containerEl.createEl("a", { href: "https://ellpeck.de/support" }).createEl("img", {
|
||||
attr: { src: "https://ellpeck.de/res/generalsupport.png" },
|
||||
cls: "just-share-please-support"
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
// src/main.ts
|
||||
var JustSharePleasePlugin = class extends import_obsidian2.Plugin {
|
||||
onload() {
|
||||
return __async(this, null, function* () {
|
||||
yield this.loadSettings();
|
||||
this.addSettingTab(new JSPSettingsTab(this.app, this));
|
||||
});
|
||||
}
|
||||
loadSettings() {
|
||||
return __async(this, null, function* () {
|
||||
this.settings = Object.assign({}, defaultSettings, yield this.loadData());
|
||||
});
|
||||
}
|
||||
saveSettings() {
|
||||
return __async(this, null, function* () {
|
||||
yield this.saveData(this.settings);
|
||||
});
|
||||
}
|
||||
};
|
||||
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL21haW4udHMiLCAic3JjL3NldHRpbmdzLnRzIiwgInNyYy9zZXR0aW5ncy10YWIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7UGx1Z2lufSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHtkZWZhdWx0U2V0dGluZ3MsIEpTUFNldHRpbmdzfSBmcm9tIFwiLi9zZXR0aW5nc1wiO1xyXG5pbXBvcnQge0pTUFNldHRpbmdzVGFifSBmcm9tIFwiLi9zZXR0aW5ncy10YWJcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEp1c3RTaGFyZVBsZWFzZVBsdWdpbiBleHRlbmRzIFBsdWdpbiB7XHJcblxyXG4gICAgc2V0dGluZ3M6IEpTUFNldHRpbmdzO1xyXG5cclxuICAgIGFzeW5jIG9ubG9hZCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICBhd2FpdCB0aGlzLmxvYWRTZXR0aW5ncygpO1xyXG4gICAgICAgIHRoaXMuYWRkU2V0dGluZ1RhYihuZXcgSlNQU2V0dGluZ3NUYWIodGhpcy5hcHAsIHRoaXMpKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBsb2FkU2V0dGluZ3MoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgdGhpcy5zZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRTZXR0aW5ncywgYXdhaXQgdGhpcy5sb2FkRGF0YSgpKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBzYXZlU2V0dGluZ3MoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5zYXZlRGF0YSh0aGlzLnNldHRpbmdzKTtcclxuICAgIH1cclxufVxyXG4iLCAiZXhwb3J0IGNvbnN0IGRlZmF1bHRTZXR0aW5nczogSlNQU2V0dGluZ3MgPSB7fTtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSlNQU2V0dGluZ3Mge1xyXG5cclxuXHJcbn1cclxuIiwgImltcG9ydCB7QXBwLCBQbHVnaW5TZXR0aW5nVGFiLCBTZXR0aW5nfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHtkZWZhdWx0U2V0dGluZ3N9IGZyb20gXCIuL3NldHRpbmdzXCI7XHJcbmltcG9ydCBKdXN0U2hhcmVQbGVhc2VQbHVnaW4gZnJvbSBcIi4vbWFpblwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEpTUFNldHRpbmdzVGFiIGV4dGVuZHMgUGx1Z2luU2V0dGluZ1RhYiB7XHJcblxyXG4gICAgcGx1Z2luOiBKdXN0U2hhcmVQbGVhc2VQbHVnaW47XHJcblxyXG4gICAgY29uc3RydWN0b3IoYXBwOiBBcHAsIHBsdWdpbjogSnVzdFNoYXJlUGxlYXNlUGx1Z2luKSB7XHJcbiAgICAgICAgc3VwZXIoYXBwLCBwbHVnaW4pO1xyXG4gICAgICAgIHRoaXMucGx1Z2luID0gcGx1Z2luO1xyXG4gICAgfVxyXG5cclxuICAgIGRpc3BsYXkoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jb250YWluZXJFbC5lbXB0eSgpO1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVyRWwuY3JlYXRlRWwoXCJoMlwiLCB7dGV4dDogXCJKdXN0IFNoYXJlIFBsZWFzZSBTZXR0aW5nc1wifSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gVE9ETyBzZXR0aW5nc1xyXG5cclxuICAgICAgICB0aGlzLmNvbnRhaW5lckVsLmNyZWF0ZUVsKFwiaHJcIik7XHJcbiAgICAgICAgdGhpcy5jb250YWluZXJFbC5jcmVhdGVFbChcInBcIiwge3RleHQ6IFwiSWYgeW91IGxpa2UgdGhpcyBwbHVnaW4gYW5kIHdhbnQgdG8gc3VwcG9ydCBpdHMgZGV2ZWxvcG1lbnQsIHlvdSBjYW4gZG8gc28gdGhyb3VnaCBteSB3ZWJzaXRlIGJ5IGNsaWNraW5nIHRoaXMgZmFuY3kgaW1hZ2UhXCJ9KTtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lckVsLmNyZWF0ZUVsKFwiYVwiLCB7aHJlZjogXCJodHRwczovL2VsbHBlY2suZGUvc3VwcG9ydFwifSlcclxuICAgICAgICAgICAgLmNyZWF0ZUVsKFwiaW1nXCIsIHtcclxuICAgICAgICAgICAgICAgIGF0dHI6IHtzcmM6IFwiaHR0cHM6Ly9lbGxwZWNrLmRlL3Jlcy9nZW5lcmFsc3VwcG9ydC5wbmdcIn0sXHJcbiAgICAgICAgICAgICAgICBjbHM6IFwianVzdC1zaGFyZS1wbGVhc2Utc3VwcG9ydFwiXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQSx1QkFBcUI7OztBQ0FkLElBQU0sa0JBQStCOzs7QUNBNUMsc0JBQTZDO0FBSXRDLG1DQUE2QixpQ0FBaUI7QUFBQSxFQUlqRCxZQUFZLEtBQVUsUUFBK0I7QUFDakQsVUFBTSxLQUFLO0FBQ1gsU0FBSyxTQUFTO0FBQUE7QUFBQSxFQUdsQixVQUFnQjtBQUNaLFNBQUssWUFBWTtBQUNqQixTQUFLLFlBQVksU0FBUyxNQUFNLEVBQUMsTUFBTTtBQUl2QyxTQUFLLFlBQVksU0FBUztBQUMxQixTQUFLLFlBQVksU0FBUyxLQUFLLEVBQUMsTUFBTTtBQUN0QyxTQUFLLFlBQVksU0FBUyxLQUFLLEVBQUMsTUFBTSxnQ0FDakMsU0FBUyxPQUFPO0FBQUEsTUFDYixNQUFNLEVBQUMsS0FBSztBQUFBLE1BQ1osS0FBSztBQUFBO0FBQUE7QUFBQTs7O0FGcEJyQiwwQ0FBbUQsd0JBQU87QUFBQSxFQUloRCxTQUF3QjtBQUFBO0FBQzFCLFlBQU0sS0FBSztBQUNYLFdBQUssY0FBYyxJQUFJLGVBQWUsS0FBSyxLQUFLO0FBQUE7QUFBQTtBQUFBLEVBRzlDLGVBQThCO0FBQUE7QUFDaEMsV0FBSyxXQUFXLE9BQU8sT0FBTyxJQUFJLGlCQUFpQixNQUFNLEtBQUs7QUFBQTtBQUFBO0FBQUEsRUFHNUQsZUFBOEI7QUFBQTtBQUNoQyxZQUFNLEtBQUssU0FBUyxLQUFLO0FBQUE7QUFBQTtBQUFBOyIsCiAgIm5hbWVzIjogW10KfQo=
|
|
@ -1,10 +0,0 @@
|
|||
{
|
||||
"id": "just-share-please",
|
||||
"name": "Just Share Please",
|
||||
"version": "0.1.0",
|
||||
"minAppVersion": "1.3.0",
|
||||
"description": "A simple plugin that allows sharing a note using a random link",
|
||||
"author": "Ellpeck",
|
||||
"authorUrl": "https://ellpeck.de",
|
||||
"isDesktopOnly": false
|
||||
}
|
|
@ -1,10 +0,0 @@
|
|||
{
|
||||
"id": "just-share-please",
|
||||
"name": "Just Share Please",
|
||||
"version": "0.1.0",
|
||||
"minAppVersion": "1.3.0",
|
||||
"description": "A simple plugin that allows sharing a note using a random link",
|
||||
"author": "Ellpeck",
|
||||
"authorUrl": "https://ellpeck.de",
|
||||
"isDesktopOnly": false
|
||||
}
|
|
@ -1,5 +0,0 @@
|
|||
.just-share-please-support {
|
||||
max-width: 50%;
|
||||
width: 400px;
|
||||
height: auto;
|
||||
}
|
|
@ -1,5 +0,0 @@
|
|||
.just-share-please-support {
|
||||
max-width: 50%;
|
||||
width: 400px;
|
||||
height: auto;
|
||||
}
|
33
test-vault/Cool Test Note.md
Normal file
33
test-vault/Cool Test Note.md
Normal file
|
@ -0,0 +1,33 @@
|
|||
# Cool Test Note
|
||||
|
||||
This is a cool test note, my friends!
|
||||
|
||||
> How are you?
|
||||
|
||||
```js
|
||||
$.ajax({
|
||||
method: "get",
|
||||
url: `share.php?id=${hash}`,
|
||||
success: t => {
|
||||
marked.use(markedKatex());
|
||||
marked.use(markedHighlight.markedHighlight({
|
||||
langPrefix: "hljs language-",
|
||||
highlight: (c, l) => {
|
||||
const language = hljs.getLanguage(l) ? l : "plaintext";
|
||||
return hljs.highlight(c, {language}).value;
|
||||
}
|
||||
}));
|
||||
main.html(DOMPurify.sanitize(marked.parse(t)));
|
||||
},
|
||||
// TODO display this error more nicely
|
||||
error: (r, s, e) => main.html(e)
|
||||
});
|
||||
```
|
||||
http://localhost:8080#ff3ebb34
|
||||
|
||||
cool!!
|
||||
|
||||
The following is $x^2 = 7$, but more complicated!
|
||||
$$
|
||||
x^2 + \sum_{i = 1}^{10000} x^2 \cdot 0 = 7
|
||||
$$
|
0
test-vault/Second note.md
Normal file
0
test-vault/Second note.md
Normal file
Loading…
Reference in a new issue