Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(112)

Side by Side Diff: charted/lib/core/text_metrics/segmentation.dart

Issue 1400473008: Roll Observatory packages and add a roll script (Closed) Base URL: git@github.com:dart-lang/observatory_pub_packages.git@master
Patch Set: Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 //
2 // Copyright 2014 Google Inc. All rights reserved.
3 //
4 // Use of this source code is governed by a BSD-style
5 // license that can be found in the LICENSE file or at
6 // https://developers.google.com/open-source/licenses/bsd
7 //
8
9 library charted.core.text_metrics.segmentation;
10
11 import "package:charted/core/text_metrics/segmentation_utils.dart";
12 import "package:charted/core/text_metrics/segmentation_data.dart";
13
14 /// Current unicode version.
15 /// Character database available at http://www.unicode.org/Public/7.0.0/ucd/
16 const UNICODE_VERSION = '7.0.0';
17
18 // Code table based on:
19 // http://www.unicode.org/Public/7.0.0/ucd/auxiliary/GraphemeBreakTest.html
20 // GRAPHEME_BREAK_TABLE[prevType * TYPE_COUNT + curType] == 1 means break.
21 const GRAPHEME_BREAK_TABLE = const[
22 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1,
23 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
24 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
25 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
26 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1,
27 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1,
28 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1,
29 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1,
30 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1,
31 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1,
32 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1,
33 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0
34 ];
35
36 /// Get type of a given char code.
37 int _typeForRune(int rune) {
38 int count = CODE_POINT_BLOCKS.length ~/ 3;
39 int min = 0;
40 int max = count - 1;
41 while (max >= min) {
42 int mid = (max + min) ~/ 2;
43 int idx = mid * 3;
44 if (CODE_POINT_BLOCKS[idx] <= rune && rune <= CODE_POINT_BLOCKS[idx+1]) {
45 return CODE_POINT_BLOCKS[idx+2]; // Return the found character type
46 }
47 if (CODE_POINT_BLOCKS[idx] > rune) {
48 max = mid - 1;
49 }
50 else if (CODE_POINT_BLOCKS[idx+1] < rune) {
51 min = max + 1;
52 }
53 }
54 return CODE_CATEGORY_OTHER; // Defaults to OTHER.
55 }
56
57 Iterable<int> graphemeBreakIndices(String s) {
58 List<int> indices = [];
59 int previousType = 0;
60 for (var iter = s.runes.iterator; iter.moveNext();) {
61 int currentType = _typeForRune(iter.current);
62 if (GRAPHEME_BREAK_TABLE[previousType * 12 + currentType] == 1) {
63 indices.add(iter.rawIndex);
64 }
65 previousType = currentType;
66 }
67 return indices;
68 }
OLDNEW
« no previous file with comments | « charted/lib/core/text_metrics.dart ('k') | charted/lib/core/text_metrics/segmentation_data.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698