@plotdb/chart 0.0.2 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/dist/chart.js +18 -12
- package/dist/chart.min.js +1 -1
- package/dist/index.css +8 -0
- package/dist/index.js +609 -0
- package/dist/index.min.css +1 -0
- package/dist/index.min.js +1 -0
- package/dist/utils/axis.js +6 -0
- package/dist/utils/axis.min.js +1 -1
- package/package.json +22 -11
- package/CHANGELOG.md +0 -11
- package/build +0 -39
- package/doc/charts.md +0 -58
- package/doc/config.md +0 -44
- package/doc/draft/chart.md +0 -146
- package/doc/draft/data.md +0 -8
- package/doc/draft/definition.md +0 -0
- package/doc/draft/events.md +0 -0
- package/doc/draft/filter.md +0 -0
- package/doc/draft/lifecycle.md +0 -89
- package/doc/spec.md +0 -89
- package/doc/todo.md +0 -27
- package/doc/utils/tip.md +0 -84
- package/src/chart.ls +0 -320
- package/src/chart.styl +0 -6
- package/src/data/en-US/category +0 -20
- package/src/data/en-US/fruit +0 -39
- package/src/data/en-US/movie +0 -125
- package/src/data/en-US/name +0 -58
- package/src/data/index.ls +0 -34
- package/src/data/zh-TW/category +0 -20
- package/src/data/zh-TW/fruits +0 -38
- package/src/data/zh-TW/movie +0 -125
- package/src/data/zh-TW/names +0 -105
- package/src/utils/axis.ls +0 -229
- package/src/utils/config.ls +0 -11
- package/src/utils/data.ls +0 -104
- package/src/utils/format.ls +0 -30
- package/src/utils/legend.ls +0 -134
- package/src/utils/legend.styl +0 -37
- package/src/utils/tint.ls +0 -66
- package/src/utils/tip.ls +0 -97
- package/web/src/pug/base.pug +0 -19
- package/web/src/pug/block/axis/0.0.1/index.ls +0 -38
- package/web/src/pug/block/axis/0.0.1/index.pug +0 -1
- package/web/src/pug/block/axis-bubble/0.0.1/index.ls +0 -141
- package/web/src/pug/block/axis-bubble/0.0.1/index.pug +0 -1
- package/web/src/pug/block/bar/0.0.1/index.ls +0 -274
- package/web/src/pug/block/bar/0.0.1/index.pug +0 -35
- package/web/src/pug/block/bar-list/0.0.1/index.ls +0 -85
- package/web/src/pug/block/bar-list/0.0.1/index.pug +0 -30
- package/web/src/pug/block/bar-race/0.0.1/index.ls +0 -83
- package/web/src/pug/block/bar-race/0.0.1/index.pug +0 -21
- package/web/src/pug/block/base/0.0.1/index.ls +0 -67
- package/web/src/pug/block/base/0.0.1/index.pug +0 -5
- package/web/src/pug/block/blank/0.0.1/index.ls +0 -25
- package/web/src/pug/block/blank/0.0.1/index.pug +0 -1
- package/web/src/pug/block/bubble/0.0.1/index.ls +0 -220
- package/web/src/pug/block/bubble/0.0.1/index.pug +0 -28
- package/web/src/pug/block/curve-bar/0.0.1/index.ls +0 -89
- package/web/src/pug/block/curve-bar/0.0.1/index.pug +0 -16
- package/web/src/pug/block/curve-bar/0.0.1/sample.js +0 -338
- package/web/src/pug/block/dumbbell/0.0.1/index.ls +0 -90
- package/web/src/pug/block/dumbbell/0.0.1/index.pug +0 -1
- package/web/src/pug/block/empty/0.0.1/index.ls +0 -27
- package/web/src/pug/block/empty/0.0.1/index.pug +0 -2
- package/web/src/pug/block/gauge/0.0.1/index.ls +0 -100
- package/web/src/pug/block/gauge/0.0.1/index.pug +0 -31
- package/web/src/pug/block/gauge/0.0.1/sample.js +0 -338
- package/web/src/pug/block/line/0.0.1/index.ls +0 -265
- package/web/src/pug/block/line/0.0.1/index.pug +0 -33
- package/web/src/pug/block/number/0.0.1/index.ls +0 -69
- package/web/src/pug/block/number/0.0.1/index.pug +0 -20
- package/web/src/pug/block/percent-list/0.0.1/index.ls +0 -167
- package/web/src/pug/block/percent-list/0.0.1/index.pug +0 -34
- package/web/src/pug/block/pie/0.0.1/index.ls +0 -125
- package/web/src/pug/block/pie/0.0.1/index.pug +0 -19
- package/web/src/pug/block/pie/0.0.1/sample.js +0 -338
- package/web/src/pug/block/pie-bubble/0.0.1/index.ls +0 -185
- package/web/src/pug/block/pie-bubble/0.0.1/index.pug +0 -40
- package/web/src/pug/block/radar/0.0.1/index.ls +0 -113
- package/web/src/pug/block/radar/0.0.1/index.pug +0 -1
- package/web/src/pug/block/radar/0.0.1/xx +0 -285
- package/web/src/pug/block/scatter/0.0.1/index.ls +0 -128
- package/web/src/pug/block/scatter/0.0.1/index.pug +0 -30
- package/web/src/pug/block/sheet/0.0.1/index.ls +0 -38
- package/web/src/pug/block/sheet/0.0.1/index.pug +0 -5
- package/web/src/pug/block/table/0.0.1/index.ls +0 -40
- package/web/src/pug/block/table/0.0.1/index.pug +0 -3
- package/web/src/pug/block/taiwantown/0.0.1/index.ls +0 -48
- package/web/src/pug/block/taiwantown/0.0.1/index.pug +0 -52
- package/web/src/pug/block/taiwanvillage/0.0.1/index.ls +0 -53
- package/web/src/pug/block/taiwanvillage/0.0.1/index.pug +0 -52
- package/web/src/pug/block/treemap/0.0.1/index.ls +0 -172
- package/web/src/pug/block/treemap/0.0.1/index.pug +0 -42
- package/web/src/pug/block/voronoi-treemap/0.0.1/index.ls +0 -174
- package/web/src/pug/block/voronoi-treemap/0.0.1/index.pug +0 -17
- package/web/src/pug/block/voronoi-treemap/0.0.1/sample.js +0 -241
- package/web/src/pug/block/wordcloud/0.0.1/index.ls +0 -61
- package/web/src/pug/block/wordcloud/0.0.1/index.pug +0 -1
- package/web/src/pug/block/worldmap/0.0.1/index.ls +0 -83
- package/web/src/pug/block/worldmap/0.0.1/index.pug +0 -12
- package/web/src/pug/index.ls +0 -72
- package/web/src/pug/index.pug +0 -52
- package/web/src/styl/index.styl +0 -0
- package/web/static/assets/block/cache.js +0 -4
- package/web/static/assets/custom-lib/d3/d3-array.v2.min.js +0 -2
- package/web/static/assets/custom-lib/d3/d3-axis.v2.min.js +0 -2
- package/web/static/assets/custom-lib/d3/d3-brush.v2.min.js +0 -2
- package/web/static/assets/custom-lib/d3/d3-color.v2.min.js +0 -2
- package/web/static/assets/custom-lib/d3/d3-dispatch.v2.min.js +0 -2
- package/web/static/assets/custom-lib/d3/d3-drag.v2.min.js +0 -2
- package/web/static/assets/custom-lib/d3/d3-ease.v2.min.js +0 -2
- package/web/static/assets/custom-lib/d3/d3-force-boundary.v0.0.1.min.js +0 -2
- package/web/static/assets/custom-lib/d3/d3-force.v2.min.js +0 -2
- package/web/static/assets/custom-lib/d3/d3-format.v2.min.js +0 -2
- package/web/static/assets/custom-lib/d3/d3-hierarchy.v2.min.js +0 -2
- package/web/static/assets/custom-lib/d3/d3-interpolate.v2.min.js +0 -2
- package/web/static/assets/custom-lib/d3/d3-path.v2.min.js +0 -2
- package/web/static/assets/custom-lib/d3/d3-quadtree.v2.min.js +0 -2
- package/web/static/assets/custom-lib/d3/d3-random.v2.min.js +0 -2
- package/web/static/assets/custom-lib/d3/d3-scale-chromatic.v1.min.js +0 -2
- package/web/static/assets/custom-lib/d3/d3-selection.v2.min.js +0 -2
- package/web/static/assets/custom-lib/d3/d3-shape.v2.min.js +0 -2
- package/web/static/assets/custom-lib/d3/d3-timer.v2.min.js +0 -2
- package/web/static/assets/custom-lib/d3/d3-transition.v2.min.js +0 -2
- package/web/static/assets/custom-lib/d3/d3.v4.js +0 -17178
- package/web/static/assets/custom-lib/d3/d3.v4.min.js +0 -2
- package/web/static/assets/data/countrycode.json +0 -1
- package/web/static/assets/data/world-110m.json +0 -1
- package/web/static/assets/data/zh-to-alpha2.json +0 -1
- package/web/static/assets/img/fluid.svg +0 -16
- package/web/static/block/axis/0.0.1/index.html +0 -79
- package/web/static/block/axis-bubble/0.0.1/index.html +0 -222
- package/web/static/block/bar/0.0.1/index.html +0 -581
- package/web/static/block/bar-list/0.0.1/index.html +0 -231
- package/web/static/block/bar-race/0.0.1/index.html +0 -184
- package/web/static/block/base/0.0.1/index.html +0 -197
- package/web/static/block/blank/0.0.1/index.html +0 -42
- package/web/static/block/bubble/0.0.1/index.html +0 -402
- package/web/static/block/bubble/0.0.1/test.html +0 -0
- package/web/static/block/curve-bar/0.0.1/index.html +0 -148
- package/web/static/block/dumbbell/0.0.1/index.html +0 -178
- package/web/static/block/empty/0.0.1/index.html +0 -76
- package/web/static/block/gauge/0.0.1/index.html +0 -150
- package/web/static/block/line/0.0.1/index.html +0 -540
- package/web/static/block/number/0.0.1/index.html +0 -152
- package/web/static/block/percent-list/0.0.1/index.html +0 -316
- package/web/static/block/pie/0.0.1/index.html +0 -281
- package/web/static/block/pie-bubble/0.0.1/index.html +0 -358
- package/web/static/block/radar/0.0.1/index.html +0 -149
- package/web/static/block/scatter/0.0.1/index.html +0 -251
- package/web/static/block/sheet/0.0.1/index.html +0 -103
- package/web/static/block/table/0.0.1/index.html +0 -73
- package/web/static/block/taiwantown/0.0.1/index.html +0 -210
- package/web/static/block/taiwanvillage/0.0.1/index.html +0 -220
- package/web/static/block/treemap/0.0.1/index.html +0 -360
- package/web/static/block/voronoi-treemap/0.0.1/index.html +0 -350
- package/web/static/block/wordcloud/0.0.1/index.html +0 -92
- package/web/static/block/worldmap/0.0.1/index.html +0 -207
- package/web/static/css/index.css +0 -0
- package/web/static/css/index.min.css +0 -0
- package/web/static/favicon.ico +0 -0
- package/web/static/index.html +0 -153
package/src/data/zh-TW/fruits
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
杏組
|
|
2
|
-
石榴
|
|
3
|
-
奇異果
|
|
4
|
-
芒果
|
|
5
|
-
梨子
|
|
6
|
-
西瓜
|
|
7
|
-
草莓
|
|
8
|
-
李子
|
|
9
|
-
黑莓
|
|
10
|
-
波森莓
|
|
11
|
-
火龍果
|
|
12
|
-
檸檬
|
|
13
|
-
櫻桃
|
|
14
|
-
蜜柑
|
|
15
|
-
芭樂
|
|
16
|
-
橘子
|
|
17
|
-
蘋果
|
|
18
|
-
金橘
|
|
19
|
-
哈蜜瓜
|
|
20
|
-
葡萄
|
|
21
|
-
柳丁
|
|
22
|
-
葡萄柚
|
|
23
|
-
萊姆
|
|
24
|
-
桶柑
|
|
25
|
-
無花果
|
|
26
|
-
桃子
|
|
27
|
-
椰子
|
|
28
|
-
鳳梨
|
|
29
|
-
梅子
|
|
30
|
-
香瓜
|
|
31
|
-
木瓜
|
|
32
|
-
楊桃
|
|
33
|
-
藍莓
|
|
34
|
-
棗子
|
|
35
|
-
香蕉
|
|
36
|
-
百香果
|
|
37
|
-
酪梨
|
|
38
|
-
越橘
|
package/src/data/zh-TW/movie
DELETED
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
完美風暴
|
|
2
|
-
費城故事
|
|
3
|
-
人猿星球
|
|
4
|
-
巴頓將軍
|
|
5
|
-
風中奇緣
|
|
6
|
-
木偶奇遇記
|
|
7
|
-
鵝毛筆
|
|
8
|
-
奪寶奇兵
|
|
9
|
-
羅密歐與朱麗葉
|
|
10
|
-
白雪公主
|
|
11
|
-
鋼琴師
|
|
12
|
-
熱情如火
|
|
13
|
-
星塵
|
|
14
|
-
星艦奇航記
|
|
15
|
-
七年之癢
|
|
16
|
-
真善美
|
|
17
|
-
龍鳳配
|
|
18
|
-
第六感
|
|
19
|
-
沉默的羔羊
|
|
20
|
-
星際之門系列
|
|
21
|
-
日落大道
|
|
22
|
-
超人
|
|
23
|
-
時光倒流七十年
|
|
24
|
-
刺激1995
|
|
25
|
-
莎翁情史
|
|
26
|
-
星銀島
|
|
27
|
-
變形金剛
|
|
28
|
-
玩具總動員
|
|
29
|
-
玩具總動員2
|
|
30
|
-
計程車司機
|
|
31
|
-
大白鯊
|
|
32
|
-
家族企業
|
|
33
|
-
偷天換日
|
|
34
|
-
冰河世紀
|
|
35
|
-
他不笨,他是我爸爸
|
|
36
|
-
鋼鐵俠
|
|
37
|
-
西部開拓史
|
|
38
|
-
花木蘭
|
|
39
|
-
幻想曲
|
|
40
|
-
綠巨人
|
|
41
|
-
好萊塢式結局
|
|
42
|
-
沉默的羔羊
|
|
43
|
-
海上鋼琴師
|
|
44
|
-
黃金時代
|
|
45
|
-
後窗
|
|
46
|
-
虎豹小霸王
|
|
47
|
-
憤怒的葡萄
|
|
48
|
-
畢業生
|
|
49
|
-
教父第1至3集
|
|
50
|
-
桂河大橋
|
|
51
|
-
關山飛渡
|
|
52
|
-
公主日記
|
|
53
|
-
失戀排行榜
|
|
54
|
-
葛底士堡
|
|
55
|
-
光榮戰役
|
|
56
|
-
過關斬將
|
|
57
|
-
鬼霧
|
|
58
|
-
哥吉拉
|
|
59
|
-
隔山有眼
|
|
60
|
-
鬼娃新娘
|
|
61
|
-
葛倫米勒傳
|
|
62
|
-
第五元素
|
|
63
|
-
阿甘正傳
|
|
64
|
-
海底總動員
|
|
65
|
-
變蠅人
|
|
66
|
-
第一滴血
|
|
67
|
-
浮生若夢
|
|
68
|
-
年度風雲人物
|
|
69
|
-
開膛手
|
|
70
|
-
逍遙騎士
|
|
71
|
-
英倫情人
|
|
72
|
-
E.T.外星人
|
|
73
|
-
剪刀手愛德華
|
|
74
|
-
太陽帝國
|
|
75
|
-
第三類接觸
|
|
76
|
-
伊莉莎白2:黃金時代
|
|
77
|
-
諜影疑雲
|
|
78
|
-
大衛與麗莎
|
|
79
|
-
大河戀
|
|
80
|
-
東方西方
|
|
81
|
-
斷頭谷
|
|
82
|
-
明天過後
|
|
83
|
-
大毒梟
|
|
84
|
-
燈塔驚魂記
|
|
85
|
-
霹靂嬌娃
|
|
86
|
-
哭泣遊戲
|
|
87
|
-
蟲蟲危機
|
|
88
|
-
城市之光
|
|
89
|
-
柯萊利上尉的曼陀鈴
|
|
90
|
-
重歸天堂
|
|
91
|
-
蠢貨
|
|
92
|
-
擒凶記
|
|
93
|
-
赤膽屠龍
|
|
94
|
-
唐人街
|
|
95
|
-
大國民
|
|
96
|
-
冷山
|
|
97
|
-
發條桔子
|
|
98
|
-
寶貝兒
|
|
99
|
-
奔騰年代
|
|
100
|
-
黑鷹墜落
|
|
101
|
-
一個國家的誕生
|
|
102
|
-
美麗心靈
|
|
103
|
-
變人
|
|
104
|
-
兵人
|
|
105
|
-
變相怪傑
|
|
106
|
-
冰凍蜘蛛
|
|
107
|
-
北西北
|
|
108
|
-
藍絲絨
|
|
109
|
-
雌雄大盜
|
|
110
|
-
7月4日誕生
|
|
111
|
-
第凡內早餐
|
|
112
|
-
初戀的回憶
|
|
113
|
-
復仇者聯盟
|
|
114
|
-
安娜與國王
|
|
115
|
-
安妮·霍爾
|
|
116
|
-
阿凡達
|
|
117
|
-
美國風情畫
|
|
118
|
-
西線無戰事
|
|
119
|
-
美國甜心
|
|
120
|
-
桃色公寓
|
|
121
|
-
莫扎特
|
|
122
|
-
異形
|
|
123
|
-
彗星美人
|
|
124
|
-
人工智慧
|
|
125
|
-
邊城英烈傳
|
package/src/data/zh-TW/names
DELETED
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
林彥娥
|
|
2
|
-
韋敬宇
|
|
3
|
-
蔡亭竹
|
|
4
|
-
陳耿威
|
|
5
|
-
吳尊
|
|
6
|
-
李治瑋
|
|
7
|
-
陳嘉豪
|
|
8
|
-
姜建廷
|
|
9
|
-
祖秉勳
|
|
10
|
-
黃政哲
|
|
11
|
-
黃建新
|
|
12
|
-
楊帆
|
|
13
|
-
張威宇
|
|
14
|
-
李明珠
|
|
15
|
-
吳薇儀
|
|
16
|
-
杜家銘
|
|
17
|
-
任采林
|
|
18
|
-
林美茹
|
|
19
|
-
黃佩璇
|
|
20
|
-
張柏亨
|
|
21
|
-
黃怡杰
|
|
22
|
-
王書娟
|
|
23
|
-
曹桂潔
|
|
24
|
-
蔡聖凱
|
|
25
|
-
王怡伶
|
|
26
|
-
林彥劭
|
|
27
|
-
李貴芬
|
|
28
|
-
陳志元
|
|
29
|
-
蔡禮易
|
|
30
|
-
王彥博
|
|
31
|
-
林依辰
|
|
32
|
-
劉俊純
|
|
33
|
-
臧雅雯
|
|
34
|
-
黃博文
|
|
35
|
-
陳冠羽
|
|
36
|
-
何台芝
|
|
37
|
-
韓慶江
|
|
38
|
-
吳秋年
|
|
39
|
-
張文東
|
|
40
|
-
林奕辰
|
|
41
|
-
曾雅玲
|
|
42
|
-
陳惠文
|
|
43
|
-
陳慧惟
|
|
44
|
-
葛泓夫
|
|
45
|
-
李佩妏
|
|
46
|
-
林夕
|
|
47
|
-
傅淑娟
|
|
48
|
-
陳佳慧
|
|
49
|
-
侯伊然
|
|
50
|
-
劉佩君
|
|
51
|
-
韓羽
|
|
52
|
-
林雅筑
|
|
53
|
-
劉星禮
|
|
54
|
-
丁初茜
|
|
55
|
-
林丹紫
|
|
56
|
-
陳威軍
|
|
57
|
-
陳珮甄
|
|
58
|
-
黎昱宏
|
|
59
|
-
曾哲銘
|
|
60
|
-
洪姿穎
|
|
61
|
-
王新睿
|
|
62
|
-
李偉翔
|
|
63
|
-
宋雅竹
|
|
64
|
-
荊雅惠
|
|
65
|
-
黃淑卿
|
|
66
|
-
詹雅書
|
|
67
|
-
童佳雯
|
|
68
|
-
柏華仁
|
|
69
|
-
蔡金霖
|
|
70
|
-
費俊逸
|
|
71
|
-
謝佳伶
|
|
72
|
-
吳欣偉
|
|
73
|
-
陳志香
|
|
74
|
-
張惠泉
|
|
75
|
-
陳恒芳
|
|
76
|
-
謝邦其
|
|
77
|
-
吳士怡
|
|
78
|
-
杜仰彬
|
|
79
|
-
林冠良
|
|
80
|
-
謝佩劭
|
|
81
|
-
張建智
|
|
82
|
-
韓大芸
|
|
83
|
-
梁志宇
|
|
84
|
-
丁美慧
|
|
85
|
-
朱哲豪
|
|
86
|
-
欒維倫
|
|
87
|
-
陳金念
|
|
88
|
-
陳瑋婷
|
|
89
|
-
陳奇邦
|
|
90
|
-
郭淑文
|
|
91
|
-
楊旻善
|
|
92
|
-
賴延江
|
|
93
|
-
林宜臻
|
|
94
|
-
姚慧娟
|
|
95
|
-
簡志喬
|
|
96
|
-
楊家宏
|
|
97
|
-
黃惠敏
|
|
98
|
-
黃郁紹
|
|
99
|
-
阮綺生
|
|
100
|
-
蔡紫秀
|
|
101
|
-
吳雅文
|
|
102
|
-
張良
|
|
103
|
-
郭芝名
|
|
104
|
-
郭永心
|
|
105
|
-
楊筱婷
|
package/src/utils/axis.ls
DELETED
|
@@ -1,229 +0,0 @@
|
|
|
1
|
-
ceNS = -> document.createElementNS("http://www.w3.org/2000/svg", it)
|
|
2
|
-
|
|
3
|
-
axis = (opt={}) ->
|
|
4
|
-
@dir = {"bottom": 0, "left": 2}[opt.direction or 'bottom']
|
|
5
|
-
@name = opt.name or \axis
|
|
6
|
-
# unlike legend, we don't use n.layout to layout things, only use its primary size.
|
|
7
|
-
# we will update n.layout's secondary size, it won't affect how we layout things.
|
|
8
|
-
# so we don't need layout.update before rendering.
|
|
9
|
-
# layout.update is still needed after rendering for stuff outside axis to work.
|
|
10
|
-
# TODO still yaxis and xaxis may affect each other to cause a recursive update,
|
|
11
|
-
# so we have to be careful and have some constraint over this. (e.g., set max size of n.layout)
|
|
12
|
-
@layout = opt.layout or new layout root: @root
|
|
13
|
-
@_ticks = []
|
|
14
|
-
@_scale = opt.scale or (->it)
|
|
15
|
-
@_format = opt.format or if chart? => chart.utils.format.simple else (->it)
|
|
16
|
-
@cfg = {tick-size: 8} <<< opt.cfg
|
|
17
|
-
@_map = {} # tick value -> object{v,c,t,n,g}
|
|
18
|
-
@_n = n =
|
|
19
|
-
root: ceNS \g # root node, appended to render node
|
|
20
|
-
layout: @layout.get-node(@name) # decide render region size
|
|
21
|
-
render: @layout.get-group(@name) # render region node
|
|
22
|
-
wrap: null # for wrapping tick text
|
|
23
|
-
domain: ceNS \path # axis domain line
|
|
24
|
-
n.render.appendChild n.root
|
|
25
|
-
n.root.appendChild n.domain
|
|
26
|
-
|
|
27
|
-
n.label = ceNS \text
|
|
28
|
-
n.label.textContent = ''
|
|
29
|
-
n.label
|
|
30
|
-
..setAttribute \dominant-baseline, \hanging
|
|
31
|
-
..setAttribute \text-anchor, \middle
|
|
32
|
-
n.root.appendChild n.label
|
|
33
|
-
@wrapper!
|
|
34
|
-
@layout
|
|
35
|
-
..on \update, ~> @update!
|
|
36
|
-
..on \render, ~> @render!
|
|
37
|
-
@
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
axis.prototype = Object.create(Object.prototype) <<< do
|
|
41
|
-
# while we may only need to update `white-space` and `width`,
|
|
42
|
-
# strangely style changing only works if we replace node with a new one.
|
|
43
|
-
# this is a workaround before we find the root cause.
|
|
44
|
-
wrapper: ->
|
|
45
|
-
n = @_n
|
|
46
|
-
if n.wrap and n.wrap.parentNode => n.wrap.parentNode.removeChild n.wrap
|
|
47
|
-
n.wrap = document.createElement \div
|
|
48
|
-
n.wrap.style <<< {
|
|
49
|
-
visibility: \hidden
|
|
50
|
-
position: \absolute
|
|
51
|
-
top: 0
|
|
52
|
-
left: 0
|
|
53
|
-
pointerEvents: \none
|
|
54
|
-
userSelect: \none
|
|
55
|
-
zIndex: 0
|
|
56
|
-
wordBreak: "break-all"
|
|
57
|
-
lineHeight: \.95em
|
|
58
|
-
} <<< (if @dir < 2 and @cfg.textWidth? => {
|
|
59
|
-
whiteSpace: 'wrap'
|
|
60
|
-
width: "#{@cfg.textWidth >? 1}em"
|
|
61
|
-
} else {whiteSpace: \pre, width: \4em})
|
|
62
|
-
n.layout.appendChild n.wrap
|
|
63
|
-
|
|
64
|
-
config: ->
|
|
65
|
-
if !(it?) => return @cfg
|
|
66
|
-
@cfg <<< it
|
|
67
|
-
if @cfg.format => @format @cfg.format
|
|
68
|
-
@wrapper!
|
|
69
|
-
|
|
70
|
-
format: -> if it? => @_format = it else @_format
|
|
71
|
-
scale: -> if it? => @_scale = it else @_scale
|
|
72
|
-
caption: ->
|
|
73
|
-
if @cfg.show-caption? and !@cfg.show-caption => @_n.label.textContent = ''
|
|
74
|
-
else @_n.label.textContent = it
|
|
75
|
-
update: ->
|
|
76
|
-
ticks: (ticks) ->
|
|
77
|
-
/* (v)alue -> (c)oordinate -> (t)ext -> (n)odes: { g(group), p(path), t(text) } */
|
|
78
|
-
map = {}
|
|
79
|
-
size = @_n.layout.getBoundingClientRect![if @dir < 2 => \width else \height]
|
|
80
|
-
count = Math.round(size / 25)
|
|
81
|
-
itr = Math.round(ticks.length / (count >? 1)) >? 1
|
|
82
|
-
@_ticks = ticks
|
|
83
|
-
.filter (d,i) -> !(i % itr) or i == (ticks.length - 1)
|
|
84
|
-
.map (o) ~>
|
|
85
|
-
if typeof(o) != \object => o = {v: o}
|
|
86
|
-
map[o.v] = @_map{}[o.v] <<< o
|
|
87
|
-
for k,v of @_map => if !map[k] => v.n.g.parentNode.removeChild v.n.g
|
|
88
|
-
@_map = map
|
|
89
|
-
@_ticks
|
|
90
|
-
.filter (o) -> !o.n
|
|
91
|
-
.map (o) ~>
|
|
92
|
-
o.n = g: ceNS(\g), p: ceNS(\path), t: ceNS(\g)
|
|
93
|
-
o.n.g.appendChild o.n.p
|
|
94
|
-
o.n.g.appendChild o.n.t
|
|
95
|
-
@_n.root.appendChild o.n.g
|
|
96
|
-
if isNaN(+o.v) => o.t = o.v
|
|
97
|
-
|
|
98
|
-
render: ->
|
|
99
|
-
n = @_n
|
|
100
|
-
is-horizon = (@dir < 2)
|
|
101
|
-
wrap = n.wrap
|
|
102
|
-
ticks = @_ticks
|
|
103
|
-
if @cfg.enabled? and !@cfg.enabled =>
|
|
104
|
-
if is-horizon => n.layout.style <<< height: "0px", paddingTop: "0", paddingBottom: "0"
|
|
105
|
-
else n.layout.style <<< width: "0px", paddingLeft: "0", paddingRight: "0"
|
|
106
|
-
n.domain.style.display = 'none'
|
|
107
|
-
return
|
|
108
|
-
else
|
|
109
|
-
if is-horizon => n.layout.style <<< height: "", paddingTop: "", paddingBottom: ""
|
|
110
|
-
else n.layout.style <<< width: "", paddingLeft: "", paddingRight: ""
|
|
111
|
-
n.domain.style.display = ''
|
|
112
|
-
font-size = getComputedStyle(wrap).font-size
|
|
113
|
-
box = n.layout.getBoundingClientRect!
|
|
114
|
-
n.domain.style <<< strokeWidth: 1, stroke: \currentColor, fill: \none
|
|
115
|
-
ticks.map (o, idx) ~>
|
|
116
|
-
pos = if !idx => 0 else if idx == ticks.length - 1 => 2 else 1
|
|
117
|
-
o._c = if o.c? => o.c else @_scale(o.v) + (if @_scale.bandwidth => @_scale.bandwidth!/2 else 0)
|
|
118
|
-
o._t = if o.t? => o.t else @_format o.v
|
|
119
|
-
o.n.p.style <<< strokeWidth: 1, stroke: \currentColor, fill: \none
|
|
120
|
-
wrap.textContent = o._t
|
|
121
|
-
wrap.style.textAlign = if is-horizon => <[left center right]>[pos] else <[right left]>[@dir - 2]
|
|
122
|
-
o.n.tt = wrap-svg-text {node: wrap}
|
|
123
|
-
o.n.t.style.font-size = font-size
|
|
124
|
-
o.n.t.textContent = ''
|
|
125
|
-
o.n.t.appendChild o.n.tt
|
|
126
|
-
ticks.sort (a,b) -> a._c - b._c
|
|
127
|
-
|
|
128
|
-
if is-horizon =>
|
|
129
|
-
n.domain.setAttribute \d, "M0 0L#{box.width} 0Z"
|
|
130
|
-
n.label.setAttribute \x, box.width / 2
|
|
131
|
-
else
|
|
132
|
-
n.domain.setAttribute \d, "M0 0L0 #{box.height}Z"
|
|
133
|
-
n.label.setAttribute "transform", "translate(0,#{box.height/2}) rotate(90)"
|
|
134
|
-
ticks.map (o) -> o.box = o.n.t.getBBox!
|
|
135
|
-
@adjust!
|
|
136
|
-
|
|
137
|
-
adjust: ->
|
|
138
|
-
ticks = @_ticks
|
|
139
|
-
is-horizon = (@dir < 2)
|
|
140
|
-
insert = (idx, lv, lc) ~>
|
|
141
|
-
if lc.checked[idx] => return else lc.checked[idx] = true
|
|
142
|
-
tick = ticks[idx]
|
|
143
|
-
# 0: smallest 'screen coord' tick / 1: middle tick / 2: biggest 'screen coord' tick
|
|
144
|
-
# top(0) -> down(2) / left(0) -> right(0)
|
|
145
|
-
pos = if !idx => 0 else if idx == ticks.length - 1 => 2 else 1
|
|
146
|
-
|
|
147
|
-
[coord,text] = [tick._c, tick._t]
|
|
148
|
-
box = tick.box
|
|
149
|
-
offset = {x: -box.x, y: -box.y}
|
|
150
|
-
do-offset = if @_scale.bandwidth => false
|
|
151
|
-
else if @cfg.boundary-tick-offset? => !!@cfg.boundary-tick-offset
|
|
152
|
-
else if @dir < 2 => true else false
|
|
153
|
-
r = if do-offset => pos/2 else 1/2
|
|
154
|
-
if is-horizon => offset.x -= box.width * r # start: 0w, middle: -.5w, end: -w ( left to right )
|
|
155
|
-
else offset.y -= box.height * r # start: 0h, middle: .5h, end: -h ( top to bottom )
|
|
156
|
-
tick.n.tt.setAttribute \transform, "translate(#{offset.x},#{offset.y})"
|
|
157
|
-
|
|
158
|
-
box =
|
|
159
|
-
size: box[if is-horizon => \width else \height]
|
|
160
|
-
size-alt: box[if is-horizon => \height else \width]
|
|
161
|
-
lv: lv, tick: tick, idx: idx
|
|
162
|
-
box.coord = coord - (box.size * r) #(if is-horizon => pos else (2 - pos)) / 2)
|
|
163
|
-
|
|
164
|
-
if is-horizon =>
|
|
165
|
-
tick.n.g.setAttribute \transform, "translate(#{coord},0)"
|
|
166
|
-
tick.n.p.setAttribute \d, "M0 0L0 #{@cfg.tick-size}"
|
|
167
|
-
tick.n.t.setAttribute \transform, "translate(0,#{@cfg.tick-size})"
|
|
168
|
-
else
|
|
169
|
-
tick.n.g.setAttribute \transform, "translate(0,#{coord})"
|
|
170
|
-
tick.n.p.setAttribute \d, "M0 0L-#{@cfg.tick-size} 0"
|
|
171
|
-
tick.n.t.setAttribute \transform, "translate(#{-@cfg.tick-size - box.size-alt - 1},0)"
|
|
172
|
-
|
|
173
|
-
m = 2
|
|
174
|
-
[ip1, ip2] = [ box.coord, box.coord + box.size ]
|
|
175
|
-
[op1, op2] = [ ip1 - m, ip2 + m]
|
|
176
|
-
|
|
177
|
-
overlap = lc.picked
|
|
178
|
-
.filter (b) ->
|
|
179
|
-
[iq1, iq2] = [b.coord, b.coord + b.size]
|
|
180
|
-
[oq1, oq2] = [iq1 - m, iq2 + m]
|
|
181
|
-
return (ip1 > oq1 and ip1 < oq2) or (iq1 > op1 and iq1 < op2)
|
|
182
|
-
.length
|
|
183
|
-
|
|
184
|
-
tick.n.t.style.opacity = if overlap => 0 else 1
|
|
185
|
-
lc.picked.push box
|
|
186
|
-
return !overlap # return true if insert successfully
|
|
187
|
-
|
|
188
|
-
# align lv ( see below commented codes )
|
|
189
|
-
# try to only show ticks in the same level.
|
|
190
|
-
# yet current implementation doesn't work well
|
|
191
|
-
# since we may have different size in each interval even in the same level
|
|
192
|
-
|
|
193
|
-
bfs = (maxlv = 1) ~>
|
|
194
|
-
[lc,fifo] = [{checked:{}, picked: [], node: @_n.wrap}, []]
|
|
195
|
-
lc.font-size = getComputedStyle(lc.node).font-size
|
|
196
|
-
# align lv
|
|
197
|
-
ticks.map -> it.n.t.style.opacity = 0
|
|
198
|
-
if ticks.length =>
|
|
199
|
-
fifo.push [0, ticks.length - 1, 0]
|
|
200
|
-
[0, ticks.length - 1].map -> insert it, 0, lc
|
|
201
|
-
while fifo.length =>
|
|
202
|
-
[L, R, D] = fifo.splice 0, 1 .0
|
|
203
|
-
if D >= maxlv => continue
|
|
204
|
-
M = Math.floor(( L + R ) / 2)
|
|
205
|
-
# align lv
|
|
206
|
-
#if !insert(M, D, lc) => maxlv = D
|
|
207
|
-
insert(M, D, lc)
|
|
208
|
-
if M > L + 1 => fifo.push [L, M, D + 1]
|
|
209
|
-
if R > M + 1 => fifo.push [M, R, D + 1]
|
|
210
|
-
|
|
211
|
-
/* align lv
|
|
212
|
-
lc.picked.map -> if it.lv >= maxlv => it.tick.n.t.style.opacity = 0
|
|
213
|
-
lc.picked = lc.picked.filter -> it.lv < maxlv
|
|
214
|
-
*/
|
|
215
|
-
|
|
216
|
-
size = Math.max.apply(Math, [0] ++ lc.picked.map(-> it.size-alt))
|
|
217
|
-
if @dir < 2 =>
|
|
218
|
-
@_n.label.setAttribute \y, size + @cfg.tick-size
|
|
219
|
-
@_n.layout.style.height = "#{(size + @cfg.tick-size + @_n.label.getBoundingClientRect!height)}px"
|
|
220
|
-
else
|
|
221
|
-
@_n.label.setAttribute \x, 0
|
|
222
|
-
@_n.label.setAttribute \y, 0
|
|
223
|
-
@_n.layout.style.width = "#{(size + @cfg.tick-size + @_n.label.getBoundingClientRect!width)}px"
|
|
224
|
-
box = @_n.layout.getBoundingClientRect!
|
|
225
|
-
@_n.label.setAttribute \transform, "translate(#{-(size + @cfg.tick-size)},#{box.height/2}) rotate(90)"
|
|
226
|
-
@_n.root.setAttribute \transform "translate(#{box.width},0)"
|
|
227
|
-
bfs 5
|
|
228
|
-
|
|
229
|
-
if chart? => chart.{}utils.axis = axis
|
package/src/utils/config.ls
DELETED
package/src/utils/data.ls
DELETED
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
main =
|
|
2
|
-
number: (opt = {}) ->
|
|
3
|
-
data = opt.data
|
|
4
|
-
.filter -> !(!it or "#{it}".trim! == '')
|
|
5
|
-
len = data
|
|
6
|
-
.filter -> !isNaN(parseFloat(it))
|
|
7
|
-
.length
|
|
8
|
-
(len / data.length)
|
|
9
|
-
|
|
10
|
-
serial: (opt = {}) ->
|
|
11
|
-
data = [] ++ opt.data
|
|
12
|
-
data.sort (a,b) -> b - a
|
|
13
|
-
hash = {}
|
|
14
|
-
for i from 1 til data.length =>
|
|
15
|
-
if isNaN(data[i]) or isNaN(data[i - 1]) =>
|
|
16
|
-
hash[if data[i] > data[i - 1] => "#{data[i]}:#{data[i - 1]}" else "#{data[i - 1]}:#{data[i]}"] = true
|
|
17
|
-
else delta = data[i] - data[i - 1]
|
|
18
|
-
hash[delta] = true
|
|
19
|
-
return 1 / ([k for k of hash].filter(->it != \0).length or 2)
|
|
20
|
-
|
|
21
|
-
text: (opt={}) -> 1 - (@number opt)
|
|
22
|
-
|
|
23
|
-
category: (opt={}) ->
|
|
24
|
-
len = Array.from(new Set(opt.data)).length
|
|
25
|
-
maxlen = opt.data.length
|
|
26
|
-
ret = (1 - (((len - 2) >? 0) / maxlen) - (1 / maxlen)) >? 0 <? 1
|
|
27
|
-
if @number(opt) => ret = ret * 0.9
|
|
28
|
-
return ret
|
|
29
|
-
|
|
30
|
-
parse: (data) ->
|
|
31
|
-
if Array.isArray(data) =>
|
|
32
|
-
head = data.slice 0, 1 .0
|
|
33
|
-
body = data.slice 1
|
|
34
|
-
body = body.map (d,i) ->
|
|
35
|
-
ret = {}
|
|
36
|
-
head.map (h,j) -> ret[h] = d[j]
|
|
37
|
-
ret
|
|
38
|
-
return {head, body}
|
|
39
|
-
return data
|
|
40
|
-
|
|
41
|
-
autotype: (data = []) ->
|
|
42
|
-
head = [k for k of data.0 or {}]
|
|
43
|
-
type = []
|
|
44
|
-
for key in head =>
|
|
45
|
-
d = data.map -> it[key]
|
|
46
|
-
ret = do
|
|
47
|
-
key: key
|
|
48
|
-
types:
|
|
49
|
-
R: main.number({data: d})
|
|
50
|
-
O: main.serial({data: d})
|
|
51
|
-
N: main.text({data: d})
|
|
52
|
-
C: main.category({data: d})
|
|
53
|
-
list = <[R O N C]>.map -> [it, ret.types[it]]
|
|
54
|
-
list.sort (a,b) -> b.1 - a.1
|
|
55
|
-
ret.type = list.0.0
|
|
56
|
-
type.push ret
|
|
57
|
-
|
|
58
|
-
return type
|
|
59
|
-
|
|
60
|
-
autobind: (data = [], dimension = {}) ->
|
|
61
|
-
datatypes = @autotype data
|
|
62
|
-
dims = [{k,v} for k,v of dimension].filter -> !it.v.passive
|
|
63
|
-
dims.sort (a,b) ->
|
|
64
|
-
ret = (a.v.priority or 100) - (b.v.priority or 100)
|
|
65
|
-
if ret != 0 => return ret
|
|
66
|
-
[ma,mb] = [(a.v.type or \R), (b.v.type or \R)].map (t) ->
|
|
67
|
-
Math.min.apply Math, [0 til t.length].map (i) -> "CONR".indexOf(t[i])
|
|
68
|
-
return ma - mb
|
|
69
|
-
for dim in dims =>
|
|
70
|
-
dim.bind = null
|
|
71
|
-
ts = dim.v.type or \RNOC
|
|
72
|
-
for i from 0 til ts.length =>
|
|
73
|
-
t = ts[i]
|
|
74
|
-
datatypes.sort (a, b) ->
|
|
75
|
-
ret = (b.types[t] or 0) - (a.types[t] or 0)
|
|
76
|
-
if b.types[t] == a.types[t] and t == \R => return (a.types.O or 0) - (b.types.O or 0)
|
|
77
|
-
return ret
|
|
78
|
-
for i from 0 til datatypes.length =>
|
|
79
|
-
dt = datatypes[i]
|
|
80
|
-
if dt.types[t] < 0.5 or dt.used or (t == \C and dt.types.R > 0.5) => continue
|
|
81
|
-
dim.bind = if dim.v.multiple => [dt] else dt
|
|
82
|
-
dt.used = true
|
|
83
|
-
break
|
|
84
|
-
for dim in dims =>
|
|
85
|
-
if !dim.v.multiple => continue
|
|
86
|
-
ts = dim.v.type or \RNOC
|
|
87
|
-
for i from 0 til ts.length =>
|
|
88
|
-
t = ts[i]
|
|
89
|
-
datatypes.sort (a, b) ->
|
|
90
|
-
ret = (b[t] or 0) - (a[t] or 0)
|
|
91
|
-
if b[t] == a[t] and t == \R => return (a.O or 0) - (b.O or 0)
|
|
92
|
-
return ret
|
|
93
|
-
for i from 0 til datatypes.length =>
|
|
94
|
-
dt = datatypes[i]
|
|
95
|
-
if dt.types[t] < 0.5 or dt.used or (t == \C and dt.types.R > 0.5) => continue
|
|
96
|
-
dim.bind.push dt
|
|
97
|
-
dt.used = true
|
|
98
|
-
ret = {}
|
|
99
|
-
for dim in dims => if dim.bind =>
|
|
100
|
-
ret[dim.k] = dim.bind
|
|
101
|
-
(if Array.isArray(dim.bind) => dim.bind else [dim.bind]).map -> delete it.used
|
|
102
|
-
return ret
|
|
103
|
-
|
|
104
|
-
if chart? => chart.{}utils.data = main
|
package/src/utils/format.ls
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
format = {}
|
|
2
|
-
format.auto = (list = []) ->
|
|
3
|
-
return d3.format ".3s"
|
|
4
|
-
list = list.map(->+it).filter -> !isNaN(it)
|
|
5
|
-
if !list.length => return d3.format "d"
|
|
6
|
-
list.sort (a,b) -> a - b
|
|
7
|
-
s = Math.max.apply Math, list.map ->
|
|
8
|
-
s = 1
|
|
9
|
-
while it
|
|
10
|
-
if it % 10 => break
|
|
11
|
-
it = Math.floor(it / 10)
|
|
12
|
-
s++
|
|
13
|
-
Math.ceil((Math.log(it or 1) / Math.log(10)) - s) >? 0
|
|
14
|
-
int-rate = list.filter(-> Math.floor(it) == it).length / list.length
|
|
15
|
-
diffs = [Math.abs(list[i] - list[i - 1]) for i from 1 til list.length].map ->
|
|
16
|
-
Math.log(if it => it else 1) / Math.log(10)
|
|
17
|
-
diff-avg = diffs.reduce(((a,b) -> a + b),0) / list.length
|
|
18
|
-
type = if int-rate > 0.9 => "s" else "f"
|
|
19
|
-
size = (if diff-avg >= 0 => (s >? 0) else Math.ceil(Math.abs(diff-avg)))
|
|
20
|
-
return d3.format ".#size#type"
|
|
21
|
-
|
|
22
|
-
format.simple = (v) ->
|
|
23
|
-
if isNaN(v = +v) => return v
|
|
24
|
-
return if v >= 1000000000 => (v / 1000000000).toFixed(0) + "G"
|
|
25
|
-
else if v >= 1000000 => (v / 1000000).toFixed(0) + "M"
|
|
26
|
-
else if v >= 1000 => (v / 1000).toFixed(0) + "K"
|
|
27
|
-
else if Math.floor(v) == v => (v).toFixed(0)
|
|
28
|
-
else v.toFixed(2)
|
|
29
|
-
|
|
30
|
-
if chart? => chart.{}utils.format = format
|