markedjs / marked

A markdown parser and compiler. Built for speed.
https://marked.js.org
Other
33.17k stars 3.39k forks source link

Tabs within code block are converted to 4 spaces? #644

Closed reggi closed 6 years ago

reggi commented 9 years ago

You can see I have to code blocks one with a two space indentation and one with a tab. The tab is oddly converted to 4 spaces.

var marked = require('marked')
var Promise = require('bluebird')
var markedAsync = Promise.promisify(marked)
var markdown = [
  '```js',
  'if (true) {',
  '   console.log(\'word spaces\')',
  '}',
  '```',
  '```js',
  'if (true) {',
  ' console.log(\'word tabs\')',
  '}',
  '```'
].join('\n')
console.log(JSON.stringify(markdown))
markedAsync(markdown)
.then(function (html) {
  console.log(JSON.stringify(html))
})
"```js\nif (true) {\n  console.log('word spaces')\n}\n```\n```js\nif (true) {\n\tconsole.log('word tabs')\n}\n```"
"<pre><code class=\"lang-js\">if (true) {\n  console.log(&#39;word spaces&#39;)\n}\n</code></pre>\n<pre><code class=\"lang-js\">if (true) {\n    console.log(&#39;word tabs&#39;)\n}\n</code></pre>\n"
mbovel commented 8 years ago

Same problem here. I think this is definitely a bug: code blocks should not be modified in any way. That's the behaviour promoted by CommonMark.

Discount and Pandoc, however, also seem to convert tabs to spaces.

joshbruce commented 6 years ago

983

Feder1co5oave commented 6 years ago

You're right, commonmark says that. However, marked heavily relies on the fact that everything is indented with spaces. Code blocks, list, blockquotes... I don't think this can be changed without a massive review of the source code.

vixalien commented 2 years ago

If it is not possible to let tabs remain the same, atleast allow the user the select the number of spaces they want.

UziTech commented 2 years ago

@vixalien you can convert them before you send the markdown to marked.

// tab is 2 spaces
marked.parse(markdown.replace(/\t/g, '  '))