notes/.obsidian/plugins/obsidian-gist/main.js
2021-09-11 18:37:17 +02:00

237 lines
16 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
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 dont 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 dont 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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