'swimming_man':'\ud83c\udfca',
'swimming_woman':'\ud83c\udfca‍\u2640\ufe0f',
'symbols':'\ud83d\udd23',
'synagogue':'\ud83d\udd4d',
'syringe':'\ud83d\udc89',
'tanabata_tree':'\ud83c\udf8b',
'telephone_receiver':'\ud83d\udcde',
'telescope':'\ud83d\udd2d',
'thermometer':'\ud83c\udf21',
'thinking':'\ud83e\udd14',
'thought_balloon':'\ud83d\udcad',
'tickets':'\ud83c\udf9f',
'tipping_hand_man':'\ud83d\udc81‍\u2642\ufe0f',
'tired_face':'\ud83d\ude2b',
'tokyo_tower':'\ud83d\uddfc',
'tornado':'\ud83c\udf2a',
'trackball':'\ud83d\uddb2',
'tractor':'\ud83d\ude9c',
'traffic_light':'\ud83d\udea5',
'triangular_flag_on_post':'\ud83d\udea9',
'triangular_ruler':'\ud83d\udcd0',
'trident':'\ud83d\udd31',
'triumph':'\ud83d\ude24',
'trolleybus':'\ud83d\ude8e',
'tropical_drink':'\ud83c\udf79',
'tropical_fish':'\ud83d\udc20',
'trumpet':'\ud83c\udfba',
'tumbler_glass':'\ud83e\udd43',
'twisted_rightwards_arrows':'\ud83d\udd00',
'two_hearts':'\ud83d\udc95',
'two_men_holding_hands':'\ud83d\udc6c',
'two_women_holding_hands':'\ud83d\udc6d',
'u6307':'\ud83c\ude2f\ufe0f',
'u6708':'\ud83c\ude37\ufe0f',
'u7121':'\ud83c\ude1a\ufe0f',
'umbrella':'\u2614\ufe0f',
'unamused':'\ud83d\ude12',
'underage':'\ud83d\udd1e',
'unicorn':'\ud83e\udd84',
'upside_down_face':'\ud83d\ude43',
'vertical_traffic_light':'\ud83d\udea6',
'vibration_mode':'\ud83d\udcf3',
'video_camera':'\ud83d\udcf9',
'video_game':'\ud83c\udfae',
'volcano':'\ud83c\udf0b',
'volleyball':'\ud83c\udfd0',
'vulcan_salute':'\ud83d\udd96',
'walking_man':'\ud83d\udeb6',
'walking_woman':'\ud83d\udeb6‍\u2640\ufe0f',
'waning_crescent_moon':'\ud83c\udf18',
'waning_gibbous_moon':'\ud83c\udf16',
'warning':'\u26a0\ufe0f',
'wastebasket':'\ud83d\uddd1',
'water_buffalo':'\ud83d\udc03',
'watermelon':'\ud83c\udf49',
'wavy_dash':'\u3030\ufe0f',
'waxing_crescent_moon':'\ud83c\udf12',
'wedding':'\ud83d\udc92',
'weight_lifting_man':'\ud83c\udfcb\ufe0f',
'weight_lifting_woman':'\ud83c\udfcb\ufe0f‍\u2640\ufe0f',
'wheel_of_dharma':'\u2638\ufe0f',
'wheelchair':'\u267f\ufe0f',
'white_check_mark':'\u2705',
'white_circle':'\u26aa\ufe0f',
'white_flag':'\ud83c\udff3\ufe0f',
'white_flower':'\ud83d\udcae',
'white_large_square':'\u2b1c\ufe0f',
'white_medium_small_square':'\u25fd\ufe0f',
'white_medium_square':'\u25fb\ufe0f',
'white_small_square':'\u25ab\ufe0f',
'white_square_button':'\ud83d\udd33',
'wilted_flower':'\ud83e\udd40',
'wind_chime':'\ud83c\udf90',
'wind_face':'\ud83c\udf2c',
'wine_glass':'\ud83c\udf77',
'woman_artist':'\ud83d\udc69‍\ud83c\udfa8',
'woman_astronaut':'\ud83d\udc69‍\ud83d\ude80',
'woman_cartwheeling':'\ud83e\udd38‍\u2640\ufe0f',
'woman_cook':'\ud83d\udc69‍\ud83c\udf73',
'woman_facepalming':'\ud83e\udd26‍\u2640\ufe0f',
'woman_factory_worker':'\ud83d\udc69‍\ud83c\udfed',
'woman_farmer':'\ud83d\udc69‍\ud83c\udf3e',
'woman_firefighter':'\ud83d\udc69‍\ud83d\ude92',
'woman_health_worker':'\ud83d\udc69‍\u2695\ufe0f',
'woman_judge':'\ud83d\udc69‍\u2696\ufe0f',
'woman_juggling':'\ud83e\udd39‍\u2640\ufe0f',
'woman_mechanic':'\ud83d\udc69‍\ud83d\udd27',
'woman_office_worker':'\ud83d\udc69‍\ud83d\udcbc',
'woman_pilot':'\ud83d\udc69‍\u2708\ufe0f',
'woman_playing_handball':'\ud83e\udd3e‍\u2640\ufe0f',
'woman_playing_water_polo':'\ud83e\udd3d‍\u2640\ufe0f',
'woman_scientist':'\ud83d\udc69‍\ud83d\udd2c',
'woman_shrugging':'\ud83e\udd37‍\u2640\ufe0f',
'woman_singer':'\ud83d\udc69‍\ud83c\udfa4',
'woman_student':'\ud83d\udc69‍\ud83c\udf93',
'woman_teacher':'\ud83d\udc69‍\ud83c\udfeb',
'woman_technologist':'\ud83d\udc69‍\ud83d\udcbb',
'woman_with_turban':'\ud83d\udc73‍\u2640\ufe0f',
'womans_clothes':'\ud83d\udc5a',
'womans_hat':'\ud83d\udc52',
'women_wrestling':'\ud83e\udd3c‍\u2640\ufe0f',
'world_map':'\ud83d\uddfa',
'worried':'\ud83d\ude1f',
'writing_hand':'\u270d\ufe0f',
'yellow_heart':'\ud83d\udc9b',
'yin_yang':'\u262f\ufe0f',
'zipper_mouth_face':'\ud83e\udd10',
'octocat': '<img alt=":octocat:" height="20" width="20" align="absmiddle" src="https://assets-cdn.github.com/images/icons/emoji/octocat.png">',
'showdown': '<span style="font-family: \'Anonymous Pro\', monospace; text-decoration: underline; text-decoration-style: dashed; text-decoration-color: #3e8b8a;text-underline-position: under;">S</span>'
* Created by Estevao on 31-05-2015.
* Showdown Converter class
* @param {object} [converterOptions]
showdown.Converter = function (converterOptions) {
* Options used by this converter
* Language extensions used by this converter
* Output modifiers extensions used by this converter
* The flavor set in this converter
setConvFlavor = setFlavor,
* Metadata of the document
* @type {{parsed: {}, raw: string, format: string}}
function _constructor () {
converterOptions = converterOptions || {};
for (var gOpt in globalOptions) {
if (globalOptions.hasOwnProperty(gOpt)) {
options[gOpt] = globalOptions[gOpt];
if (typeof converterOptions === 'object') {
for (var opt in converterOptions) {
if (converterOptions.hasOwnProperty(opt)) {
options[opt] = converterOptions[opt];
throw Error('Converter expects the passed parameter to be an object, but ' + typeof converterOptions +
if (options.extensions) {
showdown.helper.forEach(options.extensions, _parseExtension);
* @param {string} [name='']
function _parseExtension (ext, name) {
// If it's a string, the extension was previously loaded
if (showdown.helper.isString(ext)) {
ext = showdown.helper.stdExtName(ext);
if (showdown.extensions[ext]) {
console.warn('DEPRECATION WARNING: ' + ext + ' is an old extension that uses a deprecated loading method.' +
'Please inform the developer that the extension should be updated!');
legacyExtensionLoading(showdown.extensions[ext], ext);
// END LEGACY SUPPORT CODE
} else if (!showdown.helper.isUndefined(extensions[ext])) {
throw Error('Extension "' + ext + '" could not be loaded. It was either not found or is not a valid extension.');
if (typeof ext === 'function') {
if (!showdown.helper.isArray(ext)) {
var validExt = validate(ext, name);
throw Error(validExt.error);
for (var i = 0; i < ext.length; ++i) {
langExtensions.push(ext[i]);
outputModifiers.push(ext[i]);
if (ext[i].hasOwnProperty('listeners')) {
for (var ln in ext[i].listeners) {
if (ext[i].listeners.hasOwnProperty(ln)) {
listen(ln, ext[i].listeners[ln]);
function legacyExtensionLoading (ext, name) {
if (typeof ext === 'function') {
ext = ext(new showdown.Converter());
if (!showdown.helper.isArray(ext)) {
var valid = validate(ext, name);
throw Error(valid.error);
for (var i = 0; i < ext.length; ++i) {
langExtensions.push(ext[i]);
outputModifiers.push(ext[i]);
default:// should never reach here
throw Error('Extension loader error: Type unrecognized!!!');
* @param {function} callback
function listen (name, callback) {
if (!showdown.helper.isString(name)) {
throw Error('Invalid argument in converter.listen() method: name must be a string, but ' + typeof name + ' given');
if (typeof callback !== 'function') {
throw Error('Invalid argument in converter.listen() method: callback must be a function, but ' + typeof callback + ' given');
if (!listeners.hasOwnProperty(name)) {
listeners[name].push(callback);
function rTrimInputText (text) {
var rsp = text.match(/^\s*/)[0].length,
rgx = new RegExp('^\\s{0,' + rsp + '}', 'gm');
return text.replace(rgx, '');
* @param {string} evtName Event name
* @param {string} text Text
* @param {{}} options Converter Options
this._dispatch = function dispatch (evtName, text, options, globals) {
if (listeners.hasOwnProperty(evtName)) {
for (var ei = 0; ei < listeners[evtName].length; ++ei) {
var nText = listeners[evtName][ei](evtName, text, this, options, globals);
if (nText && typeof nText !== 'undefined') {
* @param {function} callback
* @returns {showdown.Converter}
this.listen = function (name, callback) {
* Converts a markdown string into HTML
this.makeHtml = function (text) {
//check if text is not falsy
langExtensions: langExtensions,
outputModifiers: outputModifiers,
// This lets us use ¨ trema as an escape char to avoid md5 hashes
// The choice of character is arbitrary; anything that isn't
// magic in Markdown will work.
text = text.replace(/¨/g, '¨T');
// RegExp interprets $ as a special character
// when it's in a replacement string
text = text.replace(/\$/g, '¨D');
// Standardize line endings
text = text.replace(/\r\n/g, '\n'); // DOS to Unix
text = text.replace(/\r/g, '\n'); // Mac to Unix
// Stardardize line spaces
text = text.replace(/\u00A0/g, ' ');
if (options.smartIndentationFix) {
text = rTrimInputText(text);
// Make sure text begins and ends with a couple of newlines:
text = '\n\n' + text + '\n\n';
text = showdown.subParser('detab')(text, options, globals);
* Strip any lines consisting only of spaces and tabs.
* This makes subsequent regexs easier to write, because we can
* match consecutive blank lines with /\n+/ instead of something
* contorted like /[ \t]*\n+/
text = text.replace(/^[ \t]+$/mg, '');
showdown.helper.forEach(langExtensions, function (ext) {
text = showdown.subParser('runExtension')(ext, text, options, globals);
text = showdown.subParser('metadata')(text, options, globals);
text = showdown.subParser('hashPreCodeTags')(text, options, globals);
text = showdown.subParser('githubCodeBlocks')(text, options, globals);
text = showdown.subParser('hashHTMLBlocks')(text, options, globals);
text = showdown.subParser('hashCodeTags')(text, options, globals);
text = showdown.subParser('stripLinkDefinitions')(text, options, globals);
text = showdown.subParser('blockGamut')(text, options, globals);
text = showdown.subParser('unhashHTMLSpans')(text, options, globals);
text = showdown.subParser('unescapeSpecialChars')(text, options, globals);
// attacklab: Restore dollar signs
text = text.replace(/¨D/g, '$$');
// attacklab: Restore tremas