mirror of
https://github.com/BoostIo/Boostnote
synced 2025-12-12 17:26:17 +00:00
103 lines
2.8 KiB
JavaScript
103 lines
2.8 KiB
JavaScript
const http = require('http')
|
|
const https = require('https')
|
|
const { createTurndownService } = require('../../../lib/turndown')
|
|
const createNote = require('./createNote')
|
|
|
|
import { push } from 'connected-react-router'
|
|
import ee from 'browser/main/lib/eventEmitter'
|
|
|
|
function validateUrl(str) {
|
|
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
|
|
)
|
|
) {
|
|
return true
|
|
} else {
|
|
return false
|
|
}
|
|
}
|
|
|
|
const ERROR_MESSAGES = {
|
|
ENOTFOUND:
|
|
'URL not found. Please check the URL, or your internet connection and try again.',
|
|
VALIDATION_ERROR:
|
|
'Please check if the URL follows this format: https://www.google.com',
|
|
UNEXPECTED: 'Unexpected error! Please check console for details!'
|
|
}
|
|
|
|
function createNoteFromUrl(
|
|
url,
|
|
storage,
|
|
folder,
|
|
dispatch = null,
|
|
location = null
|
|
) {
|
|
return new Promise((resolve, reject) => {
|
|
const td = createTurndownService()
|
|
|
|
if (!validateUrl(url)) {
|
|
reject({ result: false, error: ERROR_MESSAGES.VALIDATION_ERROR })
|
|
}
|
|
|
|
const request = url.startsWith('https') ? https : http
|
|
|
|
const req = request.request(url, res => {
|
|
let data = ''
|
|
|
|
res.on('data', chunk => {
|
|
data += chunk
|
|
})
|
|
|
|
res.on('end', () => {
|
|
const markdownHTML = td.turndown(data)
|
|
|
|
if (dispatch !== null) {
|
|
createNote(storage, {
|
|
type: 'MARKDOWN_NOTE',
|
|
folder: folder,
|
|
title: '',
|
|
content: markdownHTML
|
|
}).then(note => {
|
|
const noteHash = note.key
|
|
dispatch({
|
|
type: 'UPDATE_NOTE',
|
|
note: note
|
|
})
|
|
dispatch(
|
|
push({
|
|
pathname: location.pathname,
|
|
query: { key: noteHash }
|
|
})
|
|
)
|
|
ee.emit('list:jump', noteHash)
|
|
ee.emit('detail:focus')
|
|
resolve({ result: true, error: null })
|
|
})
|
|
} else {
|
|
createNote(storage, {
|
|
type: 'MARKDOWN_NOTE',
|
|
folder: folder,
|
|
title: '',
|
|
content: markdownHTML
|
|
}).then(note => {
|
|
resolve({ result: true, note, error: null })
|
|
})
|
|
}
|
|
})
|
|
})
|
|
|
|
req.on('error', e => {
|
|
console.error('error in parsing URL', e)
|
|
reject({
|
|
result: false,
|
|
error: ERROR_MESSAGES[e.code] || ERROR_MESSAGES.UNEXPECTED
|
|
})
|
|
})
|
|
|
|
req.end()
|
|
})
|
|
}
|
|
|
|
module.exports = createNoteFromUrl
|