%PDF- %PDF-
| Direktori : /home/opti/workflow/node_modules/express-mailer/node_modules/nodemailer/lib/ |
| Current File : /home/opti/workflow/node_modules/express-mailer/node_modules/nodemailer/lib/helpers.js |
"use strict";
var he = require("he");
// expose to the world
module.exports.stripHTML = stripHTML;
/**
* <p>Converts a HTML stringo into plaintext format that resembles Markdown</p>
*
* <p>Only good for simple and valid HTML, probably breaks on eveything else</p>
*
* <p>Placeholders:</p>
*
* <ul>
* <li>-\u0000\u0000- for newline</li>
* <li>-\u0001\u0001- for a space</li>
* <li>-\u0002\u0002- temporary newlines</li>
* </ul>
*
* @param {String} str HTML string to convert
* @return {String} Plaintext that resembles Markdown
*/
function stripHTML(str){
str = (str || "").toString("utf-8").trim();
// remove head
str = str.replace(/<head[\s\S]{1,}?\/head>/gi, '');
// replace newlines
str = str.replace(/\r?\n|\r/g,"-\u0002\u0002-");
// convert block element endings to linebreak markers
str = str.replace(/<(?:\/p|br\s*\/*|\/tr|\/table|\/div)>/g,"-\u0000\u0000--\u0000\u0000-");
// H1-H6, add underline or prepend with #
str = str.replace(/<[hH](\d)[^>]*>(.*?)<\/[hH]\d[^>]*>/g,function(match, level, content){
var line = "",
symbol, // line symbol char
len;
level = Number(level) || 0;
content = he.decode(content.replace(/<[^>]*>/g," ").
replace(/\s\s+/g," ")).
trim();
if(!content){
// the tag was empty or only included other tags (<img> and such), nothing to show
return "";
}
// select correct symbol for the line
switch(level){
case 1:
symbol = "=";
len = content.length;
break;
case 2:
symbol = "-";
len = content.length;
break;
default:
symbol = "#";
len = level;
}
line = new Array(len+1).join(symbol);
if(symbol == "#"){
// prepend the line:
// ### This is a H3
return line + " " + content + "\n\n";
}else{
// add underline:
// This is a H1
// ============
return content + "\n" + line + "\n\n";
}
});
// B
str = str.replace(/<(?:b|strong)(?: [^>])?>(.*?)<\/(?:b|strong)>/ig,function(match, content){
return "**" + content.trim() + "**";
});
// U
str = str.replace(/<u(?: [^>])?>(.*?)<\/u>/ig,function(match, content){
return "_" + content.trim() + "_";
});
// EM
str = str.replace(/<(?:i|em)(?: [^>])?>(.*?)<\/(?:i|em)>/ig,function(match, content){
return "*" + content.trim() + "*";
});
// CODE
str = str.replace(/<code(?: [^>])?>(.*?)<\/code>/ig,function(match, content){
return "`" + content.trim() + "`";
});
// A
str = str.replace(/<a ([^>]*)>(.*?)<\/a[^>]*>/ig,function(match, params, content){
var paramMatch = params.match(/href\s*=\s*['"]([^'"]+)['"]/),
url = paramMatch && paramMatch[1] || "#";
return "[" + content.trim() + "]" + "(" + url +")";
});
// UL, replace with newlines
str = str.replace(/(<\/(?:ul|ol)>)/gi,"$1-\u0000\u0000--\u0000\u0000-");
// LI, indent by 2 spaces + *
str = str.replace(/<li[^>]*>(.*?)<\/?(?:li|ol|ul)[^>]*>/ig,function(match, content){
content = content.replace(/<[^>]*>/g," ").
replace(/\s\s+/g," ").
trim();
if(!content){
// the tag was empty or only included other tags (<img> and such), nothing to show
return "";
}
// return with the space placeholders
return "-\u0001\u0001--\u0001\u0001-* " + content + "\n";
});
// PRE, indent by 4 spaces
str = str.replace(/<pre[^>]*>(.*?)<\/pre[^>]*>/ig,function(match, content){
if(!content){
return "";
}
// remove empty lines before and after
content = content.replace(/^((?:[ \t]*)\-\u0002\u0002\-)+|((?:\-\u0002\u0002\-[ \t]*))+$/g, "");
// replace tabs with 4 spaces
content = content.replace(/\t/g, " ");
// replace temp. linebreak placeholders with 4 space placehorlders
content = content.replace(/\-\u0002\u0002\-([ ]*)/g, function(match, spaces){
// keep spaces in the beginning of the lines
spaces = spaces.replace(/ /g, "-\u0001\u0001-");
return "\n-\u0001\u0001--\u0001\u0001--\u0001\u0001--\u0001\u0001-" + spaces;
});
content = content.replace(/</g,"<").replace(/>/g,">");
// add prepending 4 spaces
return "\n-\u0001\u0001--\u0001\u0001--\u0001\u0001--\u0001\u0001-" + content.trim() + "\n\n";
});
// remove all remaining html tags
str = str.replace(/<[^>]*>/g," ");
// remove duplicate spaces
str = str.replace(/[ ][ ]+/g," ");
// remove temp. newlines
str = str.replace(/-\u0002\u0002-/g," ");
// restore newlines
str = str.replace(/-\u0000\u0000-/g,"\n");
// remove spaces before and after newlines
str = str.replace(/[ \t]*\n[ \t]*/g,"\n");
// remove more than 2 newlines in a row
str = str.replace(/\n\n+/g,"\n\n");
// restore hidden spaces
str = str.replace(/-\u0001\u0001-/g," ");
// decode HTML entities (< and such)
str = he.decode(str);
return str.trim();
}