showdownjs / showdown

A bidirectional Markdown to HTML to Markdown converter written in Javascript
http://www.showdownjs.com/
MIT License
14.34k stars 1.57k forks source link

Converter HTML to MARKDOWN and then to HTML issue #809

Open foward opened 4 years ago

foward commented 4 years ago

Hi,

I am extracting some content from html and storing the html extracted in markdown format (I need to do this due internal search engine issues with html) so then in other place I can re-render as html back... the problem is that when I do this I am not getting the same html as the original. Can you please help me to see where is the error?

This code I have in node.js : var showdown = require('showdown'); `

  const jsdom = require('jsdom');
  const dom = new jsdom.JSDOM();
  const converter = new showdown.Converter();
  const html = originalHTML;
  content= converter.makeMarkdown(html, dom.window.document);

`

and then when I want to render the markdown into html I am doing in the node.js server as well :

var showdown = require("showdown"); `

  var converter = new showdown.Converter();
  body = converter.makeHtml(content);`

Here I can show you an html example: Original HTML: <p>Die Ersteinreise von <a class="RichTextGlossarLink GlossarEntry" href="SharedDocs/glossareintraege/DE/d/drittstaatsangehoerige.html" target="_blank" rel="noopener noreferrer" title="Verlinkung zu dem Glossarbegriff&nbsp;&quot;Drittstaatsangehörige&quot; (Öffnet&nbsp;neues&nbsp;Fenster)" data-href="SharedDocs/glossareintraege/DE/d/drittstaatsangehoerige.html?view=renderLightbox">Drittstaatsangehörigen</a> zum Zweck des <a class="RichTextGlossarLink GlossarEntry" href="SharedDocs/glossareintraege/DE/f/familiennachzug.html" target="_blank" rel="noopener noreferrer" title="Verlinkung zu dem Glossarbegriff&nbsp;&quot;Familiennachzug&quot; (Öffnet&nbsp;neues&nbsp;Fenster)" data-href="SharedDocs/glossareintraege/DE/f/familiennachzug.html?view=renderLightbox">Familiennachzugs</a> ist grundsätzlich nicht möglich, es sei denn, es liegt ein zwingender Grund zur Einreise vor.</p>

Converted to Markdown: Die Ersteinreise von [Drittstaatsangehörigen](<SharedDocs/glossareintraege/DE/d/drittstaatsangehoerige.html> "Verlinkung zu dem Glossarbegriff "Drittstaatsangehörige" (Öffnet neues Fenster)") zum Zweck des [Familiennachzugs](<SharedDocs/glossareintraege/DE/f/familiennachzug.html> "Verlinkung zu dem Glossarbegriff "Familiennachzug" (Öffnet neues Fenster)") ist grundsätzlich nicht möglich, es sei denn, es liegt ein zwingender Grund zur Einreise vor.

Then the above text converted to HTML is not converting the links correctly: <p>Die Ersteinreise von [Drittstaatsangehörigen](<SharedDocs/glossareintraege/DE/d/drittstaatsangehoerige.html> "Verlinkung zu dem Glossarbegriff&nbsp;"Drittstaatsangehörige" (Öffnet&nbsp;neues&nbsp;Fenster)") zum Zweck des [Familiennachzugs](<SharedDocs/glossareintraege/DE/f/familiennachzug.html> "Verlinkung zu dem Glossarbegriff&nbsp;"Familiennachzug" (Öffnet&nbsp;neues&nbsp;Fenster)") ist grundsätzlich nicht möglich, es sei denn, es liegt ein zwingender Grund zur Einreise vor.</p>

punituee commented 4 years ago

try with absolute href links instead of currently relative links example href="SharedDocs/glossareintraege/DE/d/drittstaatsangehoerige.html" should be converted to href="https://www.example.com/SharedDocs/glossareintraege/DE/d/drittstaatsangehoerige.html"

vicent4no commented 1 year ago

I would like to point out that an issue here is that the first anchor tag, when parsed to markdown link, inserts "<" and a ">" characters at the beginning and end of the URL respectively

ErikBrendel commented 11 months ago

Just noticed the same problem. Why are angle brackets inserted into the generated markdown link syntax? This seems to not follow the markdown syntax, please fix.

Workaround: After converting from HTML to Markdown via this library, apply a regex to fix the generated links:

const rawMarkdown = converter.makeMarkdown(myHtmlString)
// fixing links, see https://github.com/showdownjs/showdown/issues/809
const cleanedMarkdown = rawMarkdown.replace(/\[([^[\]]*)\]\(<([^<>()]*)>\)/g, "[$1]($2)")