|
javascript: Promise.all([import('https://unpkg.com/[email protected]?module'), import('https://unpkg.com/@tehshrike/[email protected]'), ]).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 + ' ]]"'; |
|
} |
|
|
|
/* Try to get published date */ |
|
var timeElement = document.querySelector("time"); |
|
var publishedDate = timeElement ? timeElement.getAttribute("datetime") : ""; |
|
|
|
if (publishedDate && publishedDate.trim() !== "") { |
|
var date = new Date(publishedDate); |
|
var year = date.getFullYear(); |
|
var month = date.getMonth() + 1; // Months are 0-based in JavaScript |
|
var day = date.getDate(); |
|
|
|
// Pad month and day with leading zeros if necessary |
|
month = month < 10 ? '0' + month : month; |
|
day = day < 10 ? '0' + day : day; |
|
|
|
var published = year + '-' + month + '-' + day; |
|
} else { |
|
var published = '' |
|
} |
|
|
|
/* 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: ' + 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; |
|
|
|
}) |