javascript: Promise.all([import('https://unpkg.com/turndown@6.0.0?module'), import('https://unpkg.com/@tehshrike/readability@0.2.0'), ]).then(async ([{ default: Turndown }, { default: Readability }]) => { /* Optional vault name */ const vault = ""; /* Optional folder name such as "Clippings/" */ const folder = ""; /* Optional tags */ let tags = "clippings"; /* Parse the site's meta keywords content into tags, if present */ if (document.querySelector('meta[name="keywords" i]')) { var keywords = document.querySelector('meta[name="keywords" i]').getAttribute('content').split(','); keywords.forEach(function(keyword) { let tag = ' ' + keyword.split(' ').join(''); tags += tag; }); } function getSelectionHtml() { var html = ""; if (typeof window.getSelection != "undefined") { var sel = window.getSelection(); if (sel.rangeCount) { var container = document.createElement("div"); for (var i = 0, len = sel.rangeCount; i < len; ++i) { container.appendChild(sel.getRangeAt(i).cloneContents()); } html = container.innerHTML; } } else if (typeof document.selection != "undefined") { if (document.selection.type == "Text") { html = document.selection.createRange().htmlText; } } return html; } const selection = getSelectionHtml(); const { title, byline, content } = new Readability(document.cloneNode(true)).parse(); function getFileName(fileName) { var userAgent = window.navigator.userAgent, platform = window.navigator.platform, windowsPlatforms = ['Win32', 'Win64', 'Windows', 'WinCE']; if (windowsPlatforms.indexOf(platform) !== -1) { fileName = fileName.replace(':', '').replace(/[/\\?%*|"<>]/g, '-'); } else { fileName = fileName.replace(':', '').replace(/\//g, '-').replace(/\\/g, '-'); } return fileName; } const fileName = getFileName(title); if (selection) { var markdownify = selection; } else { var markdownify = content; } if (vault) { var vaultName = '&vault=' + encodeURIComponent(`${vault}`); } else { var vaultName = ''; } const markdownBody = new Turndown({ headingStyle: 'atx', hr: '---', bulletListMarker: '-', codeBlockStyle: 'fenced', emDelimiter: '*', }).turndown(markdownify); var date = new Date(); function convertDate(date) { var yyyy = date.getFullYear().toString(); var mm = (date.getMonth()+1).toString(); var dd = date.getDate().toString(); var mmChars = mm.split(''); var ddChars = dd.split(''); return yyyy + '-' + (mmChars[1]?mm:"0"+mmChars[0]) + '-' + (ddChars[1]?dd:"0"+ddChars[0]); } const today = convertDate(date); /* Fetch the meta author */ var metaAuthorElement = document.querySelector("meta[name='author']"); var metaAuthor = metaAuthorElement ? metaAuthorElement.getAttribute("content") : ""; /* Fetch site name as backup */ var metaSiteNameElement = document.querySelector("meta[name='og:site_name']"); var siteName = metaSiteNameElement ? metaSiteNameElement.getAttribute("content") : ""; /* Check if there's an author and add brackets */ var authorBrackets = ""; if (byline && byline.trim() !== "") { authorBrackets = '"[[ ' + byline + ' ]]"'; } else if (metaAuthor && metaAuthor.trim() !== "") { authorBrackets = '"[[ ' + metaAuthor + ' ]]"'; } else if (siteName && siteName.trim() !== "") { authorBrackets = '"[[ ' + siteName + ' ]]"'; } /* YAML front matter as tags render cleaner with special chars */ const fileContent = '---\n' + 'author: ' + authorBrackets + '\n' + 'title: ' + title + '\n' + 'source: ' + document.URL + '\n' + 'clipped: ' + today + '\n' + 'published: \n' + 'tags: [' + tags + ']\n' + '---\n\n' + markdownBody ; /* assemble URL, decrementing each time, until it does not exceed the max URL length for this browser, supposedly 2048 but allow for a little error with 2030 */ contentLength = 2048; maxURLLength = 2030; decrement = 1; do { hrefString = 'obsidian://new?' + 'file=' + encodeURIComponent(folder + fileName) + '&content=' + encodeURIComponent(fileContent.substr(0,contentLength-1)) + vaultName ; contentLength = contentLength - decrement; } while (hrefString.length > maxURLLength); document.location.href = hrefString; })