Skip to content
This repository was archived by the owner on May 12, 2026. It is now read-only.

Commit 7d3d96a

Browse files
authored
Merge pull request #1612 from kawmra/fix-title-decoding
Properly decoding for the title of pasted website
2 parents 96fbd75 + 4c99429 commit 7d3d96a

3 files changed

Lines changed: 32 additions & 1 deletion

File tree

browser/components/CodeEditor.js

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import copyImage from 'browser/main/lib/dataApi/copyImage'
88
import { findStorage } from 'browser/lib/findStorage'
99
import fs from 'fs'
1010
import eventEmitter from 'browser/main/lib/eventEmitter'
11+
import iconv from 'iconv-lite'
1112
const { ipcRenderer } = require('electron')
1213

1314
CodeMirror.modeURL = '../node_modules/codemirror/mode/%N/%N.js'
@@ -324,7 +325,7 @@ export default class CodeEditor extends React.Component {
324325
fetch(pastedTxt, {
325326
method: 'get'
326327
}).then((response) => {
327-
return (response.text())
328+
return this.decodeResponse(response)
328329
}).then((response) => {
329330
const parsedResponse = (new window.DOMParser()).parseFromString(response, 'text/html')
330331
const value = editor.getValue()
@@ -342,6 +343,31 @@ export default class CodeEditor extends React.Component {
342343
})
343344
}
344345

346+
decodeResponse (response) {
347+
const headers = response.headers
348+
const _charset = headers.has('content-type')
349+
? this.extractContentTypeCharset(headers.get('content-type'))
350+
: undefined
351+
return response.arrayBuffer().then((buff) => {
352+
return new Promise((resolve, reject) => {
353+
try {
354+
const charset = _charset !== undefined && iconv.encodingExists(_charset) ? _charset : 'utf-8'
355+
resolve(iconv.decode(new Buffer(buff), charset).toString())
356+
} catch (e) {
357+
reject(e)
358+
}
359+
})
360+
})
361+
}
362+
363+
extractContentTypeCharset (contentType) {
364+
return contentType.split(';').filter((str) => {
365+
return str.trim().toLowerCase().startsWith('charset')
366+
}).map((str) => {
367+
return str.replace(/['"]/g, '').split('=')[1]
368+
})[0]
369+
}
370+
345371
render () {
346372
const { className, fontSize } = this.props
347373
let fontFamily = this.props.fontFamily

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858
"electron-gh-releases": "^2.0.2",
5959
"flowchart.js": "^1.6.5",
6060
"font-awesome": "^4.3.0",
61+
"iconv-lite": "^0.4.19",
6162
"immutable": "^3.8.1",
6263
"js-sequence-diagrams": "^1000000.0.6",
6364
"katex": "^0.8.3",

yarn.lock

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3414,6 +3414,10 @@ iconv-lite@0.4.13, iconv-lite@~0.4.13:
34143414
version "0.4.13"
34153415
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2"
34163416

3417+
iconv-lite@^0.4.19:
3418+
version "0.4.19"
3419+
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b"
3420+
34173421
iconv-lite@~0.2.11:
34183422
version "0.2.11"
34193423
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.2.11.tgz#1ce60a3a57864a292d1321ff4609ca4bb965adc8"

0 commit comments

Comments
 (0)