├── .editorconfig ├── .github ├── CONTRIBUTING.md └── ISSUE_TEMPLATE │ ├── bug_report.md │ ├── feature_request.md │ └── question.md ├── .gitignore ├── license ├── package.json ├── readme.md ├── src ├── config.ts ├── index.ts ├── providers │ ├── abstract │ │ └── index.ts │ ├── boostnote │ │ ├── index.ts │ │ └── types.ts │ ├── enex │ │ ├── index.ts │ │ └── types.ts │ ├── html │ │ ├── index.ts │ │ └── types.ts │ ├── index.ts │ └── markdown │ │ ├── index.ts │ │ └── types.ts ├── types.ts └── utils.ts ├── test ├── check │ ├── boostnote │ │ └── sample.cson │ │ │ ├── Title.md │ │ │ ├── Title.md.json │ │ │ ├── d1cbe242.png │ │ │ └── d1cbe242.png.json │ ├── enex │ │ ├── advanced.enex │ │ │ ├── 101 Profitable Digital Products You Can Sell Online in 2019 ǀ Sellfy.md │ │ │ ├── 101 Profitable Digital Products You Can Sell Online in 2019 ǀ Sellfy.md.json │ │ │ ├── 101-digital-products-768x384.png │ │ │ ├── 101-digital-products-768x384.png.json │ │ │ ├── 49f8dd7a14d8dd06d2014c1ae5f6f8e8.png │ │ │ ├── 49f8dd7a14d8dd06d2014c1ae5f6f8e8.png.json │ │ │ ├── 5a54b9eb5533a8559f73038ad16cc70a.png │ │ │ ├── 5a54b9eb5533a8559f73038ad16cc70a.png.json │ │ │ ├── 5c17861184980e91478d2fc900cd1250.png │ │ │ ├── 5c17861184980e91478d2fc900cd1250.png.json │ │ │ ├── 63e0fcd3f9cd6e5d750090eff62c7cb7.png │ │ │ ├── 63e0fcd3f9cd6e5d750090eff62c7cb7.png.json │ │ │ ├── 65aad53291466d837ef05df1594e24fd.png │ │ │ ├── 65aad53291466d837ef05df1594e24fd.png.json │ │ │ ├── 80d5044f528a68ca3985ec179edc4ad0.png │ │ │ ├── 80d5044f528a68ca3985ec179edc4ad0.png.json │ │ │ ├── 8f00670edae87eff5f20de7bb02d3918.jpeg │ │ │ ├── 8f00670edae87eff5f20de7bb02d3918.jpeg.json │ │ │ ├── 9f5f3d57972619b029490dabc63e9017 │ │ │ ├── 9f5f3d57972619b029490dabc63e9017.json │ │ │ ├── a17028f2ede85851876da5a97f3a1972.png │ │ │ ├── a17028f2ede85851876da5a97f3a1972.png.json │ │ │ ├── b1c17c5301df0cc245e51d8f10fb73c9.png │ │ │ ├── b1c17c5301df0cc245e51d8f10fb73c9.png.json │ │ │ ├── d7e3fe3d006aac524f81f07e29c2f146.png │ │ │ ├── d7e3fe3d006aac524f81f07e29c2f146.png.json │ │ │ ├── decap.png │ │ │ ├── decap.png.json │ │ │ ├── e662d8bea23d8731f4087de149413764.png │ │ │ ├── e662d8bea23d8731f4087de149413764.png.json │ │ │ ├── ef65974a15ea0999467aaeaa6cbf57b1.png │ │ │ ├── ef65974a15ea0999467aaeaa6cbf57b1.png.json │ │ │ ├── f525a11c2b824a5e76105d51906a0b0e.png │ │ │ ├── f525a11c2b824a5e76105d51906a0b0e.png.json │ │ │ ├── sellfy-sell-digital-products.png │ │ │ ├── sellfy-sell-digital-products.png.json │ │ │ ├── sellfy-sell-photos-videos.png │ │ │ ├── sellfy-sell-photos-videos.png.json │ │ │ ├── sellfy-sell-presets-luts.png │ │ │ └── sellfy-sell-presets-luts.png.json │ │ └── sample.enex │ │ │ ├── Evernote 20180719 19꞉38꞉29.wav │ │ │ ├── Evernote 20180719 19꞉38꞉29.wav.json │ │ │ ├── Evernote Formatting.md │ │ │ ├── Evernote Formatting.md.json │ │ │ ├── Screen Shot 2018-07-19 at 19.38.48.png │ │ │ ├── Screen Shot 2018-07-19 at 19.38.48.png.json │ │ │ ├── acc3a2cbf534f95977005ab76e1727af.png │ │ │ └── acc3a2cbf534f95977005ab76e1727af.png.json │ ├── html │ │ ├── infer_title_heading.html │ │ │ ├── Title.md │ │ │ └── Title.md.json │ │ ├── infer_title_title.html │ │ │ ├── Title.md │ │ │ └── Title.md.json │ │ ├── no_head.html │ │ │ ├── no_head.md │ │ │ └── no_head.md.json │ │ └── sample.html │ │ │ ├── Title.md │ │ │ └── Title.md.json │ └── markdown │ │ ├── infer_title_heading.md │ │ ├── Title.md │ │ └── Title.md.json │ │ ├── infer_title_path.md │ │ ├── infer_title_path.md │ │ └── infer_title_path.md.json │ │ └── sample.md │ │ ├── Title.md │ │ └── Title.md.json ├── index.js └── source │ ├── boostnote │ ├── attachments │ │ └── e3d07544-e04d-434c-b0aa-3f223b55160e │ │ │ └── d1cbe242.png │ └── sample.cson │ ├── enex │ ├── advanced.enex │ └── sample.enex │ ├── html │ ├── infer_title_heading.html │ ├── infer_title_title.html │ ├── no_head.html │ └── sample.html │ └── markdown │ ├── infer_title_heading.md │ ├── infer_title_path.md │ └── sample.md └── tsconfig.json /.editorconfig: -------------------------------------------------------------------------------- 1 | 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | end_of_line = lf 7 | indent_size = 2 8 | indent_style = space 9 | insert_final_newline = true 10 | trim_trailing_whitespace = true 11 | -------------------------------------------------------------------------------- /.github/CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing 2 | 3 | There are many ways to contribute to this project. 4 | 5 | ### Submit an issue 6 | 7 | Submitting an issue, especially regarding a bug, is one of the best ways to contribute to this project. If you can provide a sample note that reproduces the problem we'll be halfway towards fixing the issue already. 8 | 9 | ### Improve the tests 10 | 11 | Our tests might not cover all possible scenarios, by improving our tests, either by adding new ones or editing existing ones, you'll ensure that the library covers more use cases and you'll decrease the probability that we'll introduce any regressions in the future. 12 | 13 | How our tests work is described below. 14 | 15 | ### Implement a provider 16 | 17 | Implementing an additional provider, or improving an existing one, would be the most impactful way to contribute to this project. 18 | 19 | In order to implement a new provider you'll need to: 20 | 21 | #### Learn how a provider works 22 | 23 | Take a look at existing [providers](https://github.com/notable/dumper/tree/master/src/providers) first. Overall they are relatively straightforward, each of them is usually divided into 3 classes: 24 | 25 | - The `Provider` class generally defines some metadata, the `name` of the provided and the supported `extensions`, and if each supported source file needs some special processing or may contain multiple notes you'll have to implement the `getNotesRaw` method too, which provides the objects that will be passed to the `Note` class. 26 | - The `Note` class generally implements a method for retrieving the metadata of a note, `getMetadata`, and a method for retrieving its content, `getContent`. If you need to format its content or convert it to Markdown you should implement the `formatContent` method too. 27 | - The `Attachment` class generally implements a method for retrieving the metadata of an attachment, `getMetadata`, and a method for retrieving its content, `getContent`. 28 | 29 | Some additional tips: 30 | 31 | - If you need some provider-specific utilities just define them as methods of the relevant classes. 32 | - If you need some more general utilities you should define them in [`utils.ts`](https://github.com/notable/dumper/blob/master/src/utils.ts), so that they can be used by other providers too. 33 | - It's important to maintain the dependency tree, visible by running the `npm list -prod` command, as short and lightweight possible. 34 | - Think if you really need to add a new dependency, perhaps you can just implement a few functions yourself. 35 | - Think if you can reuse existing dependencies rather than introducting new ones. 36 | - Think if the dependency you're introducting is the most lightweight available. 37 | 38 | Once your new provider is implemented just add it to the list of supported providers, [here](https://github.com/notable/dumper/blob/a3829f748e729043b3cdb1c887b394ad4124071a/src/index.ts#L12), and write some tests for it. 39 | 40 | #### Learn how tests works 41 | 42 | This library is tested via [test-diff](https://github.com/fabiospampinato/test-diff), read its readme before proceeding further. 43 | 44 | Our `test` folder is structured like so: 45 | 46 | ``` 47 | test 48 | ├─┬ check # Directory containing the expected output 49 | │ └─┬ [provider] # Name of the provider 50 | │ └─┬ [file] # Name of the dumped file 51 | │ └── [files] # All the dumped notes, attachments and metadata 52 | ├─┬ output # Directory containing the actual output 53 | │ └─┬ [provider] # Name of the provider 54 | │ └─┬ [file] # Name of the dumped file 55 | │ └── [files] # All the dumped notes, attachments and metadata 56 | └─┬ source # Directory containing all the files to dump 57 | └─┬ [provider] # Name of the provider 58 | └── [file] # Name of the file to dump 59 | ``` 60 | 61 | Basically each `source/[provider]/[file]` is a test file to dump, their dumped notes, attachments and metadata will be written in `output/[provider]/[file]/*`, and then they will be compared against the files found under `check`. If the files under `check` and `output` match exactly than the tests pass, if there are some differences then the tests fail. 62 | 63 | In order to add tests for your new provider you'll need to: 64 | 65 | 1. Create a new folder under `source`, named like your provider. 66 | 2. Add a few sources files to it, basically some files that will be parsed by the library. 67 | 3. Create a new folder under `check`, named like your provider. 68 | 4. Add a new folder to it for each source file added previously. 69 | 5. Inside each of those folders write what the expected output should be. 70 | - It might be easier to first run the test suite, so that the `output` folder gets filled, and then copying files from `output` to `check`, fixing any potential errors manually. 71 | 72 | Some additional tips: 73 | 74 | - It's important to check that pretty much everything that can be written in a particular format can be dumped properly. For instance for the `enex` provider I wrote a sample note, `sample.enex`, in Evernote, containing all the possible formatting options allowed by the program, and then checked that the dumped note, once rendered, resembled the original one as closely as possible. 75 | - It's important to add support for attachments too if the particular format you're writing a provider for supports them. 76 | 77 | There are multiple ways to run the test suite: 78 | 79 | ```sh 80 | node test # Run all the tests 81 | node test --provider enex # Run only the tests of the "enex" provider 82 | node test --file sample.enex # Run only the "sample.enex" test file 83 | ``` 84 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | --- 5 | 6 | 7 | 8 | - **File Extension**: 9 | - **Dumper Version**: 10 | 11 | ### Current behavior 12 | 13 | 14 | 15 | ### Expected behavior 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | --- 5 | 6 | 7 | 8 | ### Feature description 9 | 10 | 11 | 12 | ### Feature motivation 13 | 14 | 15 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/question.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Question 3 | about: Ask a question 4 | --- 5 | 6 | 7 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *~ 2 | *.err 3 | *.log 4 | ._* 5 | .cache 6 | .fseventsd 7 | .DocumentRevisions* 8 | .DS_Store 9 | .TemporaryItems 10 | .Trashes 11 | Thumbs.db 12 | 13 | dist 14 | node_modules 15 | package-lock.json 16 | output 17 | -------------------------------------------------------------------------------- /license: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2019-present Fabio Spampinato 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a 6 | copy of this software and associated documentation files (the "Software"), 7 | to deal in the Software without restriction, including without limitation 8 | the rights to use, copy, modify, merge, publish, distribute, sublicense, 9 | and/or sell copies of the Software, and to permit persons to whom the 10 | Software is furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 21 | DEALINGS IN THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@notable/dumper", 3 | "repository": "github:notable/dumper", 4 | "description": "Library for extracting attachments, notes and metadata out of formats used by popular note-taking apps.", 5 | "version": "4.0.3", 6 | "type": "module", 7 | "main": "dist/index.js", 8 | "exports": "./dist/index.js", 9 | "types": "./dist/index.d.ts", 10 | "files": [ 11 | "dist", 12 | "src" 13 | ], 14 | "scripts": { 15 | "clean": "tsex clean", 16 | "compile": "tsex compile", 17 | "compile:watch": "tsex compile --watch", 18 | "test": "node ./test/index.js", 19 | "prepublishOnly": "npm run clean && npm run compile && npm run test" 20 | }, 21 | "keywords": [ 22 | "dump", 23 | "export", 24 | "import", 25 | "note-taking", 26 | "notes", 27 | "attachments" 28 | ], 29 | "dependencies": { 30 | "cson2json": "^2.0.0", 31 | "decode-base64": "^3.0.1", 32 | "entities-decode": "^2.0.0", 33 | "fast-xml-parser": "^3.21.1", 34 | "html2markdown": "npm:@notable/html2markdown@2.0.2", 35 | "mime2ext": "^2.0.0", 36 | "sanitize-basename": "^2.0.0", 37 | "uint8-encoding": "^2.0.0" 38 | }, 39 | "devDependencies": { 40 | "@types/node": "^20.5.0", 41 | "domino": "^2.1.6", 42 | "test-diff": "^2.0.3", 43 | "tiny-parse-argv": "^2.2.0", 44 | "tsex": "^3.0.1", 45 | "typescript": "^5.1.6" 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # Dumper 2 | 3 | Library for extracting attachments, notes and metadata out of formats used by popular note-taking apps. 4 | 5 | ## Features 6 | 7 | - **Markdown**: all notes are converted to Markdown automatically, no matter what format each note uses. 8 | - **Modular**: each supported format is implemented by a "provider", additional providers can be implemented easily, learn more about implementing one yourself [here](https://github.com/notable/dumper/blob/master/.github/CONTRIBUTING.md). 9 | - **Lightweight**: extra care has been taken to ensure this library is lightweight, no external DOM implementation is loaded by default and the most lightweight dependencies are being used. 10 | 11 | ## Install 12 | 13 | ```sh 14 | npm install --save @notable/dumper 15 | ``` 16 | 17 | ## Providers 18 | 19 | The following providers are currently implemented: 20 | 21 | - **Enex**: it can import notes exported via [Evernote](https://evernote.com). 22 | - **Extensions**: `.enex`. 23 | - **Boostnote**: it can import notes written using [Boostnote](https://boostnote.io). 24 | - **Extensions**: `.cson`. 25 | - **HTML**: it can import HTML notes, most popular note-taking apps can export to HTML. 26 | - **Extensions**: `.html`, `.htm`. 27 | - **Markdown**: it can import plain Markdown notes. 28 | - **Extensions**: `.md`, `.mkd`, `.mkdn`, `.mdwn`, `.mdown`, `.markdown`, `.markdn`, `.mdtxt`, `.mdtext`, `.txt`. 29 | 30 | ## Usage 31 | 32 | The following interfaces are provided: 33 | 34 | ```ts 35 | interface Dumper { 36 | isSupported ( source: string ): boolean, 37 | dump ( options: Options ): Promise 38 | } 39 | 40 | interface Options { 41 | DOMParser?: DOMParser, // This option is only optional if you are in a browser-like environment, e.i. "window.DOMParser" exists 42 | source: string | string[], 43 | dump ( note: Note ): void | Promise 44 | } 45 | 46 | interface Note { 47 | metadata: { 48 | title: string, 49 | tags: string[], 50 | attachments: { 51 | metadata: { 52 | name: string, 53 | created: Date, 54 | modified: Date 55 | }, 56 | content: Uint8Array 57 | }[], 58 | deleted: boolean, 59 | favorited: boolean, 60 | pinned: boolean, 61 | created: Date, 62 | modified: Date 63 | }, 64 | content: Uint8Array 65 | } 66 | ``` 67 | 68 | You can use the library like so: 69 | 70 | ```ts 71 | import * as path from 'path'; 72 | import Dumper from '@notable/dumper'; 73 | 74 | Dumper.dump ({ 75 | source: path.join ( __dirname, 'source.html' ), 76 | dump ( note ) { 77 | // Do something with each given note object... 78 | } 79 | }); 80 | ``` 81 | 82 | ## Contributing 83 | 84 | There are multiple ways to contribute to this project, read about them [here](https://github.com/notable/dumper/blob/master/.github/CONTRIBUTING.md). 85 | 86 | ## Related 87 | 88 | - **[Notable](https://github.com/notable/notable)**: The Markdown-based note-taking app that doesn't suck. 89 | 90 | ## License 91 | 92 | MIT © Fabio Spampinato 93 | -------------------------------------------------------------------------------- /src/config.ts: -------------------------------------------------------------------------------- 1 | 2 | /* IMPORT */ 3 | 4 | import type {Options} from 'html2markdown'; 5 | 6 | /* MAIN */ 7 | 8 | const Config = { 9 | note: { 10 | defaultTitle: 'Untitled' 11 | }, 12 | attachment: { 13 | defaultName: 'Untitled' 14 | }, 15 | html2markdown: { 16 | options: { 17 | bulletListMarker: '-', 18 | codeBlockStyle: 'fenced', 19 | emDelimiter: '_', 20 | fence: '```', 21 | headingStyle: 'atx', 22 | hr: '---', 23 | linkStyle: 'inlined', 24 | strongDelimiter: '**' 25 | } 26 | } 27 | }; 28 | 29 | /* EXPORT */ 30 | 31 | export default Config; 32 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | 2 | /* IMPORT */ 3 | 4 | import Config from './config'; 5 | import {Boostnote, Enex, HTML, Markdown} from './providers'; 6 | import Utils from './utils'; 7 | import type {Source, Options} from './types'; 8 | 9 | /* MAIN */ 10 | 11 | const Dumper = { 12 | 13 | /* VARIABLES */ 14 | 15 | providers: [ 16 | Boostnote, 17 | Enex, 18 | HTML, 19 | Markdown 20 | ], 21 | 22 | /* API */ 23 | 24 | isSupported: ( source: Source ): boolean => { 25 | 26 | return !!Dumper.providers.find ( provider => provider.isSupported ( source ) ); 27 | 28 | }, 29 | 30 | dump: async ( options: Options ): Promise => { 31 | 32 | if ( options.DOMParser ) Config.html2markdown.options['parser'] = options.DOMParser; 33 | 34 | const sources = Utils.lang.castArray ( options.source ); 35 | const sourcesUnsupported = sources.filter ( source => !Dumper.isSupported ( source ) ); 36 | 37 | if ( sourcesUnsupported.length ) throw new Error ( `These sources are not supported: ${sourcesUnsupported.join ( ', ' )}` ); 38 | 39 | for ( const source of sources ) { 40 | 41 | const provider = Dumper.providers.find ( provider => provider.isSupported ( source ) ); 42 | 43 | if ( !provider ) throw new Error ( `This source is not supported: ${source}` ); 44 | 45 | await provider.dump ( source, options.dump ); 46 | 47 | } 48 | 49 | } 50 | 51 | }; 52 | 53 | /* EXPORT */ 54 | 55 | export default Dumper; 56 | -------------------------------------------------------------------------------- /src/providers/abstract/index.ts: -------------------------------------------------------------------------------- 1 | 2 | /* IMPORT */ 3 | 4 | import decode from 'entities-decode'; 5 | import sanitize from 'sanitize-basename'; 6 | import Config from '../../config'; 7 | import Utils from '../../utils'; 8 | import type {ConstructorWith, Promisable, Attachment, AttachmentMetadata, Note, NoteMetadata, Dump, Content, Source, SourceDetails} from '../../types'; 9 | 10 | /* MAIN */ 11 | 12 | abstract class AbstractProvider { 13 | 14 | /* VARIABLES */ 15 | 16 | abstract name: string; 17 | abstract extensions: string[]; 18 | 19 | note: AbstractNote; 20 | attachment: AbstractAttachment; 21 | 22 | /* CONSTRUCTOR */ 23 | 24 | constructor ( Note: ConstructorWith, [AbstractProvider]> = AbstractNote, Attachment: ConstructorWith, [AbstractProvider]> = AbstractAttachment ) { 25 | 26 | this.note = new Note ( this ); 27 | this.attachment = new Attachment ( this ); 28 | 29 | } 30 | 31 | /* API */ 32 | 33 | isSupported ( source: Source ): boolean { 34 | 35 | return Utils.lang.isString ( source ) && !!this.extensions.find ( ext => source.toLowerCase ().endsWith ( ext ) ); 36 | 37 | } 38 | 39 | async getDetails ( source: Source ): Promise { 40 | 41 | if ( !Utils.lang.isString ( source ) ) return {}; 42 | 43 | return { 44 | stats: await Utils.file.stats ( source ), 45 | filePath: source 46 | }; 47 | 48 | } 49 | 50 | getContent ( source: Source ): Promisable { 51 | 52 | if ( Utils.lang.isBuffer ( source ) ) return source; 53 | 54 | return Utils.file.read ( source ); 55 | 56 | } 57 | 58 | getNotesRaw ( content: Content ): Promisable { 59 | 60 | return [content] as unknown as [NoteRaw]; //TSC 61 | 62 | } 63 | 64 | async dump ( source: Source, dump: Dump ): Promise { 65 | 66 | const details = await this.getDetails ( source ); 67 | const content = await this.getContent ( source ); 68 | const notesRaw = await this.getNotesRaw ( content ); 69 | 70 | for ( let noteRaw of notesRaw ) { 71 | 72 | const note = await this.note.get ( noteRaw, details ); 73 | 74 | await dump ( note ); 75 | 76 | } 77 | 78 | } 79 | 80 | } 81 | 82 | class AbstractNote { 83 | 84 | /* VARIABLES */ 85 | 86 | protected provider: AbstractProvider; 87 | 88 | /* CONSTRUCTOR */ 89 | 90 | constructor ( provider: AbstractProvider ) { 91 | 92 | this.provider = provider; 93 | 94 | } 95 | 96 | /* API */ 97 | 98 | async get ( note: NoteRaw, details: SourceDetails ): Promise { 99 | 100 | const metadata = await this.sanitizeMetadata ( await this.getMetadata ( note, details ), details ); 101 | const content = await this.formatContent ( await this.getContent ( note, metadata ), metadata ); 102 | 103 | return { metadata, content }; 104 | 105 | } 106 | 107 | getMetadata ( note: NoteRaw, details: SourceDetails ): Promisable> { 108 | 109 | throw new Error ( 'Missing implementation: Note#getMetadata' ); 110 | 111 | } 112 | 113 | sanitizeMetadata ( metadata: Partial, details: SourceDetails ): NoteMetadata { 114 | 115 | const created = Utils.lang.isDateValid ( metadata.created ) ? metadata.created : ( details.stats ? details.stats.birthtime : new Date () ); 116 | const modified = Utils.lang.isDateValid ( metadata.modified ) ? metadata.modified : ( details.stats ? details.stats.mtime : created ); 117 | const titleFallback = details.filePath ? sanitize ( Utils.path.name ( details.filePath ) ) || Config.note.defaultTitle : Config.note.defaultTitle; 118 | 119 | return { 120 | title: metadata.title ? sanitize ( decode ( String ( metadata.title ) ).trim () ) || titleFallback : titleFallback, 121 | tags: metadata.tags ? metadata.tags.map ( tag => String ( tag ).trim () ).filter ( tag => tag ) : [], 122 | attachments: metadata.attachments ? metadata.attachments.map ( attachment => { 123 | attachment.metadata.created = Utils.lang.isDateValid ( attachment.metadata.created ) ? attachment.metadata.created : created; 124 | attachment.metadata.modified = Utils.lang.isDateValid ( attachment.metadata.modified ) ? attachment.metadata.modified : modified; 125 | return attachment; 126 | }) : [], 127 | deleted: Utils.lang.isBoolean ( metadata.deleted ) ? metadata.deleted : false, 128 | favorited: Utils.lang.isBoolean ( metadata.favorited ) ? metadata.favorited : false, 129 | pinned: Utils.lang.isBoolean ( metadata.pinned ) ? metadata.pinned : false, 130 | created, 131 | modified, 132 | sourceUrl: Utils.lang.isString ( metadata.sourceUrl ) ? metadata.sourceUrl : undefined 133 | }; 134 | 135 | } 136 | 137 | getContent ( note: NoteRaw, metadata: NoteMetadata ): Promisable { 138 | 139 | return note as unknown as Content; //TSC 140 | 141 | } 142 | 143 | formatContent ( content: Content, metadata: NoteMetadata ): Promisable { 144 | 145 | return Utils.buffer.fromUtf8 ( Utils.buffer.toUtf8 ( content ).trim () ); 146 | 147 | } 148 | 149 | } 150 | 151 | class AbstractAttachment { 152 | 153 | /* VARIABLES */ 154 | 155 | protected provider: AbstractProvider; 156 | 157 | /* CONSTRUCTOR */ 158 | 159 | constructor ( provider: AbstractProvider ) { 160 | 161 | this.provider = provider; 162 | 163 | } 164 | 165 | /* API */ 166 | 167 | async get ( attachment: AttachmentRaw ): Promise { 168 | 169 | const metadatas = Utils.lang.castArray ( await this.getMetadata ( attachment ) ).map ( metadata => this.sanitizeMetadata ( metadata ) ); 170 | const contents = await Promise.all ( metadatas.map ( metadata => this.getContent ( attachment, metadata ) ) ); 171 | const attachments = metadatas.map ( ( metadata, i ) => ({ metadata, content: contents[i] }) ); 172 | 173 | return attachments; 174 | 175 | } 176 | 177 | getMetadata ( attachment: AttachmentRaw ): Promisable | Partial[]> { 178 | 179 | throw new Error ( 'Missing implementation: Attachment#getMetadata' ); 180 | 181 | } 182 | 183 | sanitizeMetadata ( metadata: Partial ): AttachmentMetadata { 184 | 185 | return { 186 | name: metadata.name ? sanitize ( String ( metadata.name ).trim () ) || Config.attachment.defaultName : Config.attachment.defaultName, 187 | created: Utils.lang.isDateValid ( metadata.created ) ? metadata.created : new Date ( 'invalid' ), //UGLY: we are using this invalid date as kind of like a global variable 188 | modified: Utils.lang.isDateValid ( metadata.modified ) ? metadata.modified : new Date ( 'invalid' ), //UGLY: we are using this invalid date as kind of like a global variable 189 | mime: metadata.mime 190 | }; 191 | 192 | } 193 | 194 | getContent ( attachment: AttachmentRaw, metadata: AttachmentMetadata ): Promisable { 195 | 196 | throw new Error ( 'Missing implementation: Attachment#getContent' ); 197 | 198 | } 199 | 200 | } 201 | 202 | /* EXPORT */ 203 | 204 | export {AbstractProvider, AbstractNote, AbstractAttachment}; 205 | -------------------------------------------------------------------------------- /src/providers/boostnote/index.ts: -------------------------------------------------------------------------------- 1 | 2 | /* IMPORT */ 3 | 4 | import cson2json from 'cson2json'; 5 | import path from 'node:path'; 6 | import process from 'node:process'; 7 | import Utils from '../../utils'; 8 | import type {AttachmentMetadata, NoteMetadata, Content, SourceDetails} from '../../types'; 9 | import {AbstractProvider, AbstractNote, AbstractAttachment} from '../abstract'; 10 | import type {AttachmentRaw, NoteRaw} from './types'; 11 | 12 | /* MAIN */ 13 | 14 | class BoostnoteProvider extends AbstractProvider { 15 | 16 | /* VARIABLES */ 17 | 18 | name = 'Boostnote'; 19 | extensions = ['.cson']; 20 | 21 | /* API */ 22 | 23 | getNotesRaw ( content: Content ): NoteRaw[] { 24 | 25 | return [cson2json ( Utils.buffer.toUtf8 ( content ) )]; 26 | 27 | } 28 | 29 | } 30 | 31 | class BoostnoteNote extends AbstractNote { 32 | 33 | async getMetadata ( note: NoteRaw, details: SourceDetails ): Promise> { 34 | 35 | const attachmentsPaths = this.getAttachmentsPaths ( note, details ); 36 | 37 | return { 38 | title: note.title || Utils.format.markdown.inferTitle ( note.content || '' ), 39 | tags: note.tags, 40 | attachments: Utils.lang.flatten ( await Promise.all ( attachmentsPaths.map ( attachmentPath => this.provider.attachment.get ( attachmentPath ) ) ) ), 41 | deleted: note.isTrashed, 42 | favorited: note.isStarred, 43 | created: note.createdAt && new Date ( note.createdAt ), 44 | modified: note.updatedAt && new Date ( note.updatedAt ) 45 | }; 46 | 47 | } 48 | 49 | getAttachmentsPaths ( note: NoteRaw, details: SourceDetails ): string[] { 50 | 51 | if ( !details.filePath ) return []; 52 | 53 | const attachmentsLinks = note.content ? Utils.lang.matchAll ( note.content, /\]\(:storage\/([^)]+)\)/gi ) : []; 54 | const attachmentsCwd = process.env['IS_TEST'] ? path.resolve ( details.filePath, '..', 'attachments' ) : path.resolve ( details.filePath, '..', '..', 'attachments' ); 55 | const attachmentsPaths = attachmentsLinks.map ( match => path.join ( attachmentsCwd, match[1] ) ); 56 | 57 | return attachmentsPaths; 58 | 59 | } 60 | 61 | getContent ( note: NoteRaw ): Content { 62 | 63 | return Utils.buffer.fromUtf8 ( note.content || '' ); 64 | 65 | } 66 | 67 | formatAttachmentsLinks ( content: string ): string { 68 | 69 | return content.replace ( /\]\(:storage\/[a-z0-9-]+\/([^)]+)\)/i, '](@attachment/$1)' ); 70 | 71 | } 72 | 73 | formatContent ( content: Content, metadata: NoteMetadata ): Content { 74 | 75 | let str = Utils.buffer.toUtf8 ( content ).trim (); 76 | 77 | str = this.formatAttachmentsLinks ( str ); 78 | 79 | return Utils.buffer.fromUtf8 ( str ); 80 | 81 | } 82 | 83 | } 84 | 85 | class BoostnoteAttachment extends AbstractAttachment { 86 | 87 | getMetadata ( attachment: AttachmentRaw ): Partial { 88 | 89 | return { 90 | name: path.basename ( attachment ) 91 | }; 92 | 93 | } 94 | 95 | getContent ( attachment: AttachmentRaw ): Promise { 96 | 97 | return Utils.file.read ( attachment ); 98 | 99 | } 100 | 101 | } 102 | 103 | /* EXPORT */ 104 | 105 | export {BoostnoteProvider, BoostnoteNote, BoostnoteAttachment}; 106 | export default new BoostnoteProvider ( BoostnoteNote, BoostnoteAttachment ); 107 | -------------------------------------------------------------------------------- /src/providers/boostnote/types.ts: -------------------------------------------------------------------------------- 1 | 2 | /* MAIN */ 3 | 4 | type AttachmentRaw = string; 5 | 6 | type NoteRaw = any; 7 | 8 | /* EXPORT */ 9 | 10 | export type {AttachmentRaw, NoteRaw}; 11 | -------------------------------------------------------------------------------- /src/providers/enex/index.ts: -------------------------------------------------------------------------------- 1 | 2 | /* IMPORT */ 3 | 4 | import {parse as xml2js} from 'fast-xml-parser'; 5 | import Utils from '../../utils'; 6 | import type {AttachmentMetadata, NoteMetadata, Content} from '../../types'; 7 | import {AbstractProvider, AbstractNote, AbstractAttachment} from '../abstract'; 8 | import type {AttachmentRaw, NoteRaw} from './types'; 9 | 10 | /* MAIN */ 11 | 12 | class EnexProvider extends AbstractProvider { 13 | 14 | /* VARIABLES */ 15 | 16 | name = 'Evernote'; 17 | extensions = ['.enex']; 18 | 19 | /* API */ 20 | 21 | getNotesRaw ( content: Content ): NoteRaw[] { 22 | 23 | return Utils.lang.castArray ( xml2js ( Utils.buffer.toUtf8 ( content ) )['en-export'].note ); 24 | 25 | } 26 | 27 | } 28 | 29 | class EnexNote extends AbstractNote { 30 | 31 | async getMetadata ( note: NoteRaw ): Promise> { 32 | 33 | const resources = note.resource ? Utils.lang.castArray ( note.resource ).filter ( resource => !!resource && !!resource.data ) : []; 34 | 35 | return { 36 | title: note.title || Utils.format.html.inferTitle ( note.content || '' ), 37 | tags: note.tag && Utils.lang.castArray ( note.tag ), 38 | attachments: Utils.lang.flatten ( await Promise.all ( resources.map ( resource => this.provider.attachment.get ( resource ) ) ) ), 39 | created: note.created && this.parseDate ( note.created ), 40 | modified: note.updated && this.parseDate ( note.updated ), 41 | sourceUrl: note['note-attributes'] && note['note-attributes']['source-url'] 42 | }; 43 | 44 | } 45 | 46 | parseDate ( date: string ): Date { // From the YYYYMMDDTHHMMSSZ format 47 | 48 | const chars = date.split ( '' ); 49 | 50 | chars.splice ( 13, 0, ':' ); 51 | chars.splice ( 11, 0, ':' ); 52 | chars.splice ( 6, 0, '-' ); 53 | chars.splice ( 4, 0, '-' ); 54 | 55 | return new Date ( chars.join ( '' ) ); 56 | 57 | } 58 | 59 | getContent ( note: NoteRaw ): Content { 60 | 61 | return Utils.buffer.fromUtf8 ( note.content || '' ); 62 | 63 | } 64 | 65 | formatSourceUrl ( content: string, sourceUrl: string ): string { 66 | 67 | return `${content.trim ()}\n\n---\n\n> Source: ${sourceUrl}`; 68 | 69 | } 70 | 71 | formatContent ( content: Content, metadata: NoteMetadata ): Content { 72 | 73 | let str = Utils.format.html.convert ( Utils.buffer.toUtf8 ( content ), metadata.title ); 74 | 75 | if ( metadata.sourceUrl ) str = this.formatSourceUrl ( str, metadata.sourceUrl ); 76 | 77 | return Utils.buffer.fromUtf8 ( str ); 78 | 79 | } 80 | 81 | } 82 | 83 | class EnexAttachment extends AbstractAttachment { 84 | 85 | getMetadata ( attachment: AttachmentRaw ): Partial[] { 86 | 87 | const metadatas: Partial[] = []; 88 | const mime = attachment.mime; 89 | const name = attachment['resource-attributes'] && attachment['resource-attributes']['file-name']; 90 | 91 | if ( name ) { 92 | 93 | metadatas.push ({ name, mime }); 94 | 95 | } 96 | 97 | if ( attachment.recognition ) { 98 | 99 | const recognition = xml2js ( attachment.recognition, { ignoreAttributes: false } ); 100 | 101 | if ( recognition.recoIndex && recognition.recoIndex['@_objID'] ) { 102 | 103 | const ext = Utils.mime.inferExtension ( attachment.mime ); 104 | const name = `${recognition.recoIndex['@_objID']}${ext}`; 105 | 106 | metadatas.push ({ name, mime }); 107 | 108 | } 109 | 110 | } 111 | 112 | return metadatas; 113 | 114 | } 115 | 116 | getContent ( attachment: AttachmentRaw ): Content { 117 | 118 | return Utils.buffer.fromBase64 ( attachment.data ); 119 | 120 | } 121 | 122 | } 123 | 124 | /* EXPORT */ 125 | 126 | export {EnexProvider, EnexNote, EnexAttachment}; 127 | export default new EnexProvider ( EnexNote, EnexAttachment ); 128 | -------------------------------------------------------------------------------- /src/providers/enex/types.ts: -------------------------------------------------------------------------------- 1 | 2 | /* MAIN */ 3 | 4 | type AttachmentRaw = XML; 5 | 6 | type NoteRaw = XML; 7 | 8 | type XML = any; 9 | 10 | /* EXPORT */ 11 | 12 | export type {AttachmentRaw, NoteRaw}; 13 | -------------------------------------------------------------------------------- /src/providers/html/index.ts: -------------------------------------------------------------------------------- 1 | 2 | /* IMPORT */ 3 | 4 | import Utils from '../../utils'; 5 | import type {NoteMetadata, Content} from '../../types'; 6 | import {AbstractProvider, AbstractNote} from '../abstract'; 7 | import type {AttachmentRaw, NoteRaw} from './types'; 8 | 9 | /* MAIN */ 10 | 11 | class HTMLProvider extends AbstractProvider { 12 | 13 | /* VARIABLES */ 14 | 15 | name = 'HTML'; 16 | extensions = ['.html', '.htm']; 17 | 18 | } 19 | 20 | class HTMLNote extends AbstractNote { 21 | 22 | getMetadata ( note: NoteRaw ): Partial { 23 | 24 | return { 25 | title: Utils.format.html.inferTitle ( Utils.buffer.toUtf8 ( note ) ) 26 | }; 27 | 28 | } 29 | 30 | formatContent ( content: Content, metadata: NoteMetadata ): Content { 31 | 32 | return Utils.buffer.fromUtf8 ( Utils.format.html.convert ( Utils.buffer.toUtf8 ( content ), metadata.title ) ); 33 | 34 | } 35 | 36 | } 37 | 38 | /* EXPORT */ 39 | 40 | export {HTMLProvider, HTMLNote}; 41 | export default new HTMLProvider ( HTMLNote ); 42 | -------------------------------------------------------------------------------- /src/providers/html/types.ts: -------------------------------------------------------------------------------- 1 | 2 | /* MAIN */ 3 | 4 | type AttachmentRaw = undefined; 5 | 6 | type NoteRaw = Uint8Array; 7 | 8 | /* EXPORT */ 9 | 10 | export type {AttachmentRaw, NoteRaw}; 11 | -------------------------------------------------------------------------------- /src/providers/index.ts: -------------------------------------------------------------------------------- 1 | 2 | /* IMPORT */ 3 | 4 | import Boostnote from './boostnote'; 5 | import Enex from './enex'; 6 | import HTML from './html'; 7 | import Markdown from './markdown'; 8 | 9 | /* EXPORT */ 10 | 11 | export {Boostnote, Enex, HTML, Markdown}; 12 | -------------------------------------------------------------------------------- /src/providers/markdown/index.ts: -------------------------------------------------------------------------------- 1 | 2 | /* IMPORT */ 3 | 4 | import Utils from '../../utils'; 5 | import type {NoteMetadata} from '../../types'; 6 | import {AbstractProvider, AbstractNote} from '../abstract'; 7 | import type {AttachmentRaw, NoteRaw} from './types'; 8 | 9 | /* MAIN */ 10 | 11 | class MarkdownProvider extends AbstractProvider { 12 | 13 | /* VARIABLES */ 14 | 15 | name = 'Markdown'; 16 | extensions = ['.md', '.mkd', '.mkdn', '.mdwn', '.mdown', '.markdown', '.markdn', '.mdtxt', '.mdtext', '.qmd', '.rmd', '.txt']; 17 | 18 | } 19 | 20 | class MarkdownNote extends AbstractNote { 21 | 22 | getMetadata ( note: NoteRaw ): Partial { 23 | 24 | return { 25 | title: Utils.format.markdown.inferTitle ( Utils.buffer.toUtf8 ( note ) ) 26 | }; 27 | 28 | } 29 | 30 | } 31 | 32 | /* EXPORT */ 33 | 34 | export {MarkdownProvider, MarkdownNote}; 35 | export default new MarkdownProvider ( MarkdownNote ); 36 | -------------------------------------------------------------------------------- /src/providers/markdown/types.ts: -------------------------------------------------------------------------------- 1 | 2 | /* MAIN */ 3 | 4 | type AttachmentRaw = undefined; 5 | 6 | type NoteRaw = Uint8Array; 7 | 8 | /* EXPORT */ 9 | 10 | export type {AttachmentRaw, NoteRaw}; 11 | -------------------------------------------------------------------------------- /src/types.ts: -------------------------------------------------------------------------------- 1 | 2 | /* IMPORT */ 3 | 4 | import type {Stats} from 'node:fs'; 5 | 6 | /* HELPERS */ 7 | 8 | type Constructor = { new (): T }; 9 | 10 | type ConstructorWith = { new ( ...args: Arguments ): T }; 11 | 12 | type Promisable = Promise | T; 13 | 14 | /* MAIN */ 15 | 16 | type DOMParser = Constructor<{ 17 | parseFromString ( str: string, mimeType: string ): Document 18 | }>; 19 | 20 | type Attachment = { 21 | metadata: AttachmentMetadata, 22 | content: Content 23 | }; 24 | 25 | type AttachmentMetadata = { 26 | name: string, 27 | created: Date, 28 | modified: Date, 29 | mime?: string 30 | }; 31 | 32 | type Note = { 33 | metadata: NoteMetadata, 34 | content: Content 35 | }; 36 | 37 | type NoteMetadata = { 38 | title: string, 39 | tags: string[], 40 | attachments: Attachment[], 41 | deleted: boolean, 42 | favorited: boolean, 43 | pinned: boolean, 44 | created: Date, 45 | modified: Date, 46 | sourceUrl?: string 47 | }; 48 | 49 | type Dump = ( note: Note ) => Promisable; 50 | 51 | type Source = string | Uint8Array; 52 | 53 | type SourceDetails = { 54 | stats?: Stats, 55 | filePath?: string 56 | }; 57 | 58 | type Content = Uint8Array; 59 | 60 | type Options = { 61 | DOMParser?: DOMParser, 62 | source: Source | Source[], 63 | dump: Dump 64 | }; 65 | 66 | /* EXPORT */ 67 | 68 | export type {Constructor, ConstructorWith, Promisable}; 69 | export type {DOMParser, Attachment, AttachmentMetadata, Note, NoteMetadata, Dump, Source, SourceDetails, Content, Stats, Options}; 70 | -------------------------------------------------------------------------------- /src/utils.ts: -------------------------------------------------------------------------------- 1 | 2 | /* IMPORT */ 3 | 4 | import decodeBase64 from 'decode-base64'; 5 | import html2markdown from 'html2markdown'; 6 | import mime2ext from 'mime2ext'; 7 | import fs from 'node:fs'; 8 | import path from 'node:path'; 9 | import U8 from 'uint8-encoding'; 10 | import Config from './config'; 11 | import type {Stats} from './types'; 12 | 13 | /* MAIN */ 14 | 15 | const Utils = { 16 | 17 | /* API */ 18 | 19 | buffer: { 20 | 21 | fromBase64: ( string: string ): Uint8Array => { 22 | 23 | string = string.replace ( /\r?\n|\r/g, '' ); // Sanitization for stupid inputs like Evernote's 24 | 25 | return decodeBase64 ( string ); 26 | 27 | }, 28 | 29 | fromUtf8: ( string: string ): Uint8Array => { 30 | 31 | return U8.encode ( string ); 32 | 33 | }, 34 | 35 | toUtf8: ( buffer: Uint8Array ): string => { 36 | 37 | return U8.decode ( buffer ); 38 | 39 | } 40 | 41 | }, 42 | 43 | lang: { 44 | 45 | isArray: ( value: unknown ): value is unknown[] => { 46 | 47 | return Array.isArray ( value ); 48 | 49 | }, 50 | 51 | isBoolean: ( value: unknown ): value is boolean => { 52 | 53 | return typeof value === 'boolean'; 54 | 55 | }, 56 | 57 | isString: ( value: unknown ): value is string => { 58 | 59 | return typeof value === 'string'; 60 | 61 | }, 62 | 63 | isBuffer: ( value: unknown ): value is Uint8Array => { 64 | 65 | return value instanceof Uint8Array; 66 | 67 | }, 68 | 69 | isDateValid: ( value: unknown ): value is Date => { 70 | 71 | return value instanceof Date && !isNaN ( value.getTime () ); 72 | 73 | }, 74 | 75 | castArray: ( value: T | T[] ): T[] => { 76 | 77 | return Utils.lang.isArray ( value ) ? value : [value]; 78 | 79 | }, 80 | 81 | flatten: ( value: T[][] ): T[] => { 82 | 83 | return [].concat.apply ( [], value as any ); //TSC 84 | 85 | }, 86 | 87 | matchAll: ( str: string, re: RegExp ): RegExpMatchArray[] => { 88 | 89 | return Array.from ( str.matchAll ( re ) ); 90 | 91 | } 92 | 93 | }, 94 | 95 | mime: { 96 | 97 | inferExtension: ( type: string ): string => { 98 | 99 | const ext = mime2ext ( type ); 100 | 101 | return ext ? `.${ext}` : ''; 102 | 103 | }, 104 | 105 | isImage: ( type: string ): boolean => { 106 | 107 | return type.includes ( 'image' ); 108 | 109 | } 110 | 111 | }, 112 | 113 | system: { 114 | 115 | getMaxHeapSize: (): number => { 116 | 117 | return 2197815296; // Hard-coded for better web compatibility, source: "require ( 'v8' ).getHeapStatistics ().heap_size_limit" 118 | 119 | } 120 | 121 | }, 122 | 123 | file: { 124 | 125 | checkSize: ( filePath: string ): Promise => { 126 | 127 | return Utils.file.stats ( filePath ).then ( stats => { 128 | 129 | if ( stats.size < ( Utils.system.getMaxHeapSize () * .75 ) ) return; 130 | 131 | throw new Error ( 'File too large, try splitting it into smaller ones' ); 132 | 133 | }); 134 | 135 | }, 136 | 137 | read: async ( filePath: string ): Promise => { 138 | 139 | await Utils.file.checkSize ( filePath ); 140 | 141 | return new Promise ( ( resolve, reject ) => { 142 | 143 | fs.readFile ( filePath, ( err, data ) => { 144 | 145 | if ( err ) return reject ( err ); 146 | 147 | return resolve ( data ); 148 | 149 | }); 150 | 151 | }); 152 | 153 | }, 154 | 155 | stats: ( filePath: string ): Promise => { 156 | 157 | return new Promise ( ( resolve, reject ) => { 158 | 159 | fs.stat ( filePath, ( err, stats ) => { 160 | 161 | if ( err ) return reject ( err ); 162 | 163 | return resolve ( stats ); 164 | 165 | }); 166 | 167 | }); 168 | 169 | } 170 | 171 | }, 172 | 173 | path: { 174 | 175 | name: ( filePath: string ): string => { 176 | 177 | return path.basename ( filePath, path.extname ( filePath ) ); 178 | 179 | } 180 | 181 | }, 182 | 183 | format: { 184 | 185 | txt: { 186 | 187 | inferTitle: ( content: string ): string | undefined => { 188 | 189 | const firstUnemptyLine = content.match ( /^.*?\S.*$/m ); 190 | 191 | if ( firstUnemptyLine ) return firstUnemptyLine[0].trim (); 192 | 193 | } 194 | 195 | }, 196 | 197 | markdown: { 198 | 199 | inferTitle: ( content: string ): string | undefined => { 200 | 201 | const headingMatch = content.match ( /^\s{0,3}#+\s(.*)(\s#+\s*$)?/m ); 202 | 203 | if ( headingMatch ) return headingMatch[1].trim (); 204 | 205 | } 206 | 207 | }, 208 | 209 | html: { 210 | 211 | inferTitle: ( content: string ): string | undefined => { 212 | 213 | const headingMatch = content.match ( /]*)?>(.*?)<\/h1>/i ); 214 | 215 | if ( headingMatch ) return headingMatch[1].trim (); 216 | 217 | const titleMatch = content.match ( /]*)?>(.*?)<\/title>/i ); 218 | 219 | if ( titleMatch ) return titleMatch[1].trim (); 220 | 221 | }, 222 | 223 | ensureTitle: ( content: string, title: string ): string => { 224 | 225 | const headingMatch = content.match ( /]*)?>(.*?)<\/h1>/i ); 226 | 227 | if ( headingMatch ) return content; 228 | 229 | const titleTag = `

${title}

`; 230 | const bodyIndex = content.indexOf ( '' ); 231 | 232 | if ( bodyIndex >= 0 ) { 233 | 234 | return `${content.substring ( 0, bodyIndex )}${titleTag}${content.substring ( bodyIndex )}`; 235 | 236 | } else { 237 | 238 | return `${titleTag}${content}`; 239 | 240 | } 241 | 242 | }, 243 | 244 | convert: ( content: string, title?: string ): string => { 245 | 246 | title = title || Utils.format.html.inferTitle ( content ); 247 | 248 | if ( title ) content = Utils.format.html.ensureTitle ( content, title ); 249 | 250 | return html2markdown ( content, Config.html2markdown.options ); 251 | 252 | } 253 | 254 | } 255 | 256 | } 257 | 258 | }; 259 | 260 | /* EXPORT */ 261 | 262 | export default Utils; 263 | -------------------------------------------------------------------------------- /test/check/boostnote/sample.cson/Title.md: -------------------------------------------------------------------------------- 1 | # Title 2 | 3 | ### **TEXT** 4 | 5 | Text 9 6 | 7 | Text 10 8 | 9 | Text 11 10 | 11 | Text 12 12 | 13 | Text 13 14 | 15 | Text 14 16 | 17 | Text 18 18 | 19 | ### Text 24 20 | 21 | ## Text 36 22 | 23 | # Text 48 24 | 25 | # Text 64 26 | 27 | # Text 72 28 | 29 | ### **STYLE** 30 | 31 | **Bold** 32 | 33 | _Italic_ 34 | 35 | Underlined 36 | 37 | Colored 38 | 39 | Highlighted 40 | 41 | `Code` 42 | 43 | ``` 44 | Multiline 45 | 46 | Code 47 | 48 | Block 49 | ``` 50 | 51 | ### ### **_Mixed_** 52 | 53 | ### **LISTS** 54 | 55 | - Bullet list 56 | 57 | - Bullet list 58 | 59 | 1. Numbered list 60 | 61 | 2. Numbered list 62 | 63 | ### **FORM** 64 | 65 | - [ ] Unchecked 66 | - [x] Checked 67 | 68 | --- 69 | 70 | ### **ALIGNMENT** 71 | 72 | Left 73 | 74 |

Center

75 | 76 |

Right

77 | 78 |

Justify

79 | 80 | ### **ATTACHMENTS** 81 | 82 | ![d1cbe242.png](@attachment/d1cbe242.png) 83 | -------------------------------------------------------------------------------- /test/check/boostnote/sample.cson/Title.md.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Title", 3 | "tags": [ 4 | "Foo" 5 | ], 6 | "attachments": [ 7 | "d1cbe242.png" 8 | ], 9 | "deleted": true, 10 | "favorited": true, 11 | "pinned": false, 12 | "created": "[VALID_DATE]", 13 | "modified": "[VALID_DATE]" 14 | } 15 | -------------------------------------------------------------------------------- /test/check/boostnote/sample.cson/d1cbe242.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/notable/dumper/80b2ccbe4a3a70e57d269d789126375506ba504e/test/check/boostnote/sample.cson/d1cbe242.png -------------------------------------------------------------------------------- /test/check/boostnote/sample.cson/d1cbe242.png.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "d1cbe242.png", 3 | "created": "[VALID_DATE]", 4 | "modified": "[VALID_DATE]" 5 | } 6 | -------------------------------------------------------------------------------- /test/check/enex/advanced.enex/101 Profitable Digital Products You Can Sell Online in 2019 ǀ Sellfy.md: -------------------------------------------------------------------------------- 1 |

2 | 3 |

101 Digital Products to Sell Online in 2019

4 | 5 |

by [Julia Gifford](https://blog.sellfy.com/author/julia/ "View all posts by Julia Gifford")

6 | 7 | We live in a time where you can conduct the entirety of your business entirely from your couch. From start to finish. What’s not to love? 8 | 9 | For some, online sales provide supplementary income in addition to the main job they do. For others, it’s become a full time job. What both cases have in common is, that they both leverage the undeniable benefits of selling digital products. 10 | 11 | Here are some benefits of selling digital products online: 12 | 13 |

14 | 15 | - **They’re infinitely scalable** – you’re never limited to how many products can sell. The sky’s the limit! 16 | - **You don’t worry about logistics** – where to keep stock, how to package your products, and making sure that they get shipped out on time are all problems that physical product sellers have, that digital product sellers don’t have to deal with. 17 | - **Low upfront costs** – the barrier to entry is low when selling digital products. It doesn’t demand much of an upfront investment as you don’t have to invest in stock or manufacturing 18 | 19 |

20 | 21 | The biggest question that often stops those who are looking to create their online business is – [what to sell](https://blog.sellfy.com/what-to-sell-online/)? 22 | 23 | So if you’ve decided to give digital product sales a go, but can’t think of a great niche product that’s perfect for you, then this list of digital products to sell is the only thing you need. 24 | 25 | 26 | 27 | We’ve put together a giant list of 101 digital products you can sell, divided it into different categories for easier browsing. Use this as a source of inspiration, and don’t be afraid to think outside the box and come up with your own unique spin on a product to sell. 28 | 29 |

Here’s our list of 101 digital product ideas you can sell online

30 | 31 | Regardless of what you’re selling, whether online or off, the key is to always provide value. If what you have to offer (in the way you package it), is of value to others, you can sell it. With that in mind, here are 101 ideas of products you can sell online that are guaranteed to bring value to a niche audience. 32 | 33 | **Writing:** 34 | 35 | Self-publishing has become a modern-day reality, letting anyone with anything to offer the world the ability to make it available online (and sell it, too!). Put words into documents, be it an ebook or a PDF, and turn words into value. 36 | 37 | **Sell ebooks** if you’ve always wanted to be a writer, but didn’t quite know how to get published. Writing an ebook gives you unlimited possibilities, since you don’t need to worry about distribution (so much). All you need is an idea, your trusty computer, a writing nook where you feel comfortable, yet inspired, and the world wide web. 38 | 39 | Here’s why ebooks are great: they’re easily consumable, they’re great for building business credibility, and they can generate income through content. Include affiliate links in your ebook or use the text as a sort of long-form sales letter for your other products, courses, services, etc. 40 | 41 | Besides, ebooks are a great way to bring in leads. Distribute the ebook for free in exchange for website visitor’s email. The best part is, they’re easy to make. Take a look at these [ebook templates by Venngage](https://venngage.com/templates/ebooks) to get you started. 42 | 43 | Or if you’re more into journalism, **sell magazines**. You can create your own digital issue on whatever topic you find interesting. Take [WLA Landscape Architecture](https://sellfy.com/wla), for example, a bimonthly landscape architecture magazine publishing projects from across the world. 44 | 45 | 46 | 47 | 1. Ebook – non-fiction 48 | 2. Ebook – fiction 49 | 3. Poetry book 50 | 4. Ecommerce product descriptions 51 | 5. Copywriting templates (ex. How to fire a client, how to raise prices) 52 | 6. Recipe books 53 | 7. Document templates 54 | 8. Reports/analytics templates 55 | 9. Email campaign templates (upselling, cross-selling, re-engagement, etc.) 56 | 10. Creative brief samples/templates 57 | 11. Academic research, papers, findings 58 | 12. Magazines 59 | 13. Writing cover letters 60 | 14. Dispute letters (with banks, attorneys, clients, etc.) 61 | 62 | **Audio:** 63 | 64 | Thanks to the ability to store and send audio digitally through MP3s and other formats, we’re able to sell audio content online. Thanks to the demand in audio, there’s a market for it. 65 | 66 | Take [DECAP](https://sellfy.com/decap), for example, who have made his drum kits available online. 67 | 68 | 69 | 70 | Do you have experience in the music production field? Or perhaps you think you know what it takes to make a great beat? 71 | 72 | Then [sell beats online.](https://sellfy.com/sell/beats-online/) This line of business does indeed need investment, since you’ll be needing specific sound equipment to record. At the same time, it’s not so much about the tools, as it is about knowing how to use them. Some knowledge in music theory might help, but other than that – have your own style, get into mixing, and start making that music. 73 | 74 | The same applies if you want to sell songs online. It’s one thing if you’re a well-known musician who’s selling out shows and bringing in hard-earned revenue from streaming services. 75 | 76 | But most likely – you’re no Rihanna or Coldplay (yet). So if you’re a musician who’s just still waiting to be [discovered by Usher](https://abcnews.go.com/GMA/Weekend/teen-pop-star-justin-bieber-discovered-youtube/story?id=9068403), selling songs as [stock music](https://sellfy.com/sell/stock-music/) is a great way to earn some extra cash on the side. TV shows, videos, and the film industry are constantly on the look-out for fresh tunes to use in the projects. What’s great about it – if you’re a musician, you’ve already got the skills and the team to create the product they need. 77 | 78 | Keep in mind that successful stock music maintains a consistent emotion or tone. So if you’re starting the song as indy folk tune, end it that way, too. Focus on short 20-30 second pieces with an intro, body, and conclusion or a repetitive loop that can be used in the background. 79 | 80 | Forms of audio you can sell online: 81 | 82 | 15. Songs 83 | 16. Beats 84 | 17. Jingles 85 | 18. Ringtones 86 | 19. Sound effects 87 | 20. Voice overs (as a service) 88 | 21. Instrumental tracks 89 | 90 | **Video:** 91 | 92 | Video content has become a powerful tool to deliver messages online. It’s an engaging form of content with [8 billion video views per day](https://techcrunch.com/2015/11/04/facebook-video-views/) – on Facebook alone. So it’s not difficult to imagine why video is one of the best digital products to sell. 93 | 94 | Video is a great form of storytelling that makes information more understandable. Marketers incorporate videos into their strategies as much as possible. So it’s not by chance that video will account for [79% of global Internet traffic](https://www.multichannel.com/news/cisco-video-consume-79-internet-traffic-2020-405454) by 2020. 95 | 96 | 97 | 98 | There are plenty of other important reasons to sell videos online. Here are several of them: 99 | 100 | - **Video content is highly in demand** while being a product that involves a high learning curve to master. 101 | - **Video attaches visuals to the learning process** – and people are constantly looking to acquire new knowledge. 102 | - **Minimal front-end costs** – there’s no shipping and no inventory. Also, the risk is incredibly low, making videos a great option for a beginner entrepreneur. 103 | 104 | So if you feel comfortable with video, you’re in the position to help out a lot of people who are willing to pay in return. 105 | 106 | [VFXnut](https://sellfy.com/vfxnut) is taking advantage by the rising popularity of Youtube channels, by offering specific video elements and bundles for YouTubers who don’t have the skills to do it themselves. 107 | 108 | 109 | 110 | Here are a few more ways you can leverage your video skills online: 111 | 112 | 22. Sell short films (entertainment) 113 | 23. Video animation intros 114 | 24. Stock video 115 | 25. Video tutorials (ex. How to use a DSLR camera, follow along yoga, learn to code, edit a vlog, etc.) 116 | 26. Professionally edited short videos as a service(wedding, travel, etc.) 117 | 27. Documentary 118 | 28. Stand-up comedy 119 | 29. Deluts 120 | 121 | **Design:** 122 | 123 | Design has become a heavily digitized industry, while simultaneously being in demand and dependant on knowledge and use of expensive tools and good taste. That makes for the perfect skill set to [sell online](https://sellfy.com/). 124 | 125 | Take [Pixel Bazaar](https://sellfy.com/pixelbazaar), for example, who sells icons online. Learn about how he made $5000 from two icon bundles within his first year of selling. 126 | 127 | 128 | 129 | **Sell logo design** if you want to combine using your creativity with making money. There are many online and physical businesses that require a strong visual identity, which means – the demand for logos is ever-growing. 130 | 131 | From the practical side of things, logos are comparatively fast to make, especially if you already have some experience in that field. It’s a win-win. 132 | 133 | Another great idea, especially if you have strong storytelling skills, is to **sell comics. **If you’re one of those people who grew up with an impressive comics collection, this could be the way to go since you’re already familiar with this kind of design. Besides, selling comics lets you use an abundance of skills. You’ll get to create a storyline, the layout, practice drawing, work with lettering, etc. 134 | 135 | Here are more ideas of what you can create and sell online with design skills: 136 | 137 | 30. Wallpapers 138 | 31. Posters/prints 139 | 32. Emojis/bitmojis 140 | 33. Fonts 141 | 34. Photoshop/illustrator templates 142 | 35. Branding services 143 | 36. Photoshop services (airbrushing, touch ups, etc.) 144 | 37. Logo design 145 | 38. Business card design 146 | 39. Infographic design 147 | 40. Turn images into vector files 148 | 41. Powerpoint / Keynote presentation templates 149 | 42. Printout origami 150 | 43. Printable colouring book pages 151 | 44. 3D models 152 | 45. VR/AR templates 153 | 46. 3D printer design files 154 | 47. Icon sets 155 | 48. Animations 156 | 49. Wedding invitation templates 157 | 50. CGI models 158 | 51. Comics 159 | 52. Printable calendars 160 | 53. Printable journals 161 | 162 | **Photography:** 163 | 164 | Photography can turn out to be an expensive hobby, but it’s possible to turn it into an income generator as well. 165 | 166 | For example, **sell LUTs** (look-up tables) if you have a knack for “freshening up” videos and photos. A LUT is a mathematical way of updating RGB values to creatively mimic a certain “feel” or “vibe”. Basically – using LUTs improves film and photography quality, while saving time. So if you’ve previously received compliments on how cinematic your photos or videos look, you can definitely turn this into a business option. 167 | 168 | 169 | 170 | Take [Benjamin Lambinet of IWLTBAP did](https://spotlight.sellfy.com/how-luts-designer-iwltbap-grew-his-instagram-account-from-0-to-29-8-k-followers-de38662d073c) for example, whose made his LUTs (Lookup tables) [available for purchase](https://sellfy.com/iwltbap). 171 | 172 | 173 | 174 | Here are just a few ways you can start selling your photography skills online: 175 | 176 | 54. Lightroom/photoshop presets 177 | 55. Mockup images 178 | 56. Stock photos 179 | 57. LUTs (Lookup Tables) 180 | 181 | **IT and tech:** 182 | 183 | It’s commonly known that IT and tech jobs are lucrative. Transfer those jobs to the online sales realm, and you’re in good shape to develop an income based on online sales. 184 | 185 | Take, [VSKYLAB](https://sellfy.com/jetmanhuss), for example, who have developed an entire line of addons for specific flight simulators: 186 | 187 | 188 | 189 | This goes to show that you can really create digital products for things outside the box, based on your interests and skills. And with the [right kind of online store](https://sellfy.com/), you’ll be able to sell software online with close to no hassle. 190 | 191 | If you’re into website design, turn your work into the product and sell web templates. Putting your designs online can get you anywhere from $500 to $30,000 a month. The good news is – there are nearly [2 billion](http://www.internetlivestats.com/total-number-of-websites/) websites online at the moment, and the number is growing by the second. With every page needing its own unique look, there’s definitely a niche for everyone. 192 | 193 | Or are you into game development? With the widespread adoption of smartphones, it’s become easier for small developers to sell video games online**.** Creating mobile games might be your pick if you’re not ready for up-front investment into hardware (something that both PC and console gaming require). 194 | 195 | 58. Apps 196 | 59. Games 197 | 60. Browser plugins 198 | 61. Website themes (WordPress, for example, powers 60% of the internet’s CMSs) 199 | 62. Setup for online stores, blogs, websites 200 | 63. Selling domains 201 | 64. Hosting 202 | 65. Zapier templates 203 | 66. Code snippets 204 | 205 | **Your time/knowledge:** 206 | 207 | If you are very knowledgeable in certain topics, chances are there are people who want to learn from you. There are many ways to facilitate this sort of knowledge transfer online. At the same time, there are plenty of ways to sell your time online. Here are some ways you can do that. 208 | 209 | [Eli Prinsen](https://sellfy.com/eliprinsenshvt) is a vocal trainer, who has begun to offer vocal lessons online. Why limit yourself to typical in-person lessons, when we have all of the technologies available at hand? 210 | 211 | 212 | 213 | There are so many more ways to leverage your skills to sell online. Here are some of them: 214 | 215 | 67. Language lessons 216 | 68. Financial consultations 217 | 69. Financial planning 218 | 70. Coaching/mentoring sessions 219 | 71. Tutoring 220 | 72. Resume touchups 221 | 73. Essay-writing services 222 | 74. Translations 223 | 75. Social media marketing 224 | 76. User testing 225 | 77. Proofreading 226 | 78. Editing 227 | 79. Audits (accounting audits, content audits, etc.) 228 | 80. Career consultations 229 | 230 | **Miscellaneous:** 231 | 232 | And then there are the things that don’t belong in a category but are viable products to sell online. It just goes to show, the sky’s the limit. 233 | 234 | Say, you’ve got the wisdom on a subject, but you don’t want the one-on-one communication that you get when teaching lessons. 235 | 236 | In that case, **sell courses online**. Package your knowledge into a pre-made product that people can download online. The difference from online lessons is that you don’t need to be there personally. 237 | 238 | So what is it that you need to sell courses online? 239 | 240 | Start by creating valuable content on a subject you know a lot about. Try to give it **a special spin** so that you stand out among all the other online mentors – there’s definitely plenty out there! Say, you’re a barista who can make mean latte art, as well as love porcupines. Use that skill, and create your latte art training course that teaches porcupine drawings. Cute and unique. 241 | 242 | What’s even better – there’s plenty of course formats, so pick a form that lets you use your other creative skills. If you’re great at public speaking, [create courses on YouTube](https://blog.sellfy.com/10-creative-ways-to-make-money-as-a-youtuber-that-isnt-ads/). If you’re better at the written word, pass on your knowledge in the form of an ebook course. 243 | 244 | Take these [health and self-love courses](https://sellfy.com/collections/health-fitness/), for example. 245 | 246 | 247 | 248 | 81. Courses – of any and all kinds 249 | 82. Sewing patterns 250 | 83. Knitting patterns 251 | 84. Architectural plans 252 | 85. Nutrition plans 253 | 86. Meal-prep plans 254 | 87. Workout plans 255 | 88. Custom vacation/travel planning 256 | 89. Virtual assisting 257 | 90. Worksheets (educational curriculum ideas) 258 | 91. Paid newsletters 259 | 92. Woodworking instructions – step-by-step tutorials 260 | 93. Custom beauty/style/skincare consultations 261 | 94. Drawing lessons – step-by-step 262 | 95. Board game printouts 263 | 96. Astrology readings 264 | 97. Car/equipment repair manuals 265 | 98. Meditation/subliminal programs 266 | 99. Stock market analysis software 267 | 100. Minecraft skins/renders 268 | 101. Painting tutorials 269 | 270 | Taking the leap is the hardest part 271 | 272 | Starting to sell products online may be daunting, but deciding on the product is the hardest part – it just gets easier from here. All it takes it choosing a product from this list, putting together the digital assets, and then launching your store. 273 | 274 | So whether you’re looking to create some supplementary income, or launch a full-fledged online business, you’ve come to the right place. Good luck to you! 275 | 276 | 277 | 278 | [Julia Gifford](https://blog.sellfy.com/author/julia/) 279 | 280 | --- 281 | 282 | > Source: https://blog.sellfy.com/101-digital-products-you-can-sell-online/ 283 | -------------------------------------------------------------------------------- /test/check/enex/advanced.enex/101 Profitable Digital Products You Can Sell Online in 2019 ǀ Sellfy.md.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "101 Profitable Digital Products You Can Sell Online in 2019 ǀ Sellfy", 3 | "tags": [], 4 | "attachments": [ 5 | "ef65974a15ea0999467aaeaa6cbf57b1.png", 6 | "sellfy-sell-photos-videos.png", 7 | "63e0fcd3f9cd6e5d750090eff62c7cb7.png", 8 | "d7e3fe3d006aac524f81f07e29c2f146.png", 9 | "e662d8bea23d8731f4087de149413764.png", 10 | "sellfy-sell-digital-products.png", 11 | "5c17861184980e91478d2fc900cd1250.png", 12 | "b1c17c5301df0cc245e51d8f10fb73c9.png", 13 | "a17028f2ede85851876da5a97f3a1972.png", 14 | "65aad53291466d837ef05df1594e24fd.png", 15 | "9f5f3d57972619b029490dabc63e9017", 16 | "8f00670edae87eff5f20de7bb02d3918.jpeg", 17 | "101-digital-products-768x384.png", 18 | "5a54b9eb5533a8559f73038ad16cc70a.png", 19 | "sellfy-sell-presets-luts.png", 20 | "f525a11c2b824a5e76105d51906a0b0e.png", 21 | "decap.png", 22 | "49f8dd7a14d8dd06d2014c1ae5f6f8e8.png", 23 | "80d5044f528a68ca3985ec179edc4ad0.png" 24 | ], 25 | "deleted": false, 26 | "favorited": false, 27 | "pinned": false, 28 | "created": "[VALID_DATE]", 29 | "modified": "[VALID_DATE]", 30 | "sourceUrl": "https://blog.sellfy.com/101-digital-products-you-can-sell-online/" 31 | } 32 | -------------------------------------------------------------------------------- /test/check/enex/advanced.enex/101-digital-products-768x384.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/notable/dumper/80b2ccbe4a3a70e57d269d789126375506ba504e/test/check/enex/advanced.enex/101-digital-products-768x384.png -------------------------------------------------------------------------------- /test/check/enex/advanced.enex/101-digital-products-768x384.png.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "101-digital-products-768x384.png", 3 | "created": "[VALID_DATE]", 4 | "modified": "[VALID_DATE]", 5 | "mime": "image/png" 6 | } 7 | -------------------------------------------------------------------------------- /test/check/enex/advanced.enex/49f8dd7a14d8dd06d2014c1ae5f6f8e8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/notable/dumper/80b2ccbe4a3a70e57d269d789126375506ba504e/test/check/enex/advanced.enex/49f8dd7a14d8dd06d2014c1ae5f6f8e8.png -------------------------------------------------------------------------------- /test/check/enex/advanced.enex/49f8dd7a14d8dd06d2014c1ae5f6f8e8.png.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "49f8dd7a14d8dd06d2014c1ae5f6f8e8.png", 3 | "created": "[VALID_DATE]", 4 | "modified": "[VALID_DATE]", 5 | "mime": "image/png" 6 | } 7 | -------------------------------------------------------------------------------- /test/check/enex/advanced.enex/5a54b9eb5533a8559f73038ad16cc70a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/notable/dumper/80b2ccbe4a3a70e57d269d789126375506ba504e/test/check/enex/advanced.enex/5a54b9eb5533a8559f73038ad16cc70a.png -------------------------------------------------------------------------------- /test/check/enex/advanced.enex/5a54b9eb5533a8559f73038ad16cc70a.png.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "5a54b9eb5533a8559f73038ad16cc70a.png", 3 | "created": "[VALID_DATE]", 4 | "modified": "[VALID_DATE]", 5 | "mime": "image/png" 6 | } 7 | -------------------------------------------------------------------------------- /test/check/enex/advanced.enex/5c17861184980e91478d2fc900cd1250.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/notable/dumper/80b2ccbe4a3a70e57d269d789126375506ba504e/test/check/enex/advanced.enex/5c17861184980e91478d2fc900cd1250.png -------------------------------------------------------------------------------- /test/check/enex/advanced.enex/5c17861184980e91478d2fc900cd1250.png.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "5c17861184980e91478d2fc900cd1250.png", 3 | "created": "[VALID_DATE]", 4 | "modified": "[VALID_DATE]", 5 | "mime": "image/png" 6 | } 7 | -------------------------------------------------------------------------------- /test/check/enex/advanced.enex/63e0fcd3f9cd6e5d750090eff62c7cb7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/notable/dumper/80b2ccbe4a3a70e57d269d789126375506ba504e/test/check/enex/advanced.enex/63e0fcd3f9cd6e5d750090eff62c7cb7.png -------------------------------------------------------------------------------- /test/check/enex/advanced.enex/63e0fcd3f9cd6e5d750090eff62c7cb7.png.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "63e0fcd3f9cd6e5d750090eff62c7cb7.png", 3 | "created": "[VALID_DATE]", 4 | "modified": "[VALID_DATE]", 5 | "mime": "image/png" 6 | } 7 | -------------------------------------------------------------------------------- /test/check/enex/advanced.enex/65aad53291466d837ef05df1594e24fd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/notable/dumper/80b2ccbe4a3a70e57d269d789126375506ba504e/test/check/enex/advanced.enex/65aad53291466d837ef05df1594e24fd.png -------------------------------------------------------------------------------- /test/check/enex/advanced.enex/65aad53291466d837ef05df1594e24fd.png.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "65aad53291466d837ef05df1594e24fd.png", 3 | "created": "[VALID_DATE]", 4 | "modified": "[VALID_DATE]", 5 | "mime": "image/png" 6 | } 7 | -------------------------------------------------------------------------------- /test/check/enex/advanced.enex/80d5044f528a68ca3985ec179edc4ad0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/notable/dumper/80b2ccbe4a3a70e57d269d789126375506ba504e/test/check/enex/advanced.enex/80d5044f528a68ca3985ec179edc4ad0.png -------------------------------------------------------------------------------- /test/check/enex/advanced.enex/80d5044f528a68ca3985ec179edc4ad0.png.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "80d5044f528a68ca3985ec179edc4ad0.png", 3 | "created": "[VALID_DATE]", 4 | "modified": "[VALID_DATE]", 5 | "mime": "image/png" 6 | } 7 | -------------------------------------------------------------------------------- /test/check/enex/advanced.enex/8f00670edae87eff5f20de7bb02d3918.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/notable/dumper/80b2ccbe4a3a70e57d269d789126375506ba504e/test/check/enex/advanced.enex/8f00670edae87eff5f20de7bb02d3918.jpeg -------------------------------------------------------------------------------- /test/check/enex/advanced.enex/8f00670edae87eff5f20de7bb02d3918.jpeg.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "8f00670edae87eff5f20de7bb02d3918.jpeg", 3 | "created": "[VALID_DATE]", 4 | "modified": "[VALID_DATE]", 5 | "mime": "image/jpeg" 6 | } 7 | -------------------------------------------------------------------------------- /test/check/enex/advanced.enex/9f5f3d57972619b029490dabc63e9017: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/notable/dumper/80b2ccbe4a3a70e57d269d789126375506ba504e/test/check/enex/advanced.enex/9f5f3d57972619b029490dabc63e9017 -------------------------------------------------------------------------------- /test/check/enex/advanced.enex/9f5f3d57972619b029490dabc63e9017.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "9f5f3d57972619b029490dabc63e9017", 3 | "created": "[VALID_DATE]", 4 | "modified": "[VALID_DATE]", 5 | "mime": "image/jpeg" 6 | } 7 | -------------------------------------------------------------------------------- /test/check/enex/advanced.enex/a17028f2ede85851876da5a97f3a1972.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/notable/dumper/80b2ccbe4a3a70e57d269d789126375506ba504e/test/check/enex/advanced.enex/a17028f2ede85851876da5a97f3a1972.png -------------------------------------------------------------------------------- /test/check/enex/advanced.enex/a17028f2ede85851876da5a97f3a1972.png.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "a17028f2ede85851876da5a97f3a1972.png", 3 | "created": "[VALID_DATE]", 4 | "modified": "[VALID_DATE]", 5 | "mime": "image/png" 6 | } 7 | -------------------------------------------------------------------------------- /test/check/enex/advanced.enex/b1c17c5301df0cc245e51d8f10fb73c9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/notable/dumper/80b2ccbe4a3a70e57d269d789126375506ba504e/test/check/enex/advanced.enex/b1c17c5301df0cc245e51d8f10fb73c9.png -------------------------------------------------------------------------------- /test/check/enex/advanced.enex/b1c17c5301df0cc245e51d8f10fb73c9.png.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "b1c17c5301df0cc245e51d8f10fb73c9.png", 3 | "created": "[VALID_DATE]", 4 | "modified": "[VALID_DATE]", 5 | "mime": "image/png" 6 | } 7 | -------------------------------------------------------------------------------- /test/check/enex/advanced.enex/d7e3fe3d006aac524f81f07e29c2f146.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/notable/dumper/80b2ccbe4a3a70e57d269d789126375506ba504e/test/check/enex/advanced.enex/d7e3fe3d006aac524f81f07e29c2f146.png -------------------------------------------------------------------------------- /test/check/enex/advanced.enex/d7e3fe3d006aac524f81f07e29c2f146.png.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "d7e3fe3d006aac524f81f07e29c2f146.png", 3 | "created": "[VALID_DATE]", 4 | "modified": "[VALID_DATE]", 5 | "mime": "image/png" 6 | } 7 | -------------------------------------------------------------------------------- /test/check/enex/advanced.enex/decap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/notable/dumper/80b2ccbe4a3a70e57d269d789126375506ba504e/test/check/enex/advanced.enex/decap.png -------------------------------------------------------------------------------- /test/check/enex/advanced.enex/decap.png.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "decap.png", 3 | "created": "[VALID_DATE]", 4 | "modified": "[VALID_DATE]", 5 | "mime": "image/png" 6 | } 7 | -------------------------------------------------------------------------------- /test/check/enex/advanced.enex/e662d8bea23d8731f4087de149413764.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/notable/dumper/80b2ccbe4a3a70e57d269d789126375506ba504e/test/check/enex/advanced.enex/e662d8bea23d8731f4087de149413764.png -------------------------------------------------------------------------------- /test/check/enex/advanced.enex/e662d8bea23d8731f4087de149413764.png.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "e662d8bea23d8731f4087de149413764.png", 3 | "created": "[VALID_DATE]", 4 | "modified": "[VALID_DATE]", 5 | "mime": "image/png" 6 | } 7 | -------------------------------------------------------------------------------- /test/check/enex/advanced.enex/ef65974a15ea0999467aaeaa6cbf57b1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/notable/dumper/80b2ccbe4a3a70e57d269d789126375506ba504e/test/check/enex/advanced.enex/ef65974a15ea0999467aaeaa6cbf57b1.png -------------------------------------------------------------------------------- /test/check/enex/advanced.enex/ef65974a15ea0999467aaeaa6cbf57b1.png.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ef65974a15ea0999467aaeaa6cbf57b1.png", 3 | "created": "[VALID_DATE]", 4 | "modified": "[VALID_DATE]", 5 | "mime": "image/png" 6 | } 7 | -------------------------------------------------------------------------------- /test/check/enex/advanced.enex/f525a11c2b824a5e76105d51906a0b0e.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/notable/dumper/80b2ccbe4a3a70e57d269d789126375506ba504e/test/check/enex/advanced.enex/f525a11c2b824a5e76105d51906a0b0e.png -------------------------------------------------------------------------------- /test/check/enex/advanced.enex/f525a11c2b824a5e76105d51906a0b0e.png.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "f525a11c2b824a5e76105d51906a0b0e.png", 3 | "created": "[VALID_DATE]", 4 | "modified": "[VALID_DATE]", 5 | "mime": "image/png" 6 | } 7 | -------------------------------------------------------------------------------- /test/check/enex/advanced.enex/sellfy-sell-digital-products.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/notable/dumper/80b2ccbe4a3a70e57d269d789126375506ba504e/test/check/enex/advanced.enex/sellfy-sell-digital-products.png -------------------------------------------------------------------------------- /test/check/enex/advanced.enex/sellfy-sell-digital-products.png.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "sellfy-sell-digital-products.png", 3 | "created": "[VALID_DATE]", 4 | "modified": "[VALID_DATE]", 5 | "mime": "image/png" 6 | } 7 | -------------------------------------------------------------------------------- /test/check/enex/advanced.enex/sellfy-sell-photos-videos.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/notable/dumper/80b2ccbe4a3a70e57d269d789126375506ba504e/test/check/enex/advanced.enex/sellfy-sell-photos-videos.png -------------------------------------------------------------------------------- /test/check/enex/advanced.enex/sellfy-sell-photos-videos.png.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "sellfy-sell-photos-videos.png", 3 | "created": "[VALID_DATE]", 4 | "modified": "[VALID_DATE]", 5 | "mime": "image/png" 6 | } 7 | -------------------------------------------------------------------------------- /test/check/enex/advanced.enex/sellfy-sell-presets-luts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/notable/dumper/80b2ccbe4a3a70e57d269d789126375506ba504e/test/check/enex/advanced.enex/sellfy-sell-presets-luts.png -------------------------------------------------------------------------------- /test/check/enex/advanced.enex/sellfy-sell-presets-luts.png.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "sellfy-sell-presets-luts.png", 3 | "created": "[VALID_DATE]", 4 | "modified": "[VALID_DATE]", 5 | "mime": "image/png" 6 | } 7 | -------------------------------------------------------------------------------- /test/check/enex/sample.enex/Evernote 20180719 19꞉38꞉29.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/notable/dumper/80b2ccbe4a3a70e57d269d789126375506ba504e/test/check/enex/sample.enex/Evernote 20180719 19꞉38꞉29.wav -------------------------------------------------------------------------------- /test/check/enex/sample.enex/Evernote 20180719 19꞉38꞉29.wav.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Evernote 20180719 19꞉38꞉29.wav", 3 | "created": "[VALID_DATE]", 4 | "modified": "[VALID_DATE]", 5 | "mime": "audio/wav" 6 | } 7 | -------------------------------------------------------------------------------- /test/check/enex/sample.enex/Evernote Formatting.md: -------------------------------------------------------------------------------- 1 | # Evernote Formatting 2 | 3 | ### **TEXT** 4 | 5 | Text 9 6 | 7 | Text 10 8 | 9 | Text 11 10 | 11 | Text 12 12 | 13 | Text 13 14 | 15 | Text 14 16 | 17 | Text 18 18 | 19 | ### Text 24 20 | 21 | ## Text 36 22 | 23 | # Text 48 24 | 25 | # Text 64 26 | 27 | # Text 72 28 | 29 | ### **STYLE** 30 | 31 | **Bold** 32 | 33 | _Italic_ 34 | 35 | Underlined 36 | 37 | Colored 38 | 39 | Highlighted 40 | 41 | `Code` 42 | 43 | ``` 44 | Multiline 45 | 46 | Code 47 | 48 | Block 49 | ``` 50 | 51 | ### ### **_Mixed_** 52 | 53 | ### **LISTS** 54 | 55 | - Bullet list 56 | 57 | - Bullet list 58 | 59 | 1. Numbered list 60 | 61 | 2. Numbered list 62 | 63 | ### **FORM** 64 | 65 | - [x] Checked 66 | 67 | --- 68 | 69 | ### **ALIGNMENT** 70 | 71 | Left 72 | 73 |

Center

74 | 75 |

Right

76 | 77 |

Justify

78 | 79 | ### **ATTACHMENTS** 80 | -------------------------------------------------------------------------------- /test/check/enex/sample.enex/Evernote Formatting.md.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Evernote Formatting", 3 | "tags": [ 4 | "Evernote", 5 | "Formatting", 6 | "Test" 7 | ], 8 | "attachments": [ 9 | "Evernote 20180719 19꞉38꞉29.wav", 10 | "Screen Shot 2018-07-19 at 19.38.48.png", 11 | "acc3a2cbf534f95977005ab76e1727af.png" 12 | ], 13 | "deleted": false, 14 | "favorited": false, 15 | "pinned": false, 16 | "created": "[VALID_DATE]", 17 | "modified": "[VALID_DATE]" 18 | } 19 | -------------------------------------------------------------------------------- /test/check/enex/sample.enex/Screen Shot 2018-07-19 at 19.38.48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/notable/dumper/80b2ccbe4a3a70e57d269d789126375506ba504e/test/check/enex/sample.enex/Screen Shot 2018-07-19 at 19.38.48.png -------------------------------------------------------------------------------- /test/check/enex/sample.enex/Screen Shot 2018-07-19 at 19.38.48.png.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Screen Shot 2018-07-19 at 19.38.48.png", 3 | "created": "[VALID_DATE]", 4 | "modified": "[VALID_DATE]", 5 | "mime": "image/png" 6 | } 7 | -------------------------------------------------------------------------------- /test/check/enex/sample.enex/acc3a2cbf534f95977005ab76e1727af.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/notable/dumper/80b2ccbe4a3a70e57d269d789126375506ba504e/test/check/enex/sample.enex/acc3a2cbf534f95977005ab76e1727af.png -------------------------------------------------------------------------------- /test/check/enex/sample.enex/acc3a2cbf534f95977005ab76e1727af.png.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "acc3a2cbf534f95977005ab76e1727af.png", 3 | "created": "[VALID_DATE]", 4 | "modified": "[VALID_DATE]", 5 | "mime": "image/png" 6 | } 7 | -------------------------------------------------------------------------------- /test/check/html/infer_title_heading.html/Title.md: -------------------------------------------------------------------------------- 1 | # Title 2 | -------------------------------------------------------------------------------- /test/check/html/infer_title_heading.html/Title.md.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Title", 3 | "tags": [], 4 | "attachments": [], 5 | "deleted": false, 6 | "favorited": false, 7 | "pinned": false, 8 | "created": "[VALID_DATE]", 9 | "modified": "[VALID_DATE]" 10 | } 11 | -------------------------------------------------------------------------------- /test/check/html/infer_title_title.html/Title.md: -------------------------------------------------------------------------------- 1 | # Title 2 | -------------------------------------------------------------------------------- /test/check/html/infer_title_title.html/Title.md.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Title", 3 | "tags": [], 4 | "attachments": [], 5 | "deleted": false, 6 | "favorited": false, 7 | "pinned": false, 8 | "created": "[VALID_DATE]", 9 | "modified": "[VALID_DATE]" 10 | } 11 | -------------------------------------------------------------------------------- /test/check/html/no_head.html/no_head.md: -------------------------------------------------------------------------------- 1 | # no_head 2 | 3 | Foo 4 | -------------------------------------------------------------------------------- /test/check/html/no_head.html/no_head.md.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "no_head", 3 | "tags": [], 4 | "attachments": [], 5 | "deleted": false, 6 | "favorited": false, 7 | "pinned": false, 8 | "created": "[VALID_DATE]", 9 | "modified": "[VALID_DATE]" 10 | } 11 | -------------------------------------------------------------------------------- /test/check/html/sample.html/Title.md: -------------------------------------------------------------------------------- 1 | # Title 2 | 3 | ### **TEXT** 4 | 5 | Text 9 6 | 7 | Text 10 8 | 9 | Text 11 10 | 11 | Text 12 12 | 13 | Text 13 14 | 15 | Text 14 16 | 17 | Text 18 18 | 19 | ### Text 24 20 | 21 | ## Text 36 22 | 23 | # Text 48 24 | 25 | # Text 64 26 | 27 | # Text 72 28 | 29 | ### **STYLE** 30 | 31 | **Bold** 32 | 33 | **Bold (Alt)** 34 | 35 | **Bold (Alt2)** 36 | 37 | _Italic_ 38 | 39 | _Italic (Alt)_ 40 | 41 | _Italic (Alt2)_ 42 | 43 | ~~Strikethrough~~ 44 | 45 | ~~Strikethrough (Alt)~~ 46 | 47 | ~~Strikethrough (Alt2)~~ 48 | 49 | Underlined 50 | 51 | Underlined (Alt) 52 | 53 | Colored 54 | 55 | Highlighted 56 | 57 | Subscript~example~ 58 | 59 | Superscript^example^ 60 | 61 | `Code` 62 | 63 | ``` 64 | Multiline 65 | Code 66 | Block 67 | ``` 68 | 69 | ### Mixed 70 | 71 | ### **LISTS** 72 | 73 | - Bullet list 74 | - Bullet list 75 | 76 | 1. Numbered list 77 | 2. Numbered list 78 | 79 | ### **FORM** 80 | 81 | - [ ] Unchecked 82 | - [x] Checked 83 | 84 | --- 85 | 86 | ### **ALIGNMENT** 87 | 88 | Left 89 | 90 |

Center

91 | 92 |

Right

93 | 94 |

Justify

95 | -------------------------------------------------------------------------------- /test/check/html/sample.html/Title.md.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Title", 3 | "tags": [], 4 | "attachments": [], 5 | "deleted": false, 6 | "favorited": false, 7 | "pinned": false, 8 | "created": "[VALID_DATE]", 9 | "modified": "[VALID_DATE]" 10 | } 11 | -------------------------------------------------------------------------------- /test/check/markdown/infer_title_heading.md/Title.md: -------------------------------------------------------------------------------- 1 | Paragraph 2 | 3 | ### Title 4 | -------------------------------------------------------------------------------- /test/check/markdown/infer_title_heading.md/Title.md.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Title", 3 | "tags": [], 4 | "attachments": [], 5 | "deleted": false, 6 | "favorited": false, 7 | "pinned": false, 8 | "created": "[VALID_DATE]", 9 | "modified": "[VALID_DATE]" 10 | } 11 | -------------------------------------------------------------------------------- /test/check/markdown/infer_title_path.md/infer_title_path.md: -------------------------------------------------------------------------------- 1 | Paragraph 2 | -------------------------------------------------------------------------------- /test/check/markdown/infer_title_path.md/infer_title_path.md.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "infer_title_path", 3 | "tags": [], 4 | "attachments": [], 5 | "deleted": false, 6 | "favorited": false, 7 | "pinned": false, 8 | "created": "[VALID_DATE]", 9 | "modified": "[VALID_DATE]" 10 | } 11 | -------------------------------------------------------------------------------- /test/check/markdown/sample.md/Title.md: -------------------------------------------------------------------------------- 1 | # Title 2 | 3 | ### **TEXT** 4 | 5 | Text 9 6 | 7 | Text 10 8 | 9 | Text 11 10 | 11 | Text 12 12 | 13 | Text 13 14 | 15 | Text 14 16 | 17 | Text 18 18 | 19 | ### Text 24 20 | 21 | ## Text 36 22 | 23 | # Text 48 24 | 25 | # Text 64 26 | 27 | # Text 72 28 | 29 | ### **STYLE** 30 | 31 | **Bold** 32 | 33 | _Italic_ 34 | 35 | Underlined 36 | 37 | Colored 38 | 39 | Highlighted 40 | 41 | `Code` 42 | 43 | ``` 44 | Multiline 45 | 46 | Code 47 | 48 | Block 49 | ``` 50 | 51 | ### ### **_Mixed_** 52 | 53 | ### **LISTS** 54 | 55 | - Bullet list 56 | 57 | - Bullet list 58 | 59 | 1. Numbered list 60 | 61 | 2. Numbered list 62 | 63 | ### **FORM** 64 | 65 | - [ ] Unchecked 66 | - [x] Checked 67 | 68 | --- 69 | 70 | ### **ALIGNMENT** 71 | 72 | Left 73 | 74 |

Center

75 | 76 |

Right

77 | 78 |

Justify

79 | 80 | ### **ATTACHMENTS** 81 | -------------------------------------------------------------------------------- /test/check/markdown/sample.md/Title.md.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Title", 3 | "tags": [], 4 | "attachments": [], 5 | "deleted": false, 6 | "favorited": false, 7 | "pinned": false, 8 | "created": "[VALID_DATE]", 9 | "modified": "[VALID_DATE]" 10 | } 11 | -------------------------------------------------------------------------------- /test/index.js: -------------------------------------------------------------------------------- 1 | 2 | /* IMPORT */ 3 | 4 | import domino from 'domino'; 5 | import fs from 'node:fs'; 6 | import path from 'node:path'; 7 | import process from 'node:process'; 8 | import diff from 'test-diff'; 9 | import parseArgv from 'tiny-parse-argv'; 10 | import U8 from 'uint8-encoding'; 11 | import Dumper from '../dist/index.js'; 12 | 13 | /* VARIABLES */ 14 | 15 | const ARGV = parseArgv ( process.argv.slice ( 2 ) ); 16 | const OUTPUT = path.join ( process.cwd (), 'test', 'output' ); 17 | const SOURCE = path.join ( process.cwd (), 'test', 'source' ); 18 | const CHECK = path.join ( process.cwd (), 'test', 'check' ); 19 | 20 | /* DOM PARSER */ 21 | 22 | class DOMParser { 23 | parseFromString ( str ) { 24 | return domino.createWindow ( str ).document; 25 | } 26 | } 27 | 28 | /* MAKE */ 29 | 30 | const make = source => { 31 | return Dumper.dump ({ 32 | DOMParser, 33 | source: path.join ( SOURCE, source ), 34 | dump ( note ) { 35 | function replaceDates ( obj ) { // They make the tests harder to pass unnecessarily 36 | if ( obj.created && !isNaN ( obj.created.getTime () ) ) obj.created = '[VALID_DATE]'; 37 | if ( obj.modified && !isNaN ( obj.modified.getTime () ) ) obj.modified = '[VALID_DATE]'; 38 | } 39 | function replaceAttachments ( obj ) { // No point in writing the buffer in the metadata 40 | if ( obj.attachments ) obj.attachments = obj.attachments.map ( attachment => attachment.metadata.name ); 41 | } 42 | fs.mkdirSync ( path.join ( OUTPUT, source ), { recursive: true } ); 43 | fs.writeFileSync ( path.join ( OUTPUT, source, `${note.metadata.title}.md` ), `${U8.decode ( note.content )}\n` ); 44 | const noteMetadata = { ...note.metadata }; 45 | replaceAttachments ( noteMetadata ); 46 | replaceDates ( noteMetadata ); 47 | fs.writeFileSync ( path.join ( OUTPUT, source, `${note.metadata.title}.md.json` ), `${JSON.stringify ( noteMetadata, undefined, 2 )}\n` ); 48 | note.metadata.attachments.forEach ( attachment => { 49 | replaceDates ( attachment.metadata ); 50 | fs.writeFileSync ( path.join ( OUTPUT, source, `${attachment.metadata.name}` ), attachment.content ); 51 | fs.writeFileSync ( path.join ( OUTPUT, source, `${attachment.metadata.name}.json` ), `${JSON.stringify ( attachment.metadata, undefined, 2 )}\n` ); 52 | }); 53 | } 54 | }) 55 | }; 56 | 57 | /* DIFF */ 58 | 59 | process.env.IS_TEST = true; 60 | 61 | const GLOB_PROVIDER = ARGV.provider ? `${ARGV.provider}` : '*'; 62 | const GLOB_FILE = ARGV.file ? `${ARGV.file}` : '*'; 63 | 64 | diff ({ 65 | source: { 66 | cwd: SOURCE, 67 | glob: `${GLOB_PROVIDER}/*.*` 68 | }, 69 | output: { 70 | cwd: OUTPUT, 71 | make 72 | }, 73 | check: { 74 | cwd: CHECK, 75 | glob: `${GLOB_PROVIDER}/${GLOB_FILE}/*` 76 | } 77 | }); 78 | -------------------------------------------------------------------------------- /test/source/boostnote/attachments/e3d07544-e04d-434c-b0aa-3f223b55160e/d1cbe242.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/notable/dumper/80b2ccbe4a3a70e57d269d789126375506ba504e/test/source/boostnote/attachments/e3d07544-e04d-434c-b0aa-3f223b55160e/d1cbe242.png -------------------------------------------------------------------------------- /test/source/boostnote/sample.cson: -------------------------------------------------------------------------------- 1 | createdAt: "2019-07-21T21:35:09.873Z" 2 | updatedAt: "2019-07-21T21:36:14.300Z" 3 | type: "MARKDOWN_NOTE" 4 | folder: "7340857075fc2685d1cb" 5 | title: "Title" 6 | content: ''' 7 | # Title 8 | 9 | ### **TEXT** 10 | 11 | Text 9 12 | 13 | Text 10 14 | 15 | Text 11 16 | 17 | Text 12 18 | 19 | Text 13 20 | 21 | Text 14 22 | 23 | Text 18 24 | 25 | ### Text 24 26 | 27 | ## Text 36 28 | 29 | # Text 48 30 | 31 | # Text 64 32 | 33 | # Text 72 34 | 35 | ### **STYLE** 36 | 37 | **Bold** 38 | 39 | _Italic_ 40 | 41 | Underlined 42 | 43 | Colored 44 | 45 | Highlighted 46 | 47 | `Code` 48 | 49 | ``` 50 | Multiline 51 | 52 | Code 53 | 54 | Block 55 | ``` 56 | 57 | ### ### **_Mixed_** 58 | 59 | ### **LISTS** 60 | 61 | - Bullet list 62 | 63 | - Bullet list 64 | 65 | 1. Numbered list 66 | 67 | 2. Numbered list 68 | 69 | ### **FORM** 70 | 71 | - [ ] Unchecked 72 | - [x] Checked 73 | 74 | --- 75 | 76 | ### **ALIGNMENT** 77 | 78 | Left 79 | 80 |

Center

81 | 82 |

Right

83 | 84 |

Justify

85 | 86 | ### **ATTACHMENTS** 87 | 88 | ![d1cbe242.png](:storage/e3d07544-e04d-434c-b0aa-3f223b55160e/d1cbe242.png) 89 | ''' 90 | tags: ["Foo"] 91 | isStarred: true 92 | isTrashed: true 93 | linesHighlighted: [] 94 | -------------------------------------------------------------------------------- /test/source/enex/sample.enex: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Evernote Formatting
TEXT
Text 9
Text 10
Text 11
Text 12
Text 13
Text 14
Text 18
Text 24
Text 36
Text 48
Text 64
Text 72

STYLE
Bold
Italic
Underlined
Colored
Highlighted
Code
Multiline
Code
Block
Mixed

LISTS
  • Bullet list
  • Bullet list
  1. Numbered list
  2. Numbered list

FORM 
Unchecked
Checked



ALIGNMENT
Left
Center
Right
Justify

ATTACHMENTS



]]>
20180719T172437Z20180729T230800ZEvernoteFormattingTestFabio Spampinatodesktop.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 88 | chw3cmYCNJLcRpIpALaRHEmSKABIkiRJkgA=audio/wav00019700101T000000ZEvernote 20180719 19:38:29.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 130 | +l8Hl6cub17hsmLLSuJK4crbq3xW7SlTL8sv61w9cXXNGuaa4jVv185Ye7ncqXzrOso66br29eHr6zaY 131 | bli54fNG/sZbFf4VBzfpbVq26f1m7ubrW3y3HNiqv7Vk66dtgm13todsr6k0ryzfQdyRt6N7Z/zOi7+5 132 | /Va1S3dXya4vu4W72/dE7zlX5VpVtVdv74pqtFpa3bNv6r6W/YH76w7YHth+kHGw5BA4JD30/Pfk328f 133 | DjvceMTtyIGjZkc3HaMfK65BambX9NXya9vrEutaj0843ljvWX/sj7F/7G4waqg4oXVixUnKycKTg6fy 134 | T/WfFp3uPZN2prNxRuP9s5PP3jw36Vzz+bDzly4EXzh70e/iqUtelxoue1w+fsXtSu1Vl6s1Tc5Nx/50 135 | /vNYs0tzzTXXa3Ut7i31reNbT173uX7mRuCNCzdZN6/eirjVejvu9p22qW3td7h3nt3NvPvqXt69gfsL 136 | HxAeFD9Ue1j+SO9R5b+s/nWw3aX9REdgR9PjmMf3OzmdL55InnzuKuymdZc/NXxa9czhWUNPcE/L8ynP 137 | u16IXgz0Fv2l/teml5Yvj/7t+3dT3+S+rlfiV4OvS9/ovNn91ultY39U/6N3We8G3hd/0Pmw56Pbx4uf 138 | Ej49HZj5mfR5/RerL/Vfw74+GMwaHBSxxWz5pwAGG5qaCsDr3QDQEuG3QwsAlCmKs5lcEMV5Uk7gP7Hi 139 | /CYXFwB2+wIQtxCAcPiNsgU2M8hUeJd9gsf6AtTRcaQNiSTV0UHhiwpPLIQPg4Nv9AEg1QPwRTw4OLB5 140 | cPDLThjsXQBO5yjOhDKRnUG36cioqU0N/Cj/BlX4cCQ34sPtAAAACXBIWXMAABYlAAAWJQFJUiTwAAAB 141 | nWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRh 142 | LyIgeDp4bXB0az0iWE1QIENvcmUgNS40LjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93 143 | d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9u 144 | IHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4 145 | aWYvMS4wLyI+CiAgICAgICAgIDxleGlmOlBpeGVsWERpbWVuc2lvbj43NDg8L2V4aWY6UGl4ZWxYRGlt 146 | ZW5zaW9uPgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24+MTc4PC9leGlmOlBpeGVsWURpbWVu 147 | c2lvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CkyX 148 | E1EAAAAcaURPVAAAAAIAAAAAAAAAWQAAACgAAABZAAAAWQAAUR6i8cSgAABAAElEQVR4Aex9DVxUVfr/ 149 | N1HQVclQNMVV0EQhUzBFfClTFJOkFV8w09aXDK0ftK3otmRF6Cq5Sdsmf1/IVHpV8q1QfEvLMhWzFctE 150 | 8Q1JNAJNAcMZxf7PvXfuvefO3IFhYAawc/rE3Hten/M9Z8bvec5znnNXx44dfwcPTkNg+PDhYltZWVlO 151 | a5M3xBHgCHAEOAIcAY4AR8ARCAQEBIjV7tixwxHV8zpNCNzFCbtz5wIn7M7Fm7fGEeAIcAQ4AhwBjoDj 152 | EOCE3XHYsjVzws6i4YRnTtidADJvgiPAEeAIcAQ4AhwBpyDACbtTYAYn7M7BWWmFE3YFCv7AEeAIcAQ4 153 | AhwBjkA9R4ATducMICfszsFZaYUTdgUK/sAR4AhwBDgCHAGOQD1HgBN25wwgJ+zOwVlphRN2BQr+wBHg 154 | CHAEOAIcAY5APUeAE3bnDCAn7M7BWWmFE3YFCv7AEeAIcAQ4AhwBjkA9R4ATducMICfszsFZaYUTdgUK 155 | /sAR4AhwBDgCHAGOQD1HgBN25wwgJ+zOwVlpRSbsSgR/4AhwBDgCHAGOAEeAI1DPEeB+2B07gJywOxZf 156 | i9o5YbeAhEdwBDgCHAGOAEeAI1DPEeCE3bEDyAm7Y/G1qL1NmzYWcRVFFBQUVJTM0zgCHAGOAEeAI8AR 157 | 4AhwBO5wBDhhd/IAc8LuZMB5c5UiEDh2Gh5q2ww/n/0aaVuPVJqfZ+AICAh4BERi0kP3wlh6GstXZ3BQ 158 | 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image/png7481780 860 | 861 | requireI lodashI ? ?I IodashI ledashI ladashI todashI tadashI leashloda shlnda shliloiiiomattermatter=matterequire'gray-matter'gray-mattermatter Imatter ? 1matter ? Imatter,matter'matter]matte rImatter{html[HTML(HTML{html:html:html,html.-,._html.è html.è html,beautifyHTML}beautifyHlML}beautifyHTMLbeaut ? fyHlML}beaut ifyHTML}beatifyHTML}beaut HyHTML}beautHyHTML}beautifyHML}require'js-beautify'beautify'beautify,beautify ?beautify.beautifybeautify!iiLiiI.turndownrequire'turndown'turndown1 turn down,l turn down,1 turn down.l turn down.. turn down,1 turn dawn,l turn dawn,MatterMatteHatterMatter=require'./matter'./matter'/matter'l matter,J matter,f matter,1 matter,. latter,l matter!iilixnconstcanstconcanstcastcost]]>19700101T000000ZunknownScreen Shot 2018-07-19 at 19.38.48.png
862 |
863 | -------------------------------------------------------------------------------- /test/source/html/infer_title_heading.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |

Title

5 | 6 | 7 | -------------------------------------------------------------------------------- /test/source/html/infer_title_title.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Title 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /test/source/html/no_head.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |

Foo

5 | 6 | 7 |

Foo

8 | 9 | 10 | -------------------------------------------------------------------------------- /test/source/html/sample.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |

Title

5 |

TEXT

6 |

Text 9

7 |

Text 10

8 |

Text 11

9 |

Text 12

10 |

Text 13

11 |

Text 14

12 |

Text 18

13 |

Text 24

14 |

Text 36

15 |

Text 48

16 |

Text 64

17 |

Text 72

18 |

STYLE

19 |

Bold

20 |

Bold (Alt)

21 |

Bold (Alt2)

22 |

Italic

23 |

Italic (Alt)

24 |

Italic (Alt2)

25 |

Strikethrough

26 |

Strikethrough (Alt)

27 |

Strikethrough (Alt2)

28 |

Underlined

29 |

Underlined (Alt)

30 |

Colored

31 |

Highlighted

32 |

Subscriptexample

33 |

Superscriptexample

34 |

Code

35 |
Multiline
36 | Code
37 | Block
38 |

Mixed

39 |

LISTS

40 |
    41 |
  • Bullet list
  • 42 |
  • Bullet list
  • 43 |
44 |
    45 |
  1. Numbered list
  2. 46 |
  3. Numbered list
  4. 47 |
48 |

FORM

49 | Unchecked 50 |
51 | Checked 52 |
53 |

ALIGNMENT

54 |
Left
55 |
Center
56 |
Right
57 |
Justify
58 | 59 | 60 | -------------------------------------------------------------------------------- /test/source/markdown/infer_title_heading.md: -------------------------------------------------------------------------------- 1 | Paragraph 2 | 3 | ### Title 4 | -------------------------------------------------------------------------------- /test/source/markdown/infer_title_path.md: -------------------------------------------------------------------------------- 1 | Paragraph 2 | -------------------------------------------------------------------------------- /test/source/markdown/sample.md: -------------------------------------------------------------------------------- 1 | # Title 2 | 3 | ### **TEXT** 4 | 5 | Text 9 6 | 7 | Text 10 8 | 9 | Text 11 10 | 11 | Text 12 12 | 13 | Text 13 14 | 15 | Text 14 16 | 17 | Text 18 18 | 19 | ### Text 24 20 | 21 | ## Text 36 22 | 23 | # Text 48 24 | 25 | # Text 64 26 | 27 | # Text 72 28 | 29 | ### **STYLE** 30 | 31 | **Bold** 32 | 33 | _Italic_ 34 | 35 | Underlined 36 | 37 | Colored 38 | 39 | Highlighted 40 | 41 | `Code` 42 | 43 | ``` 44 | Multiline 45 | 46 | Code 47 | 48 | Block 49 | ``` 50 | 51 | ### ### **_Mixed_** 52 | 53 | ### **LISTS** 54 | 55 | - Bullet list 56 | 57 | - Bullet list 58 | 59 | 1. Numbered list 60 | 61 | 2. Numbered list 62 | 63 | ### **FORM** 64 | 65 | - [ ] Unchecked 66 | - [x] Checked 67 | 68 | --- 69 | 70 | ### **ALIGNMENT** 71 | 72 | Left 73 | 74 |

Center

75 | 76 |

Right

77 | 78 |

Justify

79 | 80 | ### **ATTACHMENTS** 81 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "tsex/tsconfig.json", 3 | "compilerOptions": { 4 | "noImplicitReturns": false, 5 | "noUnusedParameters": false 6 | } 7 | } 8 | --------------------------------------------------------------------------------