mirror of
https://github.com/laurent22/joplin.git
synced 2025-03-11 14:09:55 +02:00
Desktop: Rich Text: Do not converts to markdown links URLs that would be linkified
This commit is contained in:
parent
92b4795410
commit
234c05a966
@ -70,6 +70,9 @@ packages/app-cli/app/services/plugins/PluginRunner.js.map
|
|||||||
packages/app-cli/tests/EnexToMd.d.ts
|
packages/app-cli/tests/EnexToMd.d.ts
|
||||||
packages/app-cli/tests/EnexToMd.js
|
packages/app-cli/tests/EnexToMd.js
|
||||||
packages/app-cli/tests/EnexToMd.js.map
|
packages/app-cli/tests/EnexToMd.js.map
|
||||||
|
packages/app-cli/tests/HtmlToMd.d.ts
|
||||||
|
packages/app-cli/tests/HtmlToMd.js
|
||||||
|
packages/app-cli/tests/HtmlToMd.js.map
|
||||||
packages/app-cli/tests/InMemoryCache.d.ts
|
packages/app-cli/tests/InMemoryCache.d.ts
|
||||||
packages/app-cli/tests/InMemoryCache.js
|
packages/app-cli/tests/InMemoryCache.js
|
||||||
packages/app-cli/tests/InMemoryCache.js.map
|
packages/app-cli/tests/InMemoryCache.js.map
|
||||||
|
3
.gitignore
vendored
3
.gitignore
vendored
@ -59,6 +59,9 @@ packages/app-cli/app/services/plugins/PluginRunner.js.map
|
|||||||
packages/app-cli/tests/EnexToMd.d.ts
|
packages/app-cli/tests/EnexToMd.d.ts
|
||||||
packages/app-cli/tests/EnexToMd.js
|
packages/app-cli/tests/EnexToMd.js
|
||||||
packages/app-cli/tests/EnexToMd.js.map
|
packages/app-cli/tests/EnexToMd.js.map
|
||||||
|
packages/app-cli/tests/HtmlToMd.d.ts
|
||||||
|
packages/app-cli/tests/HtmlToMd.js
|
||||||
|
packages/app-cli/tests/HtmlToMd.js.map
|
||||||
packages/app-cli/tests/InMemoryCache.d.ts
|
packages/app-cli/tests/InMemoryCache.d.ts
|
||||||
packages/app-cli/tests/InMemoryCache.js
|
packages/app-cli/tests/InMemoryCache.js
|
||||||
packages/app-cli/tests/InMemoryCache.js.map
|
packages/app-cli/tests/InMemoryCache.js.map
|
||||||
|
@ -1,24 +1,15 @@
|
|||||||
/* eslint-disable no-unused-vars */
|
import shim from '@joplin/lib/shim';
|
||||||
|
|
||||||
|
|
||||||
const os = require('os');
|
const os = require('os');
|
||||||
const time = require('@joplin/lib/time').default;
|
|
||||||
const { filename } = require('@joplin/lib/path-utils');
|
const { filename } = require('@joplin/lib/path-utils');
|
||||||
const { fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('./test-utils.js');
|
|
||||||
const Folder = require('@joplin/lib/models/Folder.js');
|
|
||||||
const Note = require('@joplin/lib/models/Note.js');
|
|
||||||
const BaseModel = require('@joplin/lib/BaseModel').default;
|
|
||||||
const shim = require('@joplin/lib/shim').default;
|
|
||||||
const HtmlToMd = require('@joplin/lib/HtmlToMd');
|
const HtmlToMd = require('@joplin/lib/HtmlToMd');
|
||||||
const { enexXmlToMd } = require('@joplin/lib/import-enex-md-gen.js');
|
|
||||||
|
|
||||||
describe('HtmlToMd', function() {
|
describe('HtmlToMd', function() {
|
||||||
|
|
||||||
beforeEach(async (done) => {
|
// beforeEach(async (done) => {
|
||||||
await setupDatabaseAndSynchronizer(1);
|
// await setupDatabaseAndSynchronizer(1);
|
||||||
await switchClient(1);
|
// await switchClient(1);
|
||||||
done();
|
// done();
|
||||||
});
|
// });
|
||||||
|
|
||||||
it('should convert from Html to Markdown', (async () => {
|
it('should convert from Html to Markdown', (async () => {
|
||||||
const basePath = `${__dirname}/html_to_md`;
|
const basePath = `${__dirname}/html_to_md`;
|
||||||
@ -32,11 +23,11 @@ describe('HtmlToMd', function() {
|
|||||||
const htmlPath = `${basePath}/${htmlFilename}`;
|
const htmlPath = `${basePath}/${htmlFilename}`;
|
||||||
const mdPath = `${basePath}/${filename(htmlFilename)}.md`;
|
const mdPath = `${basePath}/${filename(htmlFilename)}.md`;
|
||||||
|
|
||||||
// if (htmlFilename !== 'code_3.html') continue;
|
// if (htmlFilename !== 'anchor_same_title_and_url.html') continue;
|
||||||
|
|
||||||
// if (htmlFilename.indexOf('image_preserve_size') !== 0) continue;
|
// if (htmlFilename.indexOf('image_preserve_size') !== 0) continue;
|
||||||
|
|
||||||
const htmlToMdOptions = {};
|
const htmlToMdOptions: any = {};
|
||||||
|
|
||||||
if (htmlFilename === 'anchor_local.html') {
|
if (htmlFilename === 'anchor_local.html') {
|
||||||
// Normally the list of anchor names in the document are retrieved from the HTML code
|
// Normally the list of anchor names in the document are retrieved from the HTML code
|
||||||
@ -66,15 +57,14 @@ describe('HtmlToMd', function() {
|
|||||||
result.push('');
|
result.push('');
|
||||||
result.push(`Error converting file: ${htmlFilename}`);
|
result.push(`Error converting file: ${htmlFilename}`);
|
||||||
result.push('--------------------------------- Got:');
|
result.push('--------------------------------- Got:');
|
||||||
result.push(actualMd.split('\n').map(l => `"${l}"`).join('\n'));
|
result.push(actualMd.split('\n').map((l: string) => `"${l}"`).join('\n'));
|
||||||
result.push('--------------------------------- Expected:');
|
result.push('--------------------------------- Expected:');
|
||||||
result.push(expectedMd.split('\n').map(l => `"${l}"`).join('\n'));
|
result.push(expectedMd.split('\n').map((l: string) => `"${l}"`).join('\n'));
|
||||||
result.push('--------------------------------------------');
|
result.push('--------------------------------------------');
|
||||||
result.push('');
|
result.push('');
|
||||||
|
|
||||||
console.info(result.join('\n'));
|
console.info(result.join('\n'));
|
||||||
|
|
||||||
|
|
||||||
// console.info('');
|
// console.info('');
|
||||||
// console.info(`Error converting file: ${htmlFilename}`);
|
// console.info(`Error converting file: ${htmlFilename}`);
|
||||||
// console.info('--------------------------------- Got:');
|
// console.info('--------------------------------- Got:');
|
@ -0,0 +1,8 @@
|
|||||||
|
<ul>
|
||||||
|
<li><a href="https://example.com"/>https://example.com</a></li>
|
||||||
|
<li><a href="http://example.com"/>http://example.com</a></li>
|
||||||
|
<li><a href="file:///mnt/c/test.txt"/>file:///mnt/c/test.txt</a></li>
|
||||||
|
<li><a href="https://example.com" title="with title"/>https://example.com</a></li>
|
||||||
|
<li><a href="example.com"/>example.com</a></li>
|
||||||
|
<li><a href="test@example.com"/>test@example.com</a></li>
|
||||||
|
</ul>
|
@ -0,0 +1,6 @@
|
|||||||
|
- https://example.com
|
||||||
|
- http://example.com
|
||||||
|
- file:///mnt/c/test.txt
|
||||||
|
- [https://example.com](https://example.com "with title")
|
||||||
|
- [example.com](example.com)
|
||||||
|
- [test@example.com](test@example.com)
|
@ -216,6 +216,10 @@ function getNamedAnchorFromLink(node, options) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function isLinkifiedUrl(url) {
|
||||||
|
return url.indexOf('http://') === 0 || url.indexOf('https://') === 0 || url.indexOf('file://') === 0;
|
||||||
|
}
|
||||||
|
|
||||||
rules.inlineLink = {
|
rules.inlineLink = {
|
||||||
filter: function (node, options) {
|
filter: function (node, options) {
|
||||||
return (
|
return (
|
||||||
@ -227,12 +231,32 @@ rules.inlineLink = {
|
|||||||
|
|
||||||
replacement: function (content, node, options) {
|
replacement: function (content, node, options) {
|
||||||
var href = filterLinkHref(node.getAttribute('href'))
|
var href = filterLinkHref(node.getAttribute('href'))
|
||||||
|
|
||||||
if (!href) {
|
if (!href) {
|
||||||
return getNamedAnchorFromLink(node, options) + filterLinkContent(content)
|
return getNamedAnchorFromLink(node, options) + filterLinkContent(content)
|
||||||
} else {
|
} else {
|
||||||
var title = node.title && node.title !== href ? ' "' + node.title + '"' : ''
|
var title = node.title && node.title !== href ? ' "' + node.title + '"' : ''
|
||||||
if (!href) title = ''
|
if (!href) title = ''
|
||||||
return getNamedAnchorFromLink(node, options) + '[' + filterLinkContent(content) + '](' + href + title + ')'
|
let output = getNamedAnchorFromLink(node, options) + '[' + filterLinkContent(content) + '](' + href + title + ')'
|
||||||
|
|
||||||
|
// If the URL is automatically linkified by Joplin, and the title is
|
||||||
|
// the same as the URL, there is no need to make it a link here. That
|
||||||
|
// will prevent URsL from the rich text editor to be needlessly
|
||||||
|
// converted from this:
|
||||||
|
//
|
||||||
|
// <a href="https://example.com">https://example.com</a>
|
||||||
|
//
|
||||||
|
// to this:
|
||||||
|
//
|
||||||
|
// [https://example.com](https://example.com)
|
||||||
|
//
|
||||||
|
// It means cleaner Markdown will also be generated by the web
|
||||||
|
// clipper.
|
||||||
|
if (isLinkifiedUrl(href)) {
|
||||||
|
if (output === '[' + href + '](' + href + ')') return href;
|
||||||
|
}
|
||||||
|
|
||||||
|
return output;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user