mirror of
https://github.com/danbulant/notes
synced 2026-07-05 02:50:38 +00:00
237 lines
16 KiB
JavaScript
237 lines
16 KiB
JavaScript
/*
|
||
THIS IS A GENERATED/BUNDLED FILE BY ROLLUP
|
||
if you want to view the source visit the plugins github repository
|
||
*/
|
||
|
||
'use strict';
|
||
|
||
var obsidian = require('obsidian');
|
||
|
||
/*! *****************************************************************************
|
||
Copyright (c) Microsoft Corporation.
|
||
|
||
Permission to use, copy, modify, and/or distribute this software for any
|
||
purpose with or without fee is hereby granted.
|
||
|
||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
||
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
||
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
||
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
||
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||
PERFORMANCE OF THIS SOFTWARE.
|
||
***************************************************************************** */
|
||
|
||
function __awaiter(thisArg, _arguments, P, generator) {
|
||
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
||
return new (P || (P = Promise))(function (resolve, reject) {
|
||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
||
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
||
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||
});
|
||
}
|
||
|
||
// This file replaces `index.js` in bundlers like webpack or Rollup,
|
||
|
||
if (process.env.NODE_ENV !== 'production') {
|
||
// All bundlers will remove this block in the production bundle.
|
||
if (
|
||
typeof navigator !== 'undefined' &&
|
||
navigator.product === 'ReactNative' &&
|
||
typeof crypto === 'undefined'
|
||
) {
|
||
throw new Error(
|
||
'React Native does not have a built-in secure random generator. ' +
|
||
'If you don’t need unpredictable IDs use `nanoid/non-secure`. ' +
|
||
'For secure IDs, import `react-native-get-random-values` ' +
|
||
'before Nano ID.'
|
||
)
|
||
}
|
||
if (typeof msCrypto !== 'undefined' && typeof crypto === 'undefined') {
|
||
throw new Error(
|
||
'Import file with `if (!window.crypto) window.crypto = window.msCrypto`' +
|
||
' before importing Nano ID to fix IE 11 support'
|
||
)
|
||
}
|
||
if (typeof crypto === 'undefined') {
|
||
throw new Error(
|
||
'Your browser does not have secure random generator. ' +
|
||
'If you don’t need unpredictable IDs, you can use nanoid/non-secure.'
|
||
)
|
||
}
|
||
}
|
||
|
||
let nanoid = (size = 21) => {
|
||
let id = '';
|
||
let bytes = crypto.getRandomValues(new Uint8Array(size));
|
||
|
||
// A compact alternative for `for (var i = 0; i < step; i++)`.
|
||
while (size--) {
|
||
// It is incorrect to use bytes exceeding the alphabet size.
|
||
// The following mask reduces the random byte in the 0-255 value
|
||
// range to the 0-63 value range. Therefore, adding hacks, such
|
||
// as empty string fallback or magic numbers, is unneccessary because
|
||
// the bitmask trims bytes down to the alphabet size.
|
||
let byte = bytes[size] & 63;
|
||
if (byte < 36) {
|
||
// `0-9a-z`
|
||
id += byte.toString(36);
|
||
} else if (byte < 62) {
|
||
// `A-Z`
|
||
id += (byte - 26).toString(36).toUpperCase();
|
||
} else if (byte < 63) {
|
||
id += '_';
|
||
} else {
|
||
id += '-';
|
||
}
|
||
}
|
||
return id
|
||
};
|
||
|
||
const pluginName = "obsidian-gist";
|
||
const obsidianAppOrigin = 'app://obsidian.md';
|
||
class GistProcessor {
|
||
constructor() {
|
||
this.messageEventHandler = (messageEvent) => {
|
||
if (messageEvent.origin !== 'null') {
|
||
// a message received from the iFrame with `srcdoc` attribute, the `origin` will be `null`.
|
||
return;
|
||
}
|
||
const sender = messageEvent.data.sender;
|
||
// only process message coming from this plugin
|
||
if (sender === pluginName) {
|
||
const gistUUID = messageEvent.data.gistUUID;
|
||
const contentHeight = messageEvent.data.contentHeight;
|
||
const gistContainer = document.querySelector('iframe#' + gistUUID);
|
||
gistContainer.setAttribute('height', contentHeight);
|
||
}
|
||
};
|
||
this.processor = (sourceString, el) => __awaiter(this, void 0, void 0, function* () {
|
||
const gists = sourceString.trim().split("\n");
|
||
return Promise.all(gists.map((gist) => __awaiter(this, void 0, void 0, function* () {
|
||
return this._processGist(el, gist);
|
||
})));
|
||
});
|
||
}
|
||
// private
|
||
_processGist(el, gistString) {
|
||
return __awaiter(this, void 0, void 0, function* () {
|
||
const pattern = /(?<protocol>https?:\/\/)?(?<host>gist\.github\.com\/)?((?<username>\w+)\/)?(?<gistID>\w+)(\#(?<filename>.+))?/;
|
||
const matchResult = gistString.match(pattern).groups;
|
||
const gistID = matchResult.gistID;
|
||
if (gistID === undefined) {
|
||
return this._showError(el, gistString, `Could not found a valid Gist ID, please make sure your content and format is correct.`);
|
||
}
|
||
let gistURL = `https://gist.github.com/${gistID}.json`;
|
||
if (matchResult.filename !== undefined) {
|
||
gistURL = `${gistURL}?file=${matchResult.filename}`;
|
||
}
|
||
try {
|
||
const response = yield fetch(gistURL);
|
||
if (response.ok) {
|
||
const gistJSON = yield response.json();
|
||
return this._insertGistElement(el, gistID, gistJSON);
|
||
}
|
||
else {
|
||
return this._showError(el, gistString, `Could not fetch the Gist info from GitHub server. (Code: ${response.status})`);
|
||
}
|
||
}
|
||
catch (error) {
|
||
return this._showError(el, gistString, `Could not fetch the Gist from GitHub server. (Error: ${error})`);
|
||
}
|
||
});
|
||
}
|
||
_insertGistElement(el, gistID, gistJSON) {
|
||
return __awaiter(this, void 0, void 0, function* () {
|
||
// generate an uuid for each gist element
|
||
const gistUUID = `${pluginName}-${gistID}-${nanoid()}`;
|
||
// container
|
||
const container = document.createElement('iframe');
|
||
container.id = gistUUID;
|
||
container.classList.add(`${pluginName}-container`);
|
||
container.setAttribute('sandbox', 'allow-scripts allow-top-navigation-by-user-activation');
|
||
container.setAttribute('loading', 'lazy');
|
||
// reset the default things on HTML
|
||
const resetStylesheet = `
|
||
<style>
|
||
html, body {
|
||
margin: 0;
|
||
padding: 0;
|
||
height: 100%;
|
||
}
|
||
</style>
|
||
`;
|
||
// height adjustment script
|
||
const heightAdjustmentScript = `
|
||
<script>
|
||
deliverHeightMessage = () => {
|
||
const contentHeight = document.body.scrollHeight;
|
||
|
||
top.postMessage({
|
||
sender: '${pluginName}',
|
||
gistUUID: '${gistUUID}',
|
||
contentHeight: contentHeight
|
||
}, '${obsidianAppOrigin}');
|
||
}
|
||
|
||
window.addEventListener('load', () => {
|
||
deliverHeightMessage();
|
||
})
|
||
</script>
|
||
`;
|
||
// build stylesheet link
|
||
const stylesheetLink = document.createElement('link');
|
||
stylesheetLink.rel = "stylesheet";
|
||
stylesheetLink.href = gistJSON.stylesheet;
|
||
// hack to make links open in the parent
|
||
const parentLinkHack = document.createElement('base');
|
||
parentLinkHack.target = "_parent";
|
||
// Inject content into the iframe
|
||
container.srcdoc = `
|
||
<html>
|
||
<head>
|
||
<!-- hack -->
|
||
${resetStylesheet}
|
||
${parentLinkHack.outerHTML}
|
||
${heightAdjustmentScript}
|
||
|
||
<!-- gist style -->
|
||
${stylesheetLink.outerHTML}
|
||
</head>
|
||
|
||
<body>
|
||
${gistJSON.div}
|
||
</body>
|
||
</html>
|
||
`;
|
||
// insert container into the DOM
|
||
el.appendChild(container);
|
||
});
|
||
}
|
||
_showError(el, gistIDAndFilename, errorMessage = '') {
|
||
return __awaiter(this, void 0, void 0, function* () {
|
||
const errorText = `
|
||
Failed to load the Gist (${gistIDAndFilename}).
|
||
|
||
Error:
|
||
|
||
${errorMessage}
|
||
`.trim();
|
||
el.createEl('pre', { text: errorText });
|
||
});
|
||
}
|
||
}
|
||
|
||
class GistPlugin extends obsidian.Plugin {
|
||
onload() {
|
||
return __awaiter(this, void 0, void 0, function* () {
|
||
const gistProcessor = new GistProcessor();
|
||
this.registerDomEvent(window, "message", gistProcessor.messageEventHandler);
|
||
this.registerMarkdownCodeBlockProcessor("gist", gistProcessor.processor);
|
||
});
|
||
}
|
||
}
|
||
|
||
module.exports = GistPlugin;
|
||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsIm5vZGVfbW9kdWxlcy9uYW5vaWQvaW5kZXguYnJvd3Nlci5qcyIsInNyYy9naXN0X3Byb2Nlc3Nvci50cyIsInNyYy9tYWluLnRzIl0sInNvdXJjZXNDb250ZW50IjpudWxsLCJuYW1lcyI6WyJQbHVnaW4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUF1REE7QUFDTyxTQUFTLFNBQVMsQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUU7QUFDN0QsSUFBSSxTQUFTLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxPQUFPLEtBQUssWUFBWSxDQUFDLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLFVBQVUsT0FBTyxFQUFFLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUU7QUFDaEgsSUFBSSxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxPQUFPLENBQUMsRUFBRSxVQUFVLE9BQU8sRUFBRSxNQUFNLEVBQUU7QUFDL0QsUUFBUSxTQUFTLFNBQVMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO0FBQ25HLFFBQVEsU0FBUyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMs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
|