From d4771050a45d59bf4bf504dc602969388eca658f Mon Sep 17 00:00:00 2001 From: zuzanna-maria Date: Thu, 21 Nov 2024 10:29:15 +0100 Subject: [PATCH 01/11] Added table formatting for Pad docs exported as .md --- www/pad/export.js | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/www/pad/export.js b/www/pad/export.js index 6e9de71c1..0370e1b71 100644 --- a/www/pad/export.js +++ b/www/pad/export.js @@ -96,7 +96,29 @@ define([ if (ext === ".md") { var md = Turndown({ headingStyle: 'atx' - }).turndown(toExport); + }).addRule('table', { + filter: ['tr'], + replacement: function (content, node) { + var indexOf = Array.prototype.indexOf; + var index = indexOf.call(node.parentNode.childNodes, node); + var rowContent = node.innerHTML.replace(/|<\/td>/g, '').split('
') + rowContent[0] = `|${rowContent[0]}` + var row = '' + var rowLength = rowContent.filter(Boolean).length + for (var i =0; i < rowLength; i++) { + var cell = rowContent[i] + cell += ' |' + row += cell + } + var newRow = row.concat('\n') + if (index === 0) { + var separator = '|-' + newRow += `${separator.repeat(rowLength)}\n` + } + return newRow + }}) + .turndown(toExport); + console.log(md) var mdBlob = new Blob([md], { type: 'text/markdown;charset=utf-8' }); From 9cc2569078a21ba2b5bb85638515b6d1bd405ebe Mon Sep 17 00:00:00 2001 From: zuzanna-maria Date: Fri, 22 Nov 2024 13:14:26 +0100 Subject: [PATCH 02/11] Added strikethrough formatting support and linting --- www/pad/export.js | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/www/pad/export.js b/www/pad/export.js index 0370e1b71..1225bc918 100644 --- a/www/pad/export.js +++ b/www/pad/export.js @@ -101,24 +101,27 @@ define([ replacement: function (content, node) { var indexOf = Array.prototype.indexOf; var index = indexOf.call(node.parentNode.childNodes, node); - var rowContent = node.innerHTML.replace(/|<\/td>/g, '').split('
') - rowContent[0] = `|${rowContent[0]}` - var row = '' - var rowLength = rowContent.filter(Boolean).length + var rowContent = node.innerHTML.replace(/|<\/td>/g, '').split('
'); + rowContent[0] = `|${rowContent[0]}`; + var row = ''; + var rowLength = rowContent.filter(Boolean).length; for (var i =0; i < rowLength; i++) { - var cell = rowContent[i] - cell += ' |' - row += cell + var cell = rowContent[i] + ' |'; + row += cell; } - var newRow = row.concat('\n') + var newRow = row.concat('\n'); if (index === 0) { - var separator = '|-' - newRow += `${separator.repeat(rowLength)}\n` + var separator = '|-'; + newRow += `${separator.repeat(rowLength)}\n`; } - return newRow - }}) + return newRow; + }}).addRule('strikethrough', { + filter: ['s', 'del', 'strike'], + replacement: function (content) { + return '~' + content + '~'; + } + }) .turndown(toExport); - console.log(md) var mdBlob = new Blob([md], { type: 'text/markdown;charset=utf-8' }); From 9ed99afc85189525691718f228295300fe9805ea Mon Sep 17 00:00:00 2001 From: zuzanna-maria Date: Thu, 5 Dec 2024 09:51:16 +0100 Subject: [PATCH 03/11] Parsing out HTML tags on Firefox --- www/pad/export.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/www/pad/export.js b/www/pad/export.js index 1225bc918..9fd2bcaaa 100644 --- a/www/pad/export.js +++ b/www/pad/export.js @@ -101,7 +101,7 @@ define([ replacement: function (content, node) { var indexOf = Array.prototype.indexOf; var index = indexOf.call(node.parentNode.childNodes, node); - var rowContent = node.innerHTML.replace(/|<\/td>/g, '').split('
'); + var rowContent = node.innerHTML.replace(//g, '').replace(/
/g, ' ').split(''); rowContent[0] = `|${rowContent[0]}`; var row = ''; var rowLength = rowContent.filter(Boolean).length; @@ -114,6 +114,8 @@ define([ var separator = '|-'; newRow += `${separator.repeat(rowLength)}\n`; } + var parser = new DOMParser() + newRow = parser.parseFromString(newRow, 'text/html').children[0].innerText return newRow; }}).addRule('strikethrough', { filter: ['s', 'del', 'strike'], From fcbf122f3c6b0e8d4e59a30fa1abf278803e06a1 Mon Sep 17 00:00:00 2001 From: zuzanna-maria Date: Thu, 5 Dec 2024 09:59:24 +0100 Subject: [PATCH 04/11] Linting --- www/pad/export.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/www/pad/export.js b/www/pad/export.js index 9fd2bcaaa..d6650c817 100644 --- a/www/pad/export.js +++ b/www/pad/export.js @@ -114,8 +114,8 @@ define([ var separator = '|-'; newRow += `${separator.repeat(rowLength)}\n`; } - var parser = new DOMParser() - newRow = parser.parseFromString(newRow, 'text/html').children[0].innerText + var parser = new DOMParser(); + newRow = parser.parseFromString(newRow, 'text/html').children[0].innerText; return newRow; }}).addRule('strikethrough', { filter: ['s', 'del', 'strike'], From 7a00b6b4a20c06e7e14666374b83efc7d52c3594 Mon Sep 17 00:00:00 2001 From: zuzanna-maria Date: Sun, 8 Dec 2024 22:05:04 +0100 Subject: [PATCH 05/11] Formatting accounts for headers --- www/pad/export.js | 52 ++++++++++++++++++++++++++++++----------------- 1 file changed, 33 insertions(+), 19 deletions(-) diff --git a/www/pad/export.js b/www/pad/export.js index d6650c817..897bd778a 100644 --- a/www/pad/export.js +++ b/www/pad/export.js @@ -97,26 +97,40 @@ define([ var md = Turndown({ headingStyle: 'atx' }).addRule('table', { - filter: ['tr'], + filter: ['table'], replacement: function (content, node) { - var indexOf = Array.prototype.indexOf; - var index = indexOf.call(node.parentNode.childNodes, node); - var rowContent = node.innerHTML.replace(//g, '').replace(/
/g, ' ').split(''); - rowContent[0] = `|${rowContent[0]}`; - var row = ''; - var rowLength = rowContent.filter(Boolean).length; - for (var i =0; i < rowLength; i++) { - var cell = rowContent[i] + ' |'; - row += cell; - } - var newRow = row.concat('\n'); - if (index === 0) { - var separator = '|-'; - newRow += `${separator.repeat(rowLength)}\n`; - } - var parser = new DOMParser(); - newRow = parser.parseFromString(newRow, 'text/html').children[0].innerText; - return newRow; + var childNodeArr = Array.from(node.childNodes) + var table = '' + childNodeArr.forEach(function(cN) { + cN.childNodes.forEach(function(childNode) { + var childNodes = Array.from(childNode.childNodes) + var rowContent = childNodes + var indexOf = Array.prototype.indexOf; + var index; + if (childNodeArr.length > 1) { + index = indexOf.call(node.childNodes, cN); + } else { + index = indexOf.call(cN.childNodes, childNode); + } + rowContent[0].textContent = `|${rowContent[0].textContent}`; + var row = ''; + var rowLength = rowContent.filter(Boolean).length; + for (var i =0; i < rowLength; i++) { + var cell = rowContent[i].textContent + ' |'; + row += cell; + } + var newRow = row.concat('\n'); + if (index === 0) { + var separator = '|-'; + newRow += `${separator.repeat(rowLength)}\n`; + } + var parser = new DOMParser(); + newRow = parser.parseFromString(newRow, 'text/html').children[0].innerText; + table += newRow + return newRow; + }) + }) + return table }}).addRule('strikethrough', { filter: ['s', 'del', 'strike'], replacement: function (content) { From e8136b32da1f616e7eb1c6a4bc19160d85d9f5cc Mon Sep 17 00:00:00 2001 From: zuzanna-maria Date: Sun, 8 Dec 2024 23:10:51 +0100 Subject: [PATCH 06/11] Formatting accounts for newlines inside cells --- www/pad/export.js | 73 +++++++++++++++++++++++++---------------------- 1 file changed, 39 insertions(+), 34 deletions(-) diff --git a/www/pad/export.js b/www/pad/export.js index 897bd778a..1999a5164 100644 --- a/www/pad/export.js +++ b/www/pad/export.js @@ -97,40 +97,45 @@ define([ var md = Turndown({ headingStyle: 'atx' }).addRule('table', { - filter: ['table'], - replacement: function (content, node) { - var childNodeArr = Array.from(node.childNodes) - var table = '' - childNodeArr.forEach(function(cN) { - cN.childNodes.forEach(function(childNode) { - var childNodes = Array.from(childNode.childNodes) - var rowContent = childNodes - var indexOf = Array.prototype.indexOf; - var index; - if (childNodeArr.length > 1) { - index = indexOf.call(node.childNodes, cN); - } else { - index = indexOf.call(cN.childNodes, childNode); - } - rowContent[0].textContent = `|${rowContent[0].textContent}`; - var row = ''; - var rowLength = rowContent.filter(Boolean).length; - for (var i =0; i < rowLength; i++) { - var cell = rowContent[i].textContent + ' |'; - row += cell; - } - var newRow = row.concat('\n'); - if (index === 0) { - var separator = '|-'; - newRow += `${separator.repeat(rowLength)}\n`; - } - var parser = new DOMParser(); - newRow = parser.parseFromString(newRow, 'text/html').children[0].innerText; - table += newRow - return newRow; - }) - }) - return table + filter: ['table'], + replacement: function (content, node) { + var childNodeArr = Array.from(node.childNodes); + var table = ''; + childNodeArr.forEach(function(rowNode) { + rowNode.childNodes.forEach(function(childNode) { + var rowContent = Array.from(childNode.childNodes); + var indexOf = Array.prototype.indexOf; + var index = childNodeArr.length > 1 ? indexOf.call(node.childNodes, rowNode) : indexOf.call(rowNode.childNodes, childNode); + var row = ''; + var rowLength = rowContent.filter(Boolean).length; + for (var i =0; i < rowLength; i++) { + var cell = rowContent[i]; + var cellContent = Array.from(cell.childNodes); + cellContent.pop(); + if (cellContent.length > 1) { + var cellString = ''; + cellContent.forEach(function(string) { + if (string.nodeType === 3) { + cellString += string.textContent; + } else if (string.nodeName === "BR") { + cellString += '
'; + } + }); + row += cellString + ' |'; + } else { + row += cellContent[0].textContent + ' |'; + } + } + var newRow = row.concat('\n'); + if (index === 0) { + var separator = '|-'; + newRow += `${separator.repeat(rowLength)}\n`; + } + table += newRow; + return newRow; + }); + }); + return table; }}).addRule('strikethrough', { filter: ['s', 'del', 'strike'], replacement: function (content) { From 1354b0a238bf0a866d3c0823c55951a93f233d5e Mon Sep 17 00:00:00 2001 From: zuzanna-maria Date: Mon, 9 Dec 2024 13:08:36 +0100 Subject: [PATCH 07/11] Formatting accounts for bold, italic, underlined text and blank cells --- www/pad/export.js | 33 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/www/pad/export.js b/www/pad/export.js index 1999a5164..0bd62d9b0 100644 --- a/www/pad/export.js +++ b/www/pad/export.js @@ -111,19 +111,29 @@ define([ for (var i =0; i < rowLength; i++) { var cell = rowContent[i]; var cellContent = Array.from(cell.childNodes); - cellContent.pop(); if (cellContent.length > 1) { var cellString = ''; - cellContent.forEach(function(string) { + cellContent.forEach(function(string) { + var stringContent = string.childNodes.length ? string.innerHTML : string.textContent if (string.nodeType === 3) { - cellString += string.textContent; + cellString += stringContent; } else if (string.nodeName === "BR") { cellString += '
'; + } else if (string.nodeName === "EM") { + cellString += '' + stringContent + ''; + } else if (string.nodeName === "STRONG") { + cellString += '' + stringContent + ''; + } else if (string.nodeName === "U") { + cellString += '' + stringContent + ''; + } else if (string.nodeName === "S") { + cellString += '~' + stringContent + '~'; } }); row += cellString + ' |'; - } else { - row += cellContent[0].textContent + ' |'; + } else if (cellContent[0].nodeName === "BR") { + row += '| |'; + } else { + row += cellContent[0].innerHTML + ' |'; } } var newRow = row.concat('\n'); @@ -137,10 +147,15 @@ define([ }); return table; }}).addRule('strikethrough', { - filter: ['s', 'del', 'strike'], - replacement: function (content) { - return '~' + content + '~'; - } + filter: ['s', 'del', 'strike'], + replacement: function (content) { + return '~' + content + '~'; + } + }).addRule('strikethrough', { + filter: ['u'], + replacement: function (content) { + return '' + content + ''; + } }) .turndown(toExport); var mdBlob = new Blob([md], { From 8d5ac837a1db48a2e7112dbb701e949865734573 Mon Sep 17 00:00:00 2001 From: zuzanna-maria Date: Mon, 9 Dec 2024 14:44:59 +0100 Subject: [PATCH 08/11] Linting --- www/pad/export.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/pad/export.js b/www/pad/export.js index 0bd62d9b0..abd45ce20 100644 --- a/www/pad/export.js +++ b/www/pad/export.js @@ -114,7 +114,7 @@ define([ if (cellContent.length > 1) { var cellString = ''; cellContent.forEach(function(string) { - var stringContent = string.childNodes.length ? string.innerHTML : string.textContent + var stringContent = string.childNodes.length ? string.innerHTML : string.textContent; if (string.nodeType === 3) { cellString += stringContent; } else if (string.nodeName === "BR") { From 14e56aef791050bc7ddfdf239803241f76c0d931 Mon Sep 17 00:00:00 2001 From: zuzanna-maria Date: Mon, 9 Dec 2024 14:45:40 +0100 Subject: [PATCH 09/11] Indentation --- www/pad/export.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/www/pad/export.js b/www/pad/export.js index abd45ce20..aac4ae4aa 100644 --- a/www/pad/export.js +++ b/www/pad/export.js @@ -147,15 +147,15 @@ define([ }); return table; }}).addRule('strikethrough', { - filter: ['s', 'del', 'strike'], - replacement: function (content) { - return '~' + content + '~'; - } + filter: ['s', 'del', 'strike'], + replacement: function (content) { + return '~' + content + '~'; + } }).addRule('strikethrough', { - filter: ['u'], - replacement: function (content) { - return '' + content + ''; - } + filter: ['u'], + replacement: function (content) { + return '' + content + ''; + } }) .turndown(toExport); var mdBlob = new Blob([md], { From 0b960439caafdeeadc6f46def8dfc8da23ae703c Mon Sep 17 00:00:00 2001 From: yflory Date: Mon, 9 Dec 2024 15:58:46 +0100 Subject: [PATCH 10/11] Fix multi-level nodes for pad table .md export --- www/pad/export.js | 57 +++++++++++++++++++---------------------------- 1 file changed, 23 insertions(+), 34 deletions(-) diff --git a/www/pad/export.js b/www/pad/export.js index aac4ae4aa..a4bda9599 100644 --- a/www/pad/export.js +++ b/www/pad/export.js @@ -94,6 +94,18 @@ define([ return void cb(blob); } if (ext === ".md") { + let strikethrough = { + filter: ['s', 'del', 'strike'], + replacement: function (content) { + return '~' + content + '~'; + } + }; + let underline = { + filter: ['u'], + replacement: function (content) { + return '' + content + ''; + } + }; var md = Turndown({ headingStyle: 'atx' }).addRule('table', { @@ -111,29 +123,15 @@ define([ for (var i =0; i < rowLength; i++) { var cell = rowContent[i]; var cellContent = Array.from(cell.childNodes); - if (cellContent.length > 1) { - var cellString = ''; - cellContent.forEach(function(string) { - var stringContent = string.childNodes.length ? string.innerHTML : string.textContent; - if (string.nodeType === 3) { - cellString += stringContent; - } else if (string.nodeName === "BR") { - cellString += '
'; - } else if (string.nodeName === "EM") { - cellString += '' + stringContent + ''; - } else if (string.nodeName === "STRONG") { - cellString += '' + stringContent + ''; - } else if (string.nodeName === "U") { - cellString += '' + stringContent + ''; - } else if (string.nodeName === "S") { - cellString += '~' + stringContent + '~'; - } - }); - row += cellString + ' |'; - } else if (cellContent[0].nodeName === "BR") { - row += '| |'; - } else { - row += cellContent[0].innerHTML + ' |'; + if ((cellContent.length === 1 && cellContent[0].nodeName === "BR") || !cellContent.length) { + row += '|'; + } else if (cellContent.length >= 1) { + row += Turndown({ + headingStyle: 'atx' + }).addRule('strikethrough', strikethrough) + .addRule('underline', underline) + .turndown(cell.innerHTML).replaceAll('\n', '
'); + row += '|'; } } var newRow = row.concat('\n'); @@ -146,17 +144,8 @@ define([ }); }); return table; - }}).addRule('strikethrough', { - filter: ['s', 'del', 'strike'], - replacement: function (content) { - return '~' + content + '~'; - } - }).addRule('strikethrough', { - filter: ['u'], - replacement: function (content) { - return '' + content + ''; - } - }) + }}).addRule('strikethrough', strikethrough) + .addRule('underline', underline) .turndown(toExport); var mdBlob = new Blob([md], { type: 'text/markdown;charset=utf-8' From 556135bddacba98a4dcb15cdcecf156d5856cde6 Mon Sep 17 00:00:00 2001 From: yflory Date: Tue, 10 Dec 2024 17:48:49 +0100 Subject: [PATCH 11/11] Add missing pipes in pad tables markdown export --- www/pad/export.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/www/pad/export.js b/www/pad/export.js index a4bda9599..5e5a23689 100644 --- a/www/pad/export.js +++ b/www/pad/export.js @@ -118,7 +118,7 @@ define([ var rowContent = Array.from(childNode.childNodes); var indexOf = Array.prototype.indexOf; var index = childNodeArr.length > 1 ? indexOf.call(node.childNodes, rowNode) : indexOf.call(rowNode.childNodes, childNode); - var row = ''; + var row = '|'; var rowLength = rowContent.filter(Boolean).length; for (var i =0; i < rowLength; i++) { var cell = rowContent[i]; @@ -137,7 +137,7 @@ define([ var newRow = row.concat('\n'); if (index === 0) { var separator = '|-'; - newRow += `${separator.repeat(rowLength)}\n`; + newRow += `${separator.repeat(rowLength)}|\n`; } table += newRow; return newRow;