Copy selected text with links appended in plain text?
One solution might be to transform every link on the page into the desired format. This could be done using Greasemonkey in Firefox and a custom UserScript. Alternatively, Tampermonkey for Chrome might work as well but I do not use it so I cannot verify that. The downside to this solution would be that you would want to enable it only when needed because leaving it enabled for regular web browsing would distort the layout of page elements such as headers, footers, and sidebars.
Download Greasemonkey for Firefox OR Download Tampermonkey for Chrome
The following UserScript can be saved into a *.user.js file (for example: tmpscript.user.js) and then the file can be dragged into Firefox after Greasemonkey has been installed to install the UserScript.
// ==UserScript==
// @name Transform All Links
// @namespace myscripts
// @description Transforms <a=href>link</a> to { link | <a=href>href</a> }
// @include http*
// @version 1
// @grant none
// ==/UserScript==
try{
transformAnchors();
}catch(err){
alert("error#" + err.number + " name: " + err.name + "\n"
+ "message: " + err.message + "\n"
+ "description: " + err.description);
var errmsg = "";
for (atr in err) {
errmsg = errmsg + atr + " = " + err[atr] + "<br>\n";
}
alert(errmsg);
}
function transformAnchors() {
//get every anchor node
var anchornodes = document.getElementsByTagName("A");
//transform every anchor
for (var i=0; i<anchornodes.length; ++i){
//grab the current anchor node
anchornode = anchornodes[i];
//ignore erroneous nodes with no parent
if (anchornode.parentNode == undefined || anchornode.parentNode == null) continue;
//add text sibling before anchor node : { <a=href>link</a>
anchornode.parentNode.insertBefore(document.createTextNode("{ "),anchornode);
//create styled anchor node to preserve styling
styledanchornode = document.createElement("A");
styledanchornode.setAttribute("class",anchornode.getAttribute("class"));
styledanchornode.setAttribute("style",anchornode.getAttribute("style"));
styledanchornode.setAttribute("title",anchornode.getAttribute("title"));
//put styled anchor node before anchor node
anchornode.parentNode.insertBefore(styledanchornode,anchornode);
//move all anchor node children to before anchor node inside styled anchor node : { link <a=href></a>
while (anchornode.hasChildNodes()){
styledanchornode.appendChild(anchornode.childNodes[0]);
}
//remove styling from anchor node
anchornode.removeAttribute("style");
anchornode.removeAttribute("class");
anchornode.removeAttribute("title");
//add text sibling before anchor node : { link | <a=href></a>
anchornode.parentNode.insertBefore(document.createTextNode(" | "),anchornode);
//add href text child inside anchor node : { link | <a=href>href</a>
anchornode.appendChild(document.createTextNode(anchornode.href));
//add text sibling after anchor node : { link | <a=href>href</a> }
anchornode.parentNode.insertBefore(document.createTextNode(" }"),anchornode.nextSibling);
//increment index to compensate for extra styled anchor node
++i
}
}