From de842e51d9a0e133ad08b12276b3f68eef1f261d Mon Sep 17 00:00:00 2001 From: Russell Bryant Date: Wed, 1 Nov 2023 19:21:22 -0400 Subject: [PATCH 1/4] Convert preformatted blocks My wordpress blog had a lot of
 sections. The conversion to
markdown ignored those. This change did what I wanted, which was to
turn all of these into markdown code blocks. In my case, there was no
language set on any of my sections to carry over into markdown, so
that isn't handled at all.
---
 src/translator.js | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/src/translator.js b/src/translator.js
index 615781a..dadc0ba 100644
--- a/src/translator.js
+++ b/src/translator.js
@@ -79,6 +79,20 @@ function initTurndownService() {
 		}
 	});
 
+	turndownService.addRule("pre", {
+		filter: (node, options) => {
+			return (
+				options.codeBlockStyle === "fenced" &&
+				node.nodeName === "PRE" &&
+				node.firstChild
+			);
+		},
+		replacement: (content, node) => {
+			const code = node.textContent;
+			return "\n" + "```" + "\n" + code + "\n" + "```" + "\n";
+		}
+	});
+
 	return turndownService;
 }
 

From 57109198df0758e5612a573c6f86d51d96b57571 Mon Sep 17 00:00:00 2001
From: Drikus Roor 
Date: Mon, 14 Mar 2022 11:07:09 -0300
Subject: [PATCH 2/4] Add support for enlighter code blocks

---
 src/translator.js | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/src/translator.js b/src/translator.js
index dadc0ba..e2e786a 100644
--- a/src/translator.js
+++ b/src/translator.js
@@ -44,6 +44,15 @@ function initTurndownService() {
 		}
 	});
 
+	// preserve enlighter code blocks
+	turndownService.addRule('enlighter', {
+		filter: node => node.nodeName === 'PRE' && node.getAttribute('class') === 'EnlighterJSRAW',
+		replacement: (content, node) => {
+			const language = node.getAttribute('data-enlighter-language') ?? '';
+			return '\n' + '```' + language + '\n' + content + '\n' + '```' + '\n';
+		}
+	});
+
 	// iframe boolean attributes do not need to be set to empty string
 	turndownService.addRule('iframe', {
 		filter: 'iframe',

From 7367370f3467c72d03411028212c298bb9825550 Mon Sep 17 00:00:00 2001
From: Drikus Roor 
Date: Sat, 19 Mar 2022 16:58:48 -0300
Subject: [PATCH 3/4] Fix enlighter rule selector

---
 src/translator.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/translator.js b/src/translator.js
index e2e786a..ecf4b9c 100644
--- a/src/translator.js
+++ b/src/translator.js
@@ -46,7 +46,7 @@ function initTurndownService() {
 
 	// preserve enlighter code blocks
 	turndownService.addRule('enlighter', {
-		filter: node => node.nodeName === 'PRE' && node.getAttribute('class') === 'EnlighterJSRAW',
+		filter: (node) => node.nodeName === 'PRE' && node.classList.contains('EnlighterJSRAW'),
 		replacement: (content, node) => {
 			const language = node.getAttribute('data-enlighter-language') ?? '';
 			return '\n' + '```' + language + '\n' + content + '\n' + '```' + '\n';

From 25efa409946424d90474a0b4a9ce473e595f5356 Mon Sep 17 00:00:00 2001
From: Will Boyd 
Date: Thu, 22 Feb 2024 13:06:23 -0500
Subject: [PATCH 4/4] Generalized code block rule

---
 src/translator.js | 29 +++++++++++------------------
 1 file changed, 11 insertions(+), 18 deletions(-)

diff --git a/src/translator.js b/src/translator.js
index ecf4b9c..7fa6348 100644
--- a/src/translator.js
+++ b/src/translator.js
@@ -44,15 +44,6 @@ function initTurndownService() {
 		}
 	});
 
-	// preserve enlighter code blocks
-	turndownService.addRule('enlighter', {
-		filter: (node) => node.nodeName === 'PRE' && node.classList.contains('EnlighterJSRAW'),
-		replacement: (content, node) => {
-			const language = node.getAttribute('data-enlighter-language') ?? '';
-			return '\n' + '```' + language + '\n' + content + '\n' + '```' + '\n';
-		}
-	});
-
 	// iframe boolean attributes do not need to be set to empty string
 	turndownService.addRule('iframe', {
 		filter: 'iframe',
@@ -88,17 +79,15 @@ function initTurndownService() {
 		}
 	});
 
-	turndownService.addRule("pre", {
-		filter: (node, options) => {
-			return (
-				options.codeBlockStyle === "fenced" &&
-				node.nodeName === "PRE" &&
-				node.firstChild
-			);
+	// convert 
 into a code block with language when appropriate
+	turndownService.addRule('pre', {
+		filter: node => {
+			// a 
 with  inside will already render nicely, so don't interfere
+			return node.nodeName === 'PRE' && !node.querySelector('code');
 		},
 		replacement: (content, node) => {
-			const code = node.textContent;
-			return "\n" + "```" + "\n" + code + "\n" + "```" + "\n";
+			const language = node.getAttribute('data-wetm-language') || '';
+			return '\n\n```' + language + '\n' + node.textContent + '\n```\n\n';
 		}
 	});
 
@@ -123,6 +112,10 @@ function getPostContent(post, turndownService, config) {
 	// by escaping angle brackets (will be unescaped during turndown conversion)
 	content = content.replace(/<(!--more( .*)?--)>/, '<$1>');
 
+	// some WordPress plugins specify a code language in an HTML comment above a
+	// 
 block, save it to a data attribute so the "pre" rule can use it
+	content = content.replace(/(\r?\n