diff --git a/dist/showdown.js b/dist/showdown.js index f7f0afd..dbec2e3 100644 Binary files a/dist/showdown.js and b/dist/showdown.js differ diff --git a/dist/showdown.js.map b/dist/showdown.js.map index 7655b9b..ee3f236 100644 Binary files a/dist/showdown.js.map and b/dist/showdown.js.map differ diff --git a/dist/showdown.min.js b/dist/showdown.min.js index 9bd6f2e..b95e39d 100644 Binary files a/dist/showdown.min.js and b/dist/showdown.min.js differ diff --git a/dist/showdown.min.js.map b/dist/showdown.min.js.map index ce0f7b9..71a943d 100644 Binary files a/dist/showdown.min.js.map and b/dist/showdown.min.js.map differ diff --git a/src/showdown.js b/src/showdown.js index ef17ba9..0ff94bd 100644 --- a/src/showdown.js +++ b/src/showdown.js @@ -6,7 +6,8 @@ var showdown = {}, parsers = {}, globalOptions = { - omitExtraWLInCodeBlocks: false + omitExtraWLInCodeBlocks: false, + prefixHeaderId: false }; /////////////////////////////////////////////////////////////////////////// @@ -29,10 +30,17 @@ showdown.extensions = {}; //Public methods showdown.setOption = function (key, value) { globalOptions[key] = value; - return this; }; +showdown.getOption = function (key) { + return globalOptions[key]; +}; + +showdown.getOptions = function () { + return globalOptions; +}; + /** * Static Method * @@ -97,7 +105,8 @@ showdown.Converter = function (converterOptions) { gHtmlBlocks: [], gUrls: {}, gTitles: {}, - gListLevel: 0 + gListLevel: 0, + hashLinkCounts: {} }; // attacklab: Replace ~ with ~T diff --git a/src/subParsers/headers.js b/src/subParsers/headers.js index 8af2739..80cc1d3 100644 --- a/src/subParsers/headers.js +++ b/src/subParsers/headers.js @@ -5,6 +5,8 @@ showdown.subParser('headers', function (text, options, globals) { 'use strict'; + var prefixHeader = options.prefixHeaderId; + // Set text-style headers: // Header 1 // ======== @@ -52,7 +54,25 @@ showdown.subParser('headers', function (text, options, globals) { }); function headerId(m) { - return m.replace(/[^\w]/g, '').toLowerCase(); + var title, + escapedId = m.replace(/[^\w]/g, '').toLowerCase(); + + if (globals.hashLinkCounts[escapedId]) { + title = escapedId + '-' + (globals.hashLinkCounts[escapedId]++); + } else { + title = escapedId; + globals.hashLinkCounts[escapedId] = 1; + } + + // Prefix id to prevent causing inadvertent pre-existing style matches. + if (prefixHeader === true) { + prefixHeader = 'section'; + } + + if (showdown.helper.isString(prefixHeader)) { + return prefixHeader + title; + } + return title; } return text; diff --git a/test/cases/repeated-headers.html b/test/cases/repeated-headers.html new file mode 100644 index 0000000..97acc54 --- /dev/null +++ b/test/cases/repeated-headers.html @@ -0,0 +1,5 @@ +

Same Title

+ +

some text

+ +

Same Title

diff --git a/test/cases/repeated-headers.md b/test/cases/repeated-headers.md new file mode 100644 index 0000000..4369318 --- /dev/null +++ b/test/cases/repeated-headers.md @@ -0,0 +1,5 @@ +# Same Title + +some text + +# Same Title