Skip to content

Commit 18aae8c

Browse files
committed
getting very close
1 parent 4a9bc69 commit 18aae8c

File tree

6 files changed

+226
-77
lines changed

6 files changed

+226
-77
lines changed
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
const http = require('http')
2+
const https = require('https')
3+
const TurndownService = require('turndown')
4+
const createNote = require('./createNote')
5+
6+
import { hashHistory } from 'react-router'
7+
import ee from 'browser/main/lib/eventEmitter'
8+
9+
function validateUrl(str) {
10+
if(/^(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})).?)(?::\d{2,5})?(?:[/?#]\S*)?$/i.test(str)) {
11+
return true;
12+
} else {
13+
return false;
14+
}
15+
}
16+
17+
function createNoteFromUrl (url, storage, folder, dispatch = null, location = null) {
18+
return new Promise((resolve, reject) => {
19+
let td = new TurndownService();
20+
21+
if(!validateUrl(url)) {
22+
reject({result: false, error: "Please check your URL is in correct format. (Example, https://www.google.com)"})
23+
}
24+
25+
let request = http
26+
if(url.includes('https')) {
27+
request = https
28+
}
29+
30+
let req = request.request(url, (res) => {
31+
let data = ''
32+
33+
res.on('data', (chunk) => {
34+
data += chunk
35+
})
36+
37+
res.on('end', () => {
38+
let html = document.createElement('html')
39+
html.innerHTML = data
40+
41+
let scripts = html.getElementsByTagName('script')
42+
for(let i = scripts.length - 1; i >= 0; i--) {
43+
scripts[i].parentNode.removeChild(scripts[i])
44+
}
45+
46+
let body = html.getElementsByTagName('body')[0].innerHTML
47+
let markdownHTML = td.turndown(body)
48+
49+
html.innerHTML = ''
50+
51+
if(dispatch !== null) {
52+
createNote(storage, {
53+
type: 'MARKDOWN_NOTE',
54+
folder: folder,
55+
title: '',
56+
content: markdownHTML
57+
})
58+
.then((note) => {
59+
const noteHash = note.key
60+
dispatch({
61+
type: 'UPDATE_NOTE',
62+
note: note
63+
})
64+
hashHistory.push({
65+
pathname: location.pathname,
66+
query: {key: noteHash}
67+
})
68+
ee.emit('list:jump', noteHash)
69+
ee.emit('detail:focus')
70+
resolve({result: true, error: null})
71+
})
72+
} else {
73+
createNote(storage, {
74+
type: 'MARKDOWN_NOTE',
75+
folder: folder,
76+
title: '',
77+
content: markdownHTML
78+
}).then((note) => {
79+
resolve({result: true, error: null})
80+
})
81+
}
82+
})
83+
})
84+
85+
req.on('error', (e) => {
86+
console.error('error in parsing URL', e)
87+
reject({result: false, error: e})
88+
})
89+
req.end();
90+
})
91+
92+
}
93+
94+
module.exports = createNoteFromUrl;

browser/main/lib/dataApi/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ const dataApi = {
99
reorderFolder: require('./reorderFolder'),
1010
exportFolder: require('./exportFolder'),
1111
createNote: require('./createNote'),
12+
createNoteFromUrl: require('./createNoteFromUrl'),
1213
updateNote: require('./updateNote'),
1314
deleteNote: require('./deleteNote'),
1415
moveNote: require('./moveNote'),

browser/main/modals/CreateMarkdownFromURLModal.js

Lines changed: 9 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -8,22 +8,15 @@ import consts from 'browser/lib/consts'
88
import ModalEscButton from 'browser/components/ModalEscButton'
99
import AwsMobileAnalyticsConfig from 'browser/main/lib/AwsMobileAnalyticsConfig'
1010
import i18n from 'browser/lib/i18n'
11-
const http = require('http')
12-
const https = require('https')
13-
const TurndownService = require('turndown')
14-
import { hashHistory } from 'react-router'
15-
import ee from 'browser/main/lib/eventEmitter'
1611

1712
class CreateMarkdownFromURLModal extends React.Component {
1813
constructor (props) {
1914
super(props)
20-
let td = new TurndownService();
2115

2216
this.state = {
2317
name: '',
2418
showerror: false,
25-
errormessage: '',
26-
turndownService: td
19+
errormessage: ''
2720
}
2821

2922
}
@@ -60,87 +53,29 @@ class CreateMarkdownFromURLModal extends React.Component {
6053
this.confirm()
6154
}
6255

63-
showError(message) {
56+
showError (message) {
6457
this.setState({
6558
showerror: true,
6659
errormessage: message
6760
});
6861
}
6962

70-
hideError() {
63+
hideError () {
7164
this.setState({
7265
showerror: false,
7366
errormessage: ''
7467
})
7568
}
7669

77-
validateUrl(str) {
78-
if(/^(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})).?)(?::\d{2,5})?(?:[/?#]\S*)?$/i.test(str)) {
79-
return true;
80-
} else {
81-
return false;
82-
}
83-
}
84-
8570
confirm () {
86-
if(this.validateUrl(this.state.name)) {
8771
this.hideError()
88-
let url = this.state.name;
89-
let request = http;
90-
if(url.includes('https'))
91-
request = https;
92-
let req = request.request(url, (res) => {
93-
let data = '';
94-
res.on('data', (chunk) => {
95-
data += chunk
96-
})
97-
res.on('end', () => {
98-
console.log("receiving data", data);
99-
100-
let html = document.createElement('html');
101-
html.innerHTML = data;
102-
103-
let scripts = html.getElementsByTagName('script');
104-
for(let i = scripts.length - 1; i >= 0; i--) {
105-
scripts[i].parentNode.removeChild(scripts[i]);
106-
}
107-
108-
let body = html.getElementsByTagName('body')[0].innerHTML;
109-
let markdownHTML = this.state.turndownService.turndown(body);
110-
console.log('markdown', markdownHTML);
111-
html.innerHTML = '';
112-
const { storage, folder, dispatch, location } = this.props
113-
114-
dataApi
115-
.createNote(storage, {
116-
type: 'MARKDOWN_NOTE',
117-
folder: folder,
118-
title: '',
119-
content: markdownHTML
120-
})
121-
.then((note) => {
122-
const noteHash = note.key
123-
dispatch({
124-
type: 'UPDATE_NOTE',
125-
note: note
126-
})
127-
hashHistory.push({
128-
pathname: location.pathname,
129-
query: {key: noteHash}
130-
})
131-
ee.emit('list:jump', noteHash)
132-
ee.emit('detail:focus')
133-
this.props.close()
134-
})
135-
})
136-
});
137-
req.on('error', (e) => {
138-
console.log("Error in request", e.message);
72+
const { storage, folder, dispatch, location } = this.props
73+
74+
let note = dataApi.createNoteFromUrl(this.state.name, storage, folder, dispatch, location).then((result) => {
75+
this.props.close()
76+
}).catch((result) => {
77+
this.showError(result.error);
13978
});
140-
req.end();
141-
} else {
142-
this.showError("Please check your URL is in correct format. (Example, 'https://google.com')")
143-
}
14479
}
14580

14681
render () {
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
const test = require('ava')
2+
const createNoteFromUrl = require('browser/main/lib/dataApi/createNoteFromUrl')
3+
4+
global.document = require('jsdom').jsdom('<body></body>')
5+
global.window = document.defaultView
6+
global.navigator = window.navigator
7+
8+
const Storage = require('dom-storage')
9+
const localStorage = window.localStorage = global.localStorage = new Storage(null, { strict: true })
10+
const path = require('path')
11+
const TestDummy = require('../fixtures/TestDummy')
12+
const sander = require('sander')
13+
const os = require('os')
14+
const CSON = require('@rokt33r/season')
15+
const faker = require('faker')
16+
17+
const storagePath = path.join(os.tmpdir(), 'test/create-note-from-url')
18+
19+
test.beforeEach((t) => {
20+
t.context.storage = TestDummy.dummyStorage(storagePath)
21+
localStorage.setItem('storages', JSON.stringify([t.context.storage.cache]))
22+
})
23+
24+
test.serial('Create a note from URL', (t) => {
25+
const storageKey = t.context.storage.cache.key
26+
const folderKey = t.context.storage.json.folders[0].key
27+
28+
const url = 'https://shapeshed.com/writing-cross-platform-node/'
29+
30+
31+
return Promise.resolve()
32+
.then(function doTest () {
33+
return Promise.all([
34+
createNoteFromUrl(url, storageKey, folderKey)
35+
])
36+
})
37+
.then(function assert (data) {
38+
const data1 = data[0]
39+
40+
console.log("STORM LOOK HERE", data1)
41+
42+
t.is(storageKey, data1.storage)
43+
const jsonData2 = CSON.readFileSync(path.join(storagePath, 'notes', data1.key + '.cson'))
44+
t.is(input2.content, data2.content)
45+
t.is(input2.content, jsonData2.content)
46+
t.is(input2.tags.length, data2.tags.length)
47+
t.is(input2.tags.length, jsonData2.tags.length)
48+
})
49+
})
50+
51+
test.after(function after () {
52+
localStorage.clear()
53+
sander.rimrafSync(storagePath)
54+
})

tests/lib/html-to-md-test.js

Lines changed: 0 additions & 2 deletions
This file was deleted.

0 commit comments

Comments
 (0)