mirror of
https://github.com/laurent22/joplin.git
synced 2025-01-11 18:24:43 +02:00
This commit is contained in:
parent
85211e8d5c
commit
eceb14ff9e
@ -86,6 +86,9 @@ packages/app-cli/tests/InMemoryCache.js.map
|
|||||||
packages/app-cli/tests/MdToHtml.d.ts
|
packages/app-cli/tests/MdToHtml.d.ts
|
||||||
packages/app-cli/tests/MdToHtml.js
|
packages/app-cli/tests/MdToHtml.js
|
||||||
packages/app-cli/tests/MdToHtml.js.map
|
packages/app-cli/tests/MdToHtml.js.map
|
||||||
|
packages/app-cli/tests/MdToMd.d.ts
|
||||||
|
packages/app-cli/tests/MdToMd.js
|
||||||
|
packages/app-cli/tests/MdToMd.js.map
|
||||||
packages/app-cli/tests/Synchronizer.basics.d.ts
|
packages/app-cli/tests/Synchronizer.basics.d.ts
|
||||||
packages/app-cli/tests/Synchronizer.basics.js
|
packages/app-cli/tests/Synchronizer.basics.js
|
||||||
packages/app-cli/tests/Synchronizer.basics.js.map
|
packages/app-cli/tests/Synchronizer.basics.js.map
|
||||||
@ -122,6 +125,9 @@ packages/app-cli/tests/fsDriver.js.map
|
|||||||
packages/app-cli/tests/htmlUtils.d.ts
|
packages/app-cli/tests/htmlUtils.d.ts
|
||||||
packages/app-cli/tests/htmlUtils.js
|
packages/app-cli/tests/htmlUtils.js
|
||||||
packages/app-cli/tests/htmlUtils.js.map
|
packages/app-cli/tests/htmlUtils.js.map
|
||||||
|
packages/app-cli/tests/markdownUtils.d.ts
|
||||||
|
packages/app-cli/tests/markdownUtils.js
|
||||||
|
packages/app-cli/tests/markdownUtils.js.map
|
||||||
packages/app-cli/tests/models_Folder.d.ts
|
packages/app-cli/tests/models_Folder.d.ts
|
||||||
packages/app-cli/tests/models_Folder.js
|
packages/app-cli/tests/models_Folder.js
|
||||||
packages/app-cli/tests/models_Folder.js.map
|
packages/app-cli/tests/models_Folder.js.map
|
||||||
|
6
.gitignore
vendored
6
.gitignore
vendored
@ -72,6 +72,9 @@ packages/app-cli/tests/InMemoryCache.js.map
|
|||||||
packages/app-cli/tests/MdToHtml.d.ts
|
packages/app-cli/tests/MdToHtml.d.ts
|
||||||
packages/app-cli/tests/MdToHtml.js
|
packages/app-cli/tests/MdToHtml.js
|
||||||
packages/app-cli/tests/MdToHtml.js.map
|
packages/app-cli/tests/MdToHtml.js.map
|
||||||
|
packages/app-cli/tests/MdToMd.d.ts
|
||||||
|
packages/app-cli/tests/MdToMd.js
|
||||||
|
packages/app-cli/tests/MdToMd.js.map
|
||||||
packages/app-cli/tests/Synchronizer.basics.d.ts
|
packages/app-cli/tests/Synchronizer.basics.d.ts
|
||||||
packages/app-cli/tests/Synchronizer.basics.js
|
packages/app-cli/tests/Synchronizer.basics.js
|
||||||
packages/app-cli/tests/Synchronizer.basics.js.map
|
packages/app-cli/tests/Synchronizer.basics.js.map
|
||||||
@ -108,6 +111,9 @@ packages/app-cli/tests/fsDriver.js.map
|
|||||||
packages/app-cli/tests/htmlUtils.d.ts
|
packages/app-cli/tests/htmlUtils.d.ts
|
||||||
packages/app-cli/tests/htmlUtils.js
|
packages/app-cli/tests/htmlUtils.js
|
||||||
packages/app-cli/tests/htmlUtils.js.map
|
packages/app-cli/tests/htmlUtils.js.map
|
||||||
|
packages/app-cli/tests/markdownUtils.d.ts
|
||||||
|
packages/app-cli/tests/markdownUtils.js
|
||||||
|
packages/app-cli/tests/markdownUtils.js.map
|
||||||
packages/app-cli/tests/models_Folder.d.ts
|
packages/app-cli/tests/models_Folder.d.ts
|
||||||
packages/app-cli/tests/models_Folder.js
|
packages/app-cli/tests/models_Folder.js
|
||||||
packages/app-cli/tests/models_Folder.js.map
|
packages/app-cli/tests/models_Folder.js.map
|
||||||
|
@ -43,4 +43,9 @@ describe('InteropService_Importer_Md: importLocalImages', function() {
|
|||||||
const items = await Note.linkedItems(note.body);
|
const items = await Note.linkedItems(note.body);
|
||||||
expect(items.length).toBe(1);
|
expect(items.length).toBe(1);
|
||||||
});
|
});
|
||||||
|
it('should import resources for files', async function() {
|
||||||
|
const note = await importer.importFile(`${__dirname}/md_to_md/sample-files.md`, 'notebook');
|
||||||
|
const items = await Note.linkedItems(note.body);
|
||||||
|
expect(items.length).toBe(4);
|
||||||
|
});
|
||||||
});
|
});
|
@ -33,14 +33,48 @@ describe('markdownUtils', function() {
|
|||||||
['![something](http://test.com/img.png "Some description")', ['http://test.com/img.png']],
|
['![something](http://test.com/img.png "Some description")', ['http://test.com/img.png']],
|
||||||
['![something](https://test.com/ohoh_(123).png)', ['https://test.com/ohoh_(123).png']],
|
['![something](https://test.com/ohoh_(123).png)', ['https://test.com/ohoh_(123).png']],
|
||||||
['![nothing]() ![something](http://test.com/img.png)', ['http://test.com/img.png']],
|
['![nothing]() ![something](http://test.com/img.png)', ['http://test.com/img.png']],
|
||||||
|
['![something](img.png)', ['img.png']],
|
||||||
|
['![something](/img.png)', ['/img.png']],
|
||||||
|
['![something](../img.png)', ['../img.png']],
|
||||||
|
['![something](../upload/img.png)', ['../upload/img.png']],
|
||||||
|
['![something](./upload/img.png)', ['./upload/img.png']],
|
||||||
|
['[something](testing.html)', ['']],
|
||||||
|
['[something](img.png)', ['']],
|
||||||
|
['![something](file://img.png)', ['file://img.png']],
|
||||||
];
|
];
|
||||||
|
|
||||||
for (let i = 0; i < testCases.length; i++) {
|
for (let i = 0; i < testCases.length; i++) {
|
||||||
const md = testCases[i][0];
|
const md = testCases[i][0];
|
||||||
const actual = markdownUtils.extractImageUrls(md);
|
const actual = markdownUtils.extractImageUrls(md);
|
||||||
const expected = testCases[i][1];
|
const expected = testCases[i][1];
|
||||||
|
expect(actual.join(' ')).toBe((expected as string[]).join(' '));
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
|
||||||
expect(actual.join(' ')).toBe(expected.join(' '));
|
it('should extract files URLs', (async () => {
|
||||||
|
const testCases = [
|
||||||
|
['[something](http://test.com/img.png)', ['http://test.com/img.png']],
|
||||||
|
['[something](http://test.com/test.txt)', ['http://test.com/test.txt']],
|
||||||
|
['[something](http://test.com/img.png) ![something2](http://test.com/img2.png)', ['http://test.com/img.png', 'http://test.com/img2.png']],
|
||||||
|
['[something](http://test.com/img.png "Some description")', ['http://test.com/img.png']],
|
||||||
|
['[something](https://test.com/ohoh_(123).png)', ['https://test.com/ohoh_(123).png']],
|
||||||
|
['[nothing]() ![something](http://test.com/img.png)', ['http://test.com/img.png']],
|
||||||
|
['[something](test.txt)', ['test.txt']],
|
||||||
|
['[something](/test.txt)', ['/test.txt']],
|
||||||
|
['[something](../test.txt)', ['../test.txt']],
|
||||||
|
['[something](../upload/test.txt)', ['../upload/test.txt']],
|
||||||
|
['[something](./upload/test.txt)', ['./upload/test.txt']],
|
||||||
|
['[something](testing.html)', ['testing.html']],
|
||||||
|
['[something](img.png)', ['img.png']],
|
||||||
|
['[something](file://img.png)', ['file://img.png']],
|
||||||
|
];
|
||||||
|
|
||||||
|
for (let i = 0; i < testCases.length; i++) {
|
||||||
|
const md = testCases[i][0];
|
||||||
|
const actual = markdownUtils.extractFileUrls(md);
|
||||||
|
const expected = testCases[i][1];
|
||||||
|
|
||||||
|
expect(actual.join(' ')).toBe((expected as string[]).join(' '));
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
|
|
9
packages/app-cli/tests/md_to_md/sample-files.md
Normal file
9
packages/app-cli/tests/md_to_md/sample-files.md
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
# Markdown file test
|
||||||
|
|
||||||
|
![../support/photo.jpg](../support/photo.jpg)
|
||||||
|
|
||||||
|
[welcome.pdf](../support/welcome.pdf)
|
||||||
|
|
||||||
|
[sample.md](sample.md)
|
||||||
|
|
||||||
|
[sample2.md](./sample.md)
|
@ -61,7 +61,7 @@ const markdownUtils = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
// Returns the **encoded** URLs, so to be useful they should be decoded again before use.
|
// Returns the **encoded** URLs, so to be useful they should be decoded again before use.
|
||||||
extractImageUrls(md: string) {
|
extractFileUrls(md: string, onlyImage: boolean = false): Array<string> {
|
||||||
const markdownIt = new MarkdownIt();
|
const markdownIt = new MarkdownIt();
|
||||||
markdownIt.validateLink = validateLinks; // Necessary to support file:/// links
|
markdownIt.validateLink = validateLinks; // Necessary to support file:/// links
|
||||||
|
|
||||||
@ -72,11 +72,10 @@ const markdownUtils = {
|
|||||||
const searchUrls = (tokens: any[]) => {
|
const searchUrls = (tokens: any[]) => {
|
||||||
for (let i = 0; i < tokens.length; i++) {
|
for (let i = 0; i < tokens.length; i++) {
|
||||||
const token = tokens[i];
|
const token = tokens[i];
|
||||||
|
if ((onlyImage === true && token.type === 'image') || (onlyImage === false && (token.type === 'image' || token.type === 'link_open'))) {
|
||||||
if (token.type === 'image') {
|
|
||||||
for (let j = 0; j < token.attrs.length; j++) {
|
for (let j = 0; j < token.attrs.length; j++) {
|
||||||
const a = token.attrs[j];
|
const a = token.attrs[j];
|
||||||
if (a[0] === 'src' && a.length >= 2 && a[1]) {
|
if ((a[0] === 'src' || a[0] === 'href') && a.length >= 2 && a[1]) {
|
||||||
output.push(a[1]);
|
output.push(a[1]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -93,6 +92,10 @@ const markdownUtils = {
|
|||||||
return output;
|
return output;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
extractImageUrls(md: string) {
|
||||||
|
return markdownUtils.extractFileUrls(md,true);
|
||||||
|
},
|
||||||
|
|
||||||
// The match results has 5 items
|
// The match results has 5 items
|
||||||
// Full match array is
|
// Full match array is
|
||||||
// [Full match, whitespace, list token, ol line number, whitespace following token]
|
// [Full match, whitespace, list token, ol line number, whitespace following token]
|
||||||
|
@ -63,10 +63,10 @@ export default class InteropService_Importer_Md extends InteropService_Importer_
|
|||||||
* Parse text for links, attempt to find local file, if found create Joplin resource
|
* Parse text for links, attempt to find local file, if found create Joplin resource
|
||||||
* and update link accordingly.
|
* and update link accordingly.
|
||||||
*/
|
*/
|
||||||
async importLocalImages(filePath: string, md: string) {
|
async importLocalFiles(filePath: string, md: string) {
|
||||||
let updated = md;
|
let updated = md;
|
||||||
const imageLinks = unique(markdownUtils.extractImageUrls(md));
|
const fileLinks = unique(markdownUtils.extractFileUrls(md));
|
||||||
await Promise.all(imageLinks.map(async (encodedLink: string) => {
|
await Promise.all(fileLinks.map(async (encodedLink: string) => {
|
||||||
const link = decodeURI(encodedLink);
|
const link = decodeURI(encodedLink);
|
||||||
const attachmentPath = filename(`${dirname(filePath)}/${link}`, true);
|
const attachmentPath = filename(`${dirname(filePath)}/${link}`, true);
|
||||||
const pathWithExtension = `${attachmentPath}.${fileExtension(link)}`;
|
const pathWithExtension = `${attachmentPath}.${fileExtension(link)}`;
|
||||||
@ -90,7 +90,7 @@ export default class InteropService_Importer_Md extends InteropService_Importer_
|
|||||||
const body = await shim.fsDriver().readFile(filePath);
|
const body = await shim.fsDriver().readFile(filePath);
|
||||||
let updatedBody;
|
let updatedBody;
|
||||||
try {
|
try {
|
||||||
updatedBody = await this.importLocalImages(filePath, body);
|
updatedBody = await this.importLocalFiles(filePath, body);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
// console.error(`Problem importing links for file ${filePath}, error:\n ${error}`);
|
// console.error(`Problem importing links for file ${filePath}, error:\n ${error}`);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user