From ed7283f23b503688984312d2d1cf167967a86c96 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Wed, 9 Dec 2015 14:18:26 -0800 Subject: [PATCH 1/9] 1.4.0-beta0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 50e4d4d09..9dc73dc24 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "atom", "productName": "Atom", - "version": "1.4.0-dev", + "version": "1.4.0-beta0", "description": "A hackable text editor for the 21st Century.", "main": "./src/browser/main.js", "repository": { From 9a2c3a49e79a65b67cd512446190d9b09830a5aa Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Thu, 10 Dec 2015 10:00:56 +0100 Subject: [PATCH 2/9] Expose a isCjkCharacter text utility --- spec/text-utils-spec.coffee | 20 ++++++++++++++++++++ src/text-utils.coffee | 7 ++++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/spec/text-utils-spec.coffee b/spec/text-utils-spec.coffee index dd528b37e..f4438cf8d 100644 --- a/spec/text-utils-spec.coffee +++ b/spec/text-utils-spec.coffee @@ -74,3 +74,23 @@ describe 'text utilities', -> expect(textUtils.isKoreanCharacter("ㄼ")).toBe(true) expect(textUtils.isKoreanCharacter("O")).toBe(false) + + describe ".isCjkCharacter(character)", -> + it "returns true when the character is either a korean, half-width or double-width character", -> + expect(textUtils.isCjkCharacter("我")).toBe(true) + expect(textUtils.isCjkCharacter("私")).toBe(true) + expect(textUtils.isCjkCharacter("B")).toBe(true) + expect(textUtils.isCjkCharacter(",")).toBe(true) + expect(textUtils.isCjkCharacter("¢")).toBe(true) + expect(textUtils.isCjkCharacter("ハ")).toBe(true) + expect(textUtils.isCjkCharacter("ヒ")).toBe(true) + expect(textUtils.isCjkCharacter("ᆲ")).toBe(true) + expect(textUtils.isCjkCharacter("■")).toBe(true) + expect(textUtils.isCjkCharacter("우")).toBe(true) + expect(textUtils.isCjkCharacter("가")).toBe(true) + expect(textUtils.isCjkCharacter("ㅢ")).toBe(true) + expect(textUtils.isCjkCharacter("ㄼ")).toBe(true) + + expect(textUtils.isDoubleWidthCharacter("a")).toBe(false) + expect(textUtils.isDoubleWidthCharacter("O")).toBe(false) + expect(textUtils.isDoubleWidthCharacter("z")).toBe(false) diff --git a/src/text-utils.coffee b/src/text-utils.coffee index 82bed4da5..3f283cfa3 100644 --- a/src/text-utils.coffee +++ b/src/text-utils.coffee @@ -89,6 +89,11 @@ isKoreanCharacter = (character) -> 0xA960 <= charCode <= 0xA97F or 0xD7B0 <= charCode <= 0xD7FF +isCjkCharacter = (character) -> + isDoubleWidthCharacter(character) or + isHalfWidthCharacter(character) or + isKoreanCharacter(character) + # Does the given string contain at least surrogate pair, variation sequence, # or combined character? # @@ -102,4 +107,4 @@ hasPairedCharacter = (string) -> index++ false -module.exports = {isPairedCharacter, hasPairedCharacter, isDoubleWidthCharacter, isHalfWidthCharacter, isKoreanCharacter} +module.exports = {isPairedCharacter, hasPairedCharacter, isDoubleWidthCharacter, isHalfWidthCharacter, isKoreanCharacter, isCjkCharacter} From 3253c0d5cd22467360e4deb1579e0f251ae83c2f Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Thu, 10 Dec 2015 10:07:45 +0100 Subject: [PATCH 3/9] Don't rely on spaces to test korean characters' width behavior --- spec/display-buffer-spec.coffee | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/spec/display-buffer-spec.coffee b/spec/display-buffer-spec.coffee index a54c01198..fc2c76503 100644 --- a/spec/display-buffer-spec.coffee +++ b/spec/display-buffer-spec.coffee @@ -88,13 +88,13 @@ describe "DisplayBuffer", -> describe "when there are korean characters", -> it "takes them into account when finding the soft wrap column", -> displayBuffer.setDefaultCharWidth(1, 0, 0, 10) - buffer.setText("1234세계를 향한 대화, 유니코 제10회유니코드국제") + buffer.setText("1234세계를향한대화,유니코제10회유니코드국제") - expect(displayBuffer.tokenizedLineForScreenRow(0).text).toBe("1234세계를 ") - expect(displayBuffer.tokenizedLineForScreenRow(1).text).toBe("향한 대화, ") - expect(displayBuffer.tokenizedLineForScreenRow(2).text).toBe("유니코 ") - expect(displayBuffer.tokenizedLineForScreenRow(3).text).toBe("제10회유니") - expect(displayBuffer.tokenizedLineForScreenRow(4).text).toBe("코드국제") + expect(displayBuffer.tokenizedLineForScreenRow(0).text).toBe("1234세계를향") + expect(displayBuffer.tokenizedLineForScreenRow(1).text).toBe("한대화,유") + expect(displayBuffer.tokenizedLineForScreenRow(2).text).toBe("니코제10회") + expect(displayBuffer.tokenizedLineForScreenRow(3).text).toBe("유니코드국") + expect(displayBuffer.tokenizedLineForScreenRow(4).text).toBe("제") describe "when editor.softWrapAtPreferredLineLength is set", -> it "uses the preferred line length as the soft wrap column when it is less than the configured soft wrap column", -> From c22cae451bb05532b510317f3572b47ec8d5fb59 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Thu, 10 Dec 2015 10:18:24 +0100 Subject: [PATCH 4/9] Wrap line at boundary if it includes a CJK character --- spec/display-buffer-spec.coffee | 6 ++++++ src/tokenized-line.coffee | 9 ++++++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/spec/display-buffer-spec.coffee b/spec/display-buffer-spec.coffee index fc2c76503..10df357e3 100644 --- a/spec/display-buffer-spec.coffee +++ b/spec/display-buffer-spec.coffee @@ -130,6 +130,12 @@ describe "DisplayBuffer", -> expect(displayBuffer.tokenizedLineForScreenRow(10).text).toBe ' return ' expect(displayBuffer.tokenizedLineForScreenRow(11).text).toBe ' sort(left).concat(pivot).concat(sort(right));' + it "wraps the line at the boundary if it includes a CJK character", -> + buffer.setTextInRange([[0, 0], [1, 0]], 'abcd efg유私フ业余爱\n') + displayBuffer.setEditorWidthInChars(10) + expect(displayBuffer.tokenizedLineForScreenRow(0).text).toBe 'abcd efg유私' + expect(displayBuffer.tokenizedLineForScreenRow(1).text).toBe 'フ业余爱' + describe "when there is no whitespace before the boundary", -> it "wraps the line exactly at the boundary since there's no more graceful place to wrap it", -> buffer.setTextInRange([[0, 0], [1, 0]], 'abcdefghijklmnopqrstuvwxyz\n') diff --git a/src/tokenized-line.coffee b/src/tokenized-line.coffee index 2a27d3f12..2ff4c3b17 100644 --- a/src/tokenized-line.coffee +++ b/src/tokenized-line.coffee @@ -1,5 +1,5 @@ _ = require 'underscore-plus' -{isPairedCharacter} = require './text-utils' +{isPairedCharacter, isCjkCharacter} = require './text-utils' Token = require './token' {SoftTab, HardTab, PairedCharacter, SoftWrapIndent} = require './special-token-symbols' @@ -321,8 +321,11 @@ class TokenizedLine return unless maxColumn? return unless @text.length > maxColumn - if /\s/.test(@text[maxColumn]) - # search forward for the start of a word past the boundary + if isCjkCharacter(@text[maxColumn]) + # always wrap when a CJK character is at the wrap boundary + return maxColumn + else if /\s/.test(@text[maxColumn]) + # search forward for the start of a word past the boundary for column in [maxColumn..@text.length] return column if /\S/.test(@text[column]) From 173fbba02b8504f473c27fbcd7cc4d593ebace24 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Fri, 11 Dec 2015 14:26:51 +0100 Subject: [PATCH 5/9] Wrap at the first CJK character before the boundary --- spec/display-buffer-spec.coffee | 17 ++++++++++++++--- src/tokenized-line.coffee | 10 +++++----- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/spec/display-buffer-spec.coffee b/spec/display-buffer-spec.coffee index 10df357e3..8c4adca44 100644 --- a/spec/display-buffer-spec.coffee +++ b/spec/display-buffer-spec.coffee @@ -130,14 +130,25 @@ describe "DisplayBuffer", -> expect(displayBuffer.tokenizedLineForScreenRow(10).text).toBe ' return ' expect(displayBuffer.tokenizedLineForScreenRow(11).text).toBe ' sort(left).concat(pivot).concat(sort(right));' - it "wraps the line at the boundary if it includes a CJK character", -> - buffer.setTextInRange([[0, 0], [1, 0]], 'abcd efg유私フ业余爱\n') + it "wraps the line at the first CJK character before the boundary", -> displayBuffer.setEditorWidthInChars(10) + + buffer.setTextInRange([[0, 0], [1, 0]], 'abcd efg유私フ业余爱\n') expect(displayBuffer.tokenizedLineForScreenRow(0).text).toBe 'abcd efg유私' expect(displayBuffer.tokenizedLineForScreenRow(1).text).toBe 'フ业余爱' + buffer.setTextInRange([[0, 0], [1, 0]], 'abcd ef유gef业余爱\n') + expect(displayBuffer.tokenizedLineForScreenRow(0).text).toBe 'abcd ef유' + expect(displayBuffer.tokenizedLineForScreenRow(1).text).toBe 'gef业余爱' + describe "when there is no whitespace before the boundary", -> - it "wraps the line exactly at the boundary since there's no more graceful place to wrap it", -> + it "wraps the line at the first CJK character before the boundary", -> + buffer.setTextInRange([[0, 0], [1, 0]], '私たちのabcdefghij\n') + displayBuffer.setEditorWidthInChars(10) + expect(displayBuffer.tokenizedLineForScreenRow(0).text).toBe '私たちの' + expect(displayBuffer.tokenizedLineForScreenRow(1).text).toBe 'abcdefghij' + + it "wraps the line exactly at the boundary when no CJK character is found, since there's no more graceful place to wrap it", -> buffer.setTextInRange([[0, 0], [1, 0]], 'abcdefghijklmnopqrstuvwxyz\n') displayBuffer.setEditorWidthInChars(10) expect(displayBuffer.tokenizedLineForScreenRow(0).text).toBe 'abcdefghij' diff --git a/src/tokenized-line.coffee b/src/tokenized-line.coffee index 2ff4c3b17..36802c2f7 100644 --- a/src/tokenized-line.coffee +++ b/src/tokenized-line.coffee @@ -321,19 +321,19 @@ class TokenizedLine return unless maxColumn? return unless @text.length > maxColumn - if isCjkCharacter(@text[maxColumn]) - # always wrap when a CJK character is at the wrap boundary - return maxColumn - else if /\s/.test(@text[maxColumn]) + if /\s/.test(@text[maxColumn]) # search forward for the start of a word past the boundary for column in [maxColumn..@text.length] return column if /\S/.test(@text[column]) return @text.length + else if isCjkCharacter(@text[maxColumn]) + maxColumn else # search backward for the start of the word on the boundary for column in [maxColumn..@firstNonWhitespaceIndex] - return column + 1 if /\s/.test(@text[column]) + if /\s/.test(@text[column]) or isCjkCharacter(@text[column]) + return column + 1 return maxColumn From 12376039a9ad43664f4da62fb06e1e5e3625493a Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Fri, 11 Dec 2015 14:28:26 +0100 Subject: [PATCH 6/9] :art: cjk -> CJK --- spec/text-utils-spec.coffee | 28 ++++++++++++++-------------- src/text-utils.coffee | 8 ++++---- src/tokenized-line.coffee | 6 +++--- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/spec/text-utils-spec.coffee b/spec/text-utils-spec.coffee index f4438cf8d..aa36c5003 100644 --- a/spec/text-utils-spec.coffee +++ b/spec/text-utils-spec.coffee @@ -75,21 +75,21 @@ describe 'text utilities', -> expect(textUtils.isKoreanCharacter("O")).toBe(false) - describe ".isCjkCharacter(character)", -> + describe ".isCJKCharacter(character)", -> it "returns true when the character is either a korean, half-width or double-width character", -> - expect(textUtils.isCjkCharacter("我")).toBe(true) - expect(textUtils.isCjkCharacter("私")).toBe(true) - expect(textUtils.isCjkCharacter("B")).toBe(true) - expect(textUtils.isCjkCharacter(",")).toBe(true) - expect(textUtils.isCjkCharacter("¢")).toBe(true) - expect(textUtils.isCjkCharacter("ハ")).toBe(true) - expect(textUtils.isCjkCharacter("ヒ")).toBe(true) - expect(textUtils.isCjkCharacter("ᆲ")).toBe(true) - expect(textUtils.isCjkCharacter("■")).toBe(true) - expect(textUtils.isCjkCharacter("우")).toBe(true) - expect(textUtils.isCjkCharacter("가")).toBe(true) - expect(textUtils.isCjkCharacter("ㅢ")).toBe(true) - expect(textUtils.isCjkCharacter("ㄼ")).toBe(true) + expect(textUtils.isCJKCharacter("我")).toBe(true) + expect(textUtils.isCJKCharacter("私")).toBe(true) + expect(textUtils.isCJKCharacter("B")).toBe(true) + expect(textUtils.isCJKCharacter(",")).toBe(true) + expect(textUtils.isCJKCharacter("¢")).toBe(true) + expect(textUtils.isCJKCharacter("ハ")).toBe(true) + expect(textUtils.isCJKCharacter("ヒ")).toBe(true) + expect(textUtils.isCJKCharacter("ᆲ")).toBe(true) + expect(textUtils.isCJKCharacter("■")).toBe(true) + expect(textUtils.isCJKCharacter("우")).toBe(true) + expect(textUtils.isCJKCharacter("가")).toBe(true) + expect(textUtils.isCJKCharacter("ㅢ")).toBe(true) + expect(textUtils.isCJKCharacter("ㄼ")).toBe(true) expect(textUtils.isDoubleWidthCharacter("a")).toBe(false) expect(textUtils.isDoubleWidthCharacter("O")).toBe(false) diff --git a/src/text-utils.coffee b/src/text-utils.coffee index 3f283cfa3..ce8fc864a 100644 --- a/src/text-utils.coffee +++ b/src/text-utils.coffee @@ -60,7 +60,7 @@ isPairedCharacter = (string, index=0) -> isJapaneseCharacter = (charCode) -> 0x3000 <= charCode <= 0x30FF -isCjkUnifiedIdeograph = (charCode) -> +isCJKUnifiedIdeograph = (charCode) -> 0x4E00 <= charCode <= 0x9FAF isFullWidthForm = (charCode) -> @@ -71,7 +71,7 @@ isDoubleWidthCharacter = (character) -> charCode = character.charCodeAt(0) isJapaneseCharacter(charCode) or - isCjkUnifiedIdeograph(charCode) or + isCJKUnifiedIdeograph(charCode) or isFullWidthForm(charCode) isHalfWidthCharacter = (character) -> @@ -89,7 +89,7 @@ isKoreanCharacter = (character) -> 0xA960 <= charCode <= 0xA97F or 0xD7B0 <= charCode <= 0xD7FF -isCjkCharacter = (character) -> +isCJKCharacter = (character) -> isDoubleWidthCharacter(character) or isHalfWidthCharacter(character) or isKoreanCharacter(character) @@ -107,4 +107,4 @@ hasPairedCharacter = (string) -> index++ false -module.exports = {isPairedCharacter, hasPairedCharacter, isDoubleWidthCharacter, isHalfWidthCharacter, isKoreanCharacter, isCjkCharacter} +module.exports = {isPairedCharacter, hasPairedCharacter, isDoubleWidthCharacter, isHalfWidthCharacter, isKoreanCharacter, isCJKCharacter} diff --git a/src/tokenized-line.coffee b/src/tokenized-line.coffee index 36802c2f7..c97a621ac 100644 --- a/src/tokenized-line.coffee +++ b/src/tokenized-line.coffee @@ -1,5 +1,5 @@ _ = require 'underscore-plus' -{isPairedCharacter, isCjkCharacter} = require './text-utils' +{isPairedCharacter, isCJKCharacter} = require './text-utils' Token = require './token' {SoftTab, HardTab, PairedCharacter, SoftWrapIndent} = require './special-token-symbols' @@ -327,12 +327,12 @@ class TokenizedLine return column if /\S/.test(@text[column]) return @text.length - else if isCjkCharacter(@text[maxColumn]) + else if isCJKCharacter(@text[maxColumn]) maxColumn else # search backward for the start of the word on the boundary for column in [maxColumn..@firstNonWhitespaceIndex] - if /\s/.test(@text[column]) or isCjkCharacter(@text[column]) + if /\s/.test(@text[column]) or isCJKCharacter(@text[column]) return column + 1 return maxColumn From e16430accd7071266168b5562e33f1ee844f99c8 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Mon, 14 Dec 2015 11:58:05 +0100 Subject: [PATCH 7/9] :art: Extend isCJKUnifiedIdeograph charset --- src/text-utils.coffee | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/text-utils.coffee b/src/text-utils.coffee index ce8fc864a..af17335aa 100644 --- a/src/text-utils.coffee +++ b/src/text-utils.coffee @@ -57,11 +57,11 @@ isPairedCharacter = (string, index=0) -> isVariationSequence(charCodeA, charCodeB) or isCombinedCharacter(charCodeA, charCodeB) -isJapaneseCharacter = (charCode) -> +IsJapaneseKanaCharacter = (charCode) -> 0x3000 <= charCode <= 0x30FF isCJKUnifiedIdeograph = (charCode) -> - 0x4E00 <= charCode <= 0x9FAF + 0x4E00 <= charCode <= 0x9FFF isFullWidthForm = (charCode) -> 0xFF01 <= charCode <= 0xFF5E or @@ -70,7 +70,7 @@ isFullWidthForm = (charCode) -> isDoubleWidthCharacter = (character) -> charCode = character.charCodeAt(0) - isJapaneseCharacter(charCode) or + IsJapaneseKanaCharacter(charCode) or isCJKUnifiedIdeograph(charCode) or isFullWidthForm(charCode) From c1644452261b9e946d3843095cc81d16ab088482 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Tue, 15 Dec 2015 13:16:50 -0700 Subject: [PATCH 8/9] 1.4.0-beta1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9dc73dc24..1dffe045b 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "atom", "productName": "Atom", - "version": "1.4.0-beta0", + "version": "1.4.0-beta1", "description": "A hackable text editor for the 21st Century.", "main": "./src/browser/main.js", "repository": { From bef2dd0f277e0b701fddb9c710c7cae380eafa45 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Tue, 15 Dec 2015 13:17:05 -0700 Subject: [PATCH 9/9] :arrow_up: fuzzy-finder --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1dffe045b..6c9ab62e7 100644 --- a/package.json +++ b/package.json @@ -88,7 +88,7 @@ "encoding-selector": "0.21.0", "exception-reporting": "0.37.0", "find-and-replace": "0.194.0", - "fuzzy-finder": "0.93.0", + "fuzzy-finder": "0.94.0", "git-diff": "0.57.0", "go-to-line": "0.30.0", "grammar-selector": "0.48.0",