html2canvas-pro 2.1.0 → 2.2.0

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.
Files changed (266) hide show
  1. package/dist/html2canvas-pro.esm.js +10226 -10526
  2. package/dist/html2canvas-pro.esm.js.map +1 -1
  3. package/dist/html2canvas-pro.js +10869 -11171
  4. package/dist/html2canvas-pro.js.map +1 -1
  5. package/dist/html2canvas-pro.min.js +8 -8
  6. package/dist/lib/config.js +0 -22
  7. package/dist/lib/core/cache-storage.js +3 -40
  8. package/dist/lib/core/constants.js +25 -0
  9. package/dist/lib/core/context.js +1 -0
  10. package/dist/lib/core/features.js +3 -2
  11. package/dist/lib/core/validator.js +3 -3
  12. package/dist/lib/css/grouped/background-styles.js +36 -0
  13. package/dist/lib/css/grouped/border-styles.js +75 -0
  14. package/dist/lib/css/grouped/font-styles.js +93 -0
  15. package/dist/lib/css/grouped/layout-styles.js +127 -0
  16. package/dist/lib/css/index.js +74 -46
  17. package/dist/lib/css/layout/text.js +7 -6
  18. package/dist/lib/css/property-descriptors/background-blend-mode.js +41 -0
  19. package/dist/lib/css/property-descriptors/border-image-repeat.js +42 -0
  20. package/dist/lib/css/property-descriptors/border-image-slice.js +45 -0
  21. package/dist/lib/css/property-descriptors/border-image-source.js +21 -0
  22. package/dist/lib/css/property-descriptors/border-radius.js +1 -1
  23. package/dist/lib/css/property-descriptors/box-decoration-break.js +18 -0
  24. package/dist/lib/css/property-descriptors/counter-increment.js +17 -12
  25. package/dist/lib/css/property-descriptors/counter-reset.js +4 -12
  26. package/dist/lib/css/property-descriptors/filter.js +76 -0
  27. package/dist/lib/css/property-descriptors/font-variant-ligatures.js +34 -0
  28. package/dist/lib/css/property-descriptors/object-fit.js +1 -1
  29. package/dist/lib/css/property-descriptors/object-position.js +42 -0
  30. package/dist/lib/css/property-descriptors/visibility.js +1 -1
  31. package/dist/lib/css/property-descriptors/zoom.js +18 -0
  32. package/dist/lib/css/syntax/parser.js +0 -1
  33. package/dist/lib/css/types/color.js +5 -1
  34. package/dist/lib/css/types/functions/repeating-linear-gradient.js +9 -0
  35. package/dist/lib/css/types/image.js +12 -2
  36. package/dist/lib/css/types/length-percentage.js +6 -2
  37. package/dist/lib/css/types/safe-eval.js +80 -0
  38. package/dist/lib/dom/document-cloner.js +23 -163
  39. package/dist/lib/dom/slot-cloner.js +176 -0
  40. package/dist/lib/index.js +1 -17
  41. package/dist/lib/render/canvas/background-renderer.js +169 -30
  42. package/dist/lib/render/canvas/border-image-renderer.js +153 -0
  43. package/dist/lib/render/canvas/canvas-renderer.js +39 -190
  44. package/dist/lib/render/canvas/content-renderer.js +202 -0
  45. package/dist/lib/render/canvas/effects-renderer.js +3 -0
  46. package/dist/lib/render/canvas/foreignobject-renderer.js +5 -1
  47. package/dist/lib/render/canvas/text/text-decoration-renderer.js +99 -0
  48. package/dist/lib/render/canvas/text-renderer.js +100 -224
  49. package/dist/lib/render/effects.js +38 -3
  50. package/dist/lib/render/object-fit.js +19 -15
  51. package/dist/lib/render/stacking-context.js +11 -0
  52. package/dist/types/config.d.ts +0 -10
  53. package/dist/types/core/cache-storage.d.ts +0 -24
  54. package/dist/types/core/constants.d.ts +22 -0
  55. package/dist/types/core/context.d.ts +3 -0
  56. package/dist/types/core/performance-monitor.d.ts +4 -4
  57. package/dist/types/core/validator.d.ts +6 -8
  58. package/dist/types/css/grouped/background-styles.d.ts +16 -0
  59. package/dist/types/css/grouped/border-styles.d.ts +31 -0
  60. package/dist/types/css/grouped/font-styles.d.ts +35 -0
  61. package/dist/types/css/grouped/layout-styles.d.ts +46 -0
  62. package/dist/types/css/index.d.ts +30 -0
  63. package/dist/types/css/property-descriptors/background-blend-mode.d.ts +23 -0
  64. package/dist/types/css/property-descriptors/border-image-repeat.d.ts +12 -0
  65. package/dist/types/css/property-descriptors/border-image-slice.d.ts +10 -0
  66. package/dist/types/css/property-descriptors/border-image-source.d.ts +4 -0
  67. package/dist/types/css/property-descriptors/box-decoration-break.d.ts +6 -0
  68. package/dist/types/css/property-descriptors/counter-increment.d.ts +3 -0
  69. package/dist/types/css/property-descriptors/filter.d.ts +3 -0
  70. package/dist/types/css/property-descriptors/font-variant-ligatures.d.ts +14 -0
  71. package/dist/types/css/property-descriptors/object-position.d.ts +4 -0
  72. package/dist/types/css/property-descriptors/zoom.d.ts +3 -0
  73. package/dist/types/css/types/functions/repeating-linear-gradient.d.ts +4 -0
  74. package/dist/types/css/types/image.d.ts +4 -2
  75. package/dist/types/css/types/safe-eval.d.ts +8 -0
  76. package/dist/types/dom/document-cloner.d.ts +3 -44
  77. package/dist/types/dom/slot-cloner.d.ts +66 -0
  78. package/dist/types/index.d.ts +3 -7
  79. package/dist/types/options.d.ts +11 -0
  80. package/dist/types/render/canvas/background-renderer.d.ts +23 -0
  81. package/dist/types/render/canvas/border-image-renderer.d.ts +18 -0
  82. package/dist/types/render/canvas/canvas-renderer.d.ts +1 -0
  83. package/dist/types/render/canvas/content-renderer.d.ts +44 -0
  84. package/dist/types/render/canvas/text/text-decoration-renderer.d.ts +18 -0
  85. package/dist/types/render/canvas/text-renderer.d.ts +12 -1
  86. package/dist/types/render/effects.d.ts +12 -2
  87. package/dist/types/render/object-fit.d.ts +2 -1
  88. package/dist/types/render/renderer-interface.d.ts +11 -9
  89. package/package.json +7 -20
  90. package/dist/lib/dom/replaced-elements/pseudo-elements.js +0 -0
  91. package/dist/lib/invariant.js +0 -9
  92. package/dist/types/dom/replaced-elements/pseudo-elements.d.ts +0 -0
  93. package/dist/types/invariant.d.ts +0 -1
  94. package/src/__tests__/index.ts +0 -99
  95. package/src/config.ts +0 -107
  96. package/src/core/__mocks__/cache-storage.ts +0 -1
  97. package/src/core/__mocks__/context.ts +0 -19
  98. package/src/core/__mocks__/features.ts +0 -8
  99. package/src/core/__mocks__/logger.ts +0 -17
  100. package/src/core/__tests__/cache-storage.test.ts +0 -205
  101. package/src/core/__tests__/cache-storage.ts +0 -278
  102. package/src/core/__tests__/logger.ts +0 -29
  103. package/src/core/__tests__/validator.ts +0 -359
  104. package/src/core/bitwise.ts +0 -1
  105. package/src/core/cache-storage.ts +0 -315
  106. package/src/core/context.ts +0 -31
  107. package/src/core/debugger.ts +0 -32
  108. package/src/core/features.ts +0 -222
  109. package/src/core/logger.ts +0 -64
  110. package/src/core/origin-checker.ts +0 -57
  111. package/src/core/performance-monitor.ts +0 -241
  112. package/src/core/render-element.ts +0 -272
  113. package/src/core/util.ts +0 -1
  114. package/src/core/validator.ts +0 -593
  115. package/src/css/index.ts +0 -427
  116. package/src/css/layout/__mocks__/bounds.ts +0 -6
  117. package/src/css/layout/bounds.ts +0 -79
  118. package/src/css/layout/text.ts +0 -161
  119. package/src/css/property-descriptor.ts +0 -49
  120. package/src/css/property-descriptors/__tests__/background-tests.ts +0 -65
  121. package/src/css/property-descriptors/__tests__/clip-path.test.ts +0 -280
  122. package/src/css/property-descriptors/__tests__/font-family.ts +0 -25
  123. package/src/css/property-descriptors/__tests__/image-rendering-integration.test.ts +0 -153
  124. package/src/css/property-descriptors/__tests__/image-rendering-performance.test.ts +0 -175
  125. package/src/css/property-descriptors/__tests__/image-rendering.test.ts +0 -72
  126. package/src/css/property-descriptors/__tests__/paint-order.ts +0 -87
  127. package/src/css/property-descriptors/__tests__/text-shadow.ts +0 -94
  128. package/src/css/property-descriptors/__tests__/transform-tests.ts +0 -18
  129. package/src/css/property-descriptors/background-clip.ts +0 -30
  130. package/src/css/property-descriptors/background-color.ts +0 -9
  131. package/src/css/property-descriptors/background-image.ts +0 -27
  132. package/src/css/property-descriptors/background-origin.ts +0 -31
  133. package/src/css/property-descriptors/background-position.ts +0 -38
  134. package/src/css/property-descriptors/background-repeat.ts +0 -44
  135. package/src/css/property-descriptors/background-size.ts +0 -27
  136. package/src/css/property-descriptors/border-color.ts +0 -13
  137. package/src/css/property-descriptors/border-radius.ts +0 -19
  138. package/src/css/property-descriptors/border-style.ts +0 -34
  139. package/src/css/property-descriptors/border-width.ts +0 -20
  140. package/src/css/property-descriptors/box-shadow.ts +0 -60
  141. package/src/css/property-descriptors/clip-path.ts +0 -271
  142. package/src/css/property-descriptors/color.ts +0 -9
  143. package/src/css/property-descriptors/content.ts +0 -26
  144. package/src/css/property-descriptors/counter-increment.ts +0 -43
  145. package/src/css/property-descriptors/counter-reset.ts +0 -36
  146. package/src/css/property-descriptors/direction.ts +0 -23
  147. package/src/css/property-descriptors/display.ts +0 -117
  148. package/src/css/property-descriptors/duration.ts +0 -14
  149. package/src/css/property-descriptors/float.ts +0 -29
  150. package/src/css/property-descriptors/font-family.ts +0 -38
  151. package/src/css/property-descriptors/font-size.ts +0 -9
  152. package/src/css/property-descriptors/font-style.ts +0 -25
  153. package/src/css/property-descriptors/font-variant.ts +0 -12
  154. package/src/css/property-descriptors/font-weight.ts +0 -26
  155. package/src/css/property-descriptors/image-rendering.ts +0 -33
  156. package/src/css/property-descriptors/letter-spacing.ts +0 -25
  157. package/src/css/property-descriptors/line-break.ts +0 -22
  158. package/src/css/property-descriptors/line-height.ts +0 -22
  159. package/src/css/property-descriptors/list-style-image.ts +0 -19
  160. package/src/css/property-descriptors/list-style-position.ts +0 -22
  161. package/src/css/property-descriptors/list-style-type.ts +0 -179
  162. package/src/css/property-descriptors/margin.ts +0 -13
  163. package/src/css/property-descriptors/mix-blend-mode.ts +0 -35
  164. package/src/css/property-descriptors/object-fit.ts +0 -39
  165. package/src/css/property-descriptors/opacity.ts +0 -15
  166. package/src/css/property-descriptors/overflow-wrap.ts +0 -22
  167. package/src/css/property-descriptors/overflow.ts +0 -34
  168. package/src/css/property-descriptors/padding.ts +0 -14
  169. package/src/css/property-descriptors/paint-order.ts +0 -42
  170. package/src/css/property-descriptors/position.ts +0 -30
  171. package/src/css/property-descriptors/quotes.ts +0 -57
  172. package/src/css/property-descriptors/rotate.ts +0 -34
  173. package/src/css/property-descriptors/text-align.ts +0 -26
  174. package/src/css/property-descriptors/text-decoration-color.ts +0 -9
  175. package/src/css/property-descriptors/text-decoration-line.ts +0 -38
  176. package/src/css/property-descriptors/text-decoration-style.ts +0 -32
  177. package/src/css/property-descriptors/text-decoration-thickness.ts +0 -30
  178. package/src/css/property-descriptors/text-overflow.ts +0 -23
  179. package/src/css/property-descriptors/text-shadow.ts +0 -52
  180. package/src/css/property-descriptors/text-transform.ts +0 -27
  181. package/src/css/property-descriptors/text-underline-offset.ts +0 -27
  182. package/src/css/property-descriptors/transform-origin.ts +0 -29
  183. package/src/css/property-descriptors/transform.ts +0 -74
  184. package/src/css/property-descriptors/visibility.ts +0 -25
  185. package/src/css/property-descriptors/webkit-line-clamp.ts +0 -30
  186. package/src/css/property-descriptors/webkit-text-stroke-color.ts +0 -8
  187. package/src/css/property-descriptors/webkit-text-stroke-width.ts +0 -15
  188. package/src/css/property-descriptors/word-break.ts +0 -25
  189. package/src/css/property-descriptors/writing-mode.ts +0 -37
  190. package/src/css/property-descriptors/z-index.ts +0 -27
  191. package/src/css/syntax/__tests__/tokernizer-tests.ts +0 -29
  192. package/src/css/syntax/parser.ts +0 -188
  193. package/src/css/syntax/tokenizer.ts +0 -822
  194. package/src/css/type-descriptor.ts +0 -7
  195. package/src/css/types/__tests__/color-tests.ts +0 -147
  196. package/src/css/types/__tests__/image-tests.ts +0 -239
  197. package/src/css/types/angle.ts +0 -86
  198. package/src/css/types/color-math.ts +0 -22
  199. package/src/css/types/color-spaces/a98.ts +0 -86
  200. package/src/css/types/color-spaces/p3.ts +0 -92
  201. package/src/css/types/color-spaces/pro-photo.ts +0 -87
  202. package/src/css/types/color-spaces/rec2020.ts +0 -90
  203. package/src/css/types/color-spaces/srgb.ts +0 -87
  204. package/src/css/types/color-utilities.ts +0 -452
  205. package/src/css/types/color.ts +0 -485
  206. package/src/css/types/functions/-prefix-linear-gradient.ts +0 -35
  207. package/src/css/types/functions/-prefix-radial-gradient.ts +0 -106
  208. package/src/css/types/functions/-webkit-gradient.ts +0 -69
  209. package/src/css/types/functions/__tests__/radial-gradient.ts +0 -69
  210. package/src/css/types/functions/counter.ts +0 -511
  211. package/src/css/types/functions/gradient.ts +0 -206
  212. package/src/css/types/functions/linear-gradient.ts +0 -28
  213. package/src/css/types/functions/radial-gradient.ts +0 -101
  214. package/src/css/types/image.ts +0 -120
  215. package/src/css/types/index.ts +0 -1
  216. package/src/css/types/length-percentage.ts +0 -137
  217. package/src/css/types/length.ts +0 -7
  218. package/src/css/types/time.ts +0 -20
  219. package/src/dom/__mocks__/document-cloner.ts +0 -22
  220. package/src/dom/__tests__/dom-normalizer.test.ts +0 -133
  221. package/src/dom/__tests__/element-container.test.ts +0 -129
  222. package/src/dom/document-cloner.ts +0 -929
  223. package/src/dom/dom-normalizer.ts +0 -133
  224. package/src/dom/element-container.ts +0 -75
  225. package/src/dom/elements/li-element-container.ts +0 -10
  226. package/src/dom/elements/ol-element-container.ts +0 -12
  227. package/src/dom/elements/select-element-container.ts +0 -10
  228. package/src/dom/elements/textarea-element-container.ts +0 -9
  229. package/src/dom/node-parser.ts +0 -177
  230. package/src/dom/node-type-guards.ts +0 -70
  231. package/src/dom/replaced-elements/canvas-element-container.ts +0 -15
  232. package/src/dom/replaced-elements/iframe-element-container.ts +0 -55
  233. package/src/dom/replaced-elements/image-element-container.ts +0 -16
  234. package/src/dom/replaced-elements/index.ts +0 -5
  235. package/src/dom/replaced-elements/input-element-container.ts +0 -105
  236. package/src/dom/replaced-elements/pseudo-elements.ts +0 -0
  237. package/src/dom/replaced-elements/svg-element-container.ts +0 -23
  238. package/src/dom/text-container.ts +0 -42
  239. package/src/global.d.ts +0 -19
  240. package/src/index.ts +0 -82
  241. package/src/invariant.ts +0 -5
  242. package/src/options.ts +0 -55
  243. package/src/render/__tests__/object-fit.test.ts +0 -85
  244. package/src/render/background.ts +0 -298
  245. package/src/render/bezier-curve.ts +0 -47
  246. package/src/render/border.ts +0 -165
  247. package/src/render/bound-curves.ts +0 -388
  248. package/src/render/box-sizing.ts +0 -31
  249. package/src/render/canvas/__tests__/background-renderer.test.ts +0 -72
  250. package/src/render/canvas/__tests__/border-renderer.test.ts +0 -24
  251. package/src/render/canvas/__tests__/effects-renderer.test.ts +0 -32
  252. package/src/render/canvas/__tests__/text-renderer.test.ts +0 -471
  253. package/src/render/canvas/background-renderer.ts +0 -271
  254. package/src/render/canvas/border-renderer.ts +0 -224
  255. package/src/render/canvas/canvas-path.ts +0 -31
  256. package/src/render/canvas/canvas-renderer.ts +0 -641
  257. package/src/render/canvas/effects-renderer.ts +0 -130
  258. package/src/render/canvas/foreignobject-renderer.ts +0 -53
  259. package/src/render/canvas/text-renderer.ts +0 -700
  260. package/src/render/effects.ts +0 -75
  261. package/src/render/font-metrics.ts +0 -72
  262. package/src/render/object-fit.ts +0 -100
  263. package/src/render/path.ts +0 -37
  264. package/src/render/renderer-interface.ts +0 -28
  265. package/src/render/stacking-context.ts +0 -386
  266. package/src/render/vector.ts +0 -19
@@ -1,69 +0,0 @@
1
- import { deepStrictEqual } from 'assert';
2
- import { CSSFunction, Parser } from '../../../syntax/parser';
3
- import { radialGradient } from '../radial-gradient';
4
- import { CSSImageType, CSSRadialExtent, CSSRadialShape } from '../../image';
5
- import { color } from '../../color';
6
- import { TokenType } from '../../../syntax/tokenizer';
7
- import { FIFTY_PERCENT, HUNDRED_PERCENT } from '../../length-percentage';
8
- import { Context } from '../../../../core/context';
9
-
10
- const parse = (value: string) => radialGradient({} as Context, (Parser.parseValues(value)[0] as CSSFunction).values);
11
- const colorParse = (value: string) => color.parse({} as Context, Parser.parseValue(value));
12
-
13
- describe('functions', () => {
14
- describe('radial-gradient', () => {
15
- describe('parsing', () => {
16
- it('radial-gradient(circle closest-side, #3f87a6, #ebf8e1, #f69d3c)', () =>
17
- deepStrictEqual(parse('radial-gradient(ellipse closest-side, #3f87a6, #ebf8e1, #f69d3c)'), {
18
- type: CSSImageType.RADIAL_GRADIENT,
19
- shape: CSSRadialShape.ELLIPSE,
20
- size: CSSRadialExtent.CLOSEST_SIDE,
21
- position: [],
22
- stops: [
23
- { color: colorParse('#3f87a6'), stop: null },
24
- { color: colorParse('#ebf8e1'), stop: null },
25
- { color: colorParse('#f69d3c'), stop: null }
26
- ]
27
- }));
28
- it('radial-gradient(circle at center, red 0, blue, green 100%)', () =>
29
- deepStrictEqual(parse('radial-gradient(circle at center, red 0, blue, green 100%)'), {
30
- type: CSSImageType.RADIAL_GRADIENT,
31
- shape: CSSRadialShape.CIRCLE,
32
- size: CSSRadialExtent.FARTHEST_CORNER,
33
- position: [FIFTY_PERCENT],
34
- stops: [
35
- { color: colorParse('red'), stop: { type: TokenType.NUMBER_TOKEN, number: 0, flags: 4 } },
36
- { color: colorParse('blue'), stop: null },
37
- {
38
- color: colorParse('green'),
39
- stop: { type: TokenType.PERCENTAGE_TOKEN, number: 100, flags: 4 }
40
- }
41
- ]
42
- }));
43
- it('radial-gradient(circle at 100%, #333, #333 50%, #eee 75%, #333 75%)', () =>
44
- deepStrictEqual(parse('radial-gradient(circle at 100%, #333, #333 50%, #eee 75%, #333 75%)'), {
45
- type: CSSImageType.RADIAL_GRADIENT,
46
- shape: CSSRadialShape.CIRCLE,
47
- size: CSSRadialExtent.FARTHEST_CORNER,
48
- position: [HUNDRED_PERCENT],
49
- stops: [
50
- { color: colorParse('#333'), stop: null },
51
- { color: colorParse('#333'), stop: { type: TokenType.PERCENTAGE_TOKEN, number: 50, flags: 4 } },
52
- { color: colorParse('#eee'), stop: { type: TokenType.PERCENTAGE_TOKEN, number: 75, flags: 4 } },
53
- { color: colorParse('#333'), stop: { type: TokenType.PERCENTAGE_TOKEN, number: 75, flags: 4 } }
54
- ]
55
- }));
56
- it('radial-gradient(20px, red, blue)', () =>
57
- deepStrictEqual(parse('radial-gradient(20px, red, blue)'), {
58
- type: CSSImageType.RADIAL_GRADIENT,
59
- shape: CSSRadialShape.CIRCLE,
60
- size: [{ type: TokenType.DIMENSION_TOKEN, number: 20, flags: 4, unit: 'px' }],
61
- position: [],
62
- stops: [
63
- { color: colorParse('red'), stop: null },
64
- { color: colorParse('blue'), stop: null }
65
- ]
66
- }));
67
- });
68
- });
69
- });
@@ -1,511 +0,0 @@
1
- import { LIST_STYLE_TYPE } from '../../property-descriptors/list-style-type';
2
- import { fromCodePoint } from 'css-line-break';
3
- import { contains } from '../../../core/bitwise';
4
- import { CSSParsedCounterDeclaration } from '../../index';
5
-
6
- export class CounterState {
7
- private readonly counters: { [key: string]: number[] } = {};
8
-
9
- getCounterValue(name: string): number {
10
- const counter = this.counters[name];
11
-
12
- if (counter && counter.length) {
13
- return counter[counter.length - 1];
14
- }
15
- return 1;
16
- }
17
-
18
- getCounterValues(name: string): readonly number[] {
19
- const counter = this.counters[name];
20
- return counter ? counter : [];
21
- }
22
-
23
- pop(counters: string[]): void {
24
- counters.forEach((counter) => this.counters[counter].pop());
25
- }
26
-
27
- parse(style: CSSParsedCounterDeclaration): string[] {
28
- const counterIncrement = style.counterIncrement;
29
- const counterReset = style.counterReset;
30
- let canReset = true;
31
-
32
- if (counterIncrement !== null) {
33
- counterIncrement.forEach((entry) => {
34
- const counter = this.counters[entry.counter];
35
- if (counter && entry.increment !== 0) {
36
- canReset = false;
37
- if (!counter.length) {
38
- counter.push(1);
39
- }
40
- counter[Math.max(0, counter.length - 1)] += entry.increment;
41
- }
42
- });
43
- }
44
-
45
- const counterNames: string[] = [];
46
- if (canReset) {
47
- counterReset.forEach((entry) => {
48
- let counter = this.counters[entry.counter];
49
- counterNames.push(entry.counter);
50
- if (!counter) {
51
- counter = this.counters[entry.counter] = [];
52
- }
53
- counter.push(entry.reset);
54
- });
55
- }
56
-
57
- return counterNames;
58
- }
59
- }
60
-
61
- interface CounterSymbols {
62
- integers: number[];
63
- values: string[];
64
- }
65
-
66
- const ROMAN_UPPER: CounterSymbols = {
67
- integers: [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1],
68
- values: ['M', 'CM', 'D', 'CD', 'C', 'XC', 'L', 'XL', 'X', 'IX', 'V', 'IV', 'I']
69
- };
70
-
71
- const ARMENIAN: CounterSymbols = {
72
- integers: [
73
- 9000, 8000, 7000, 6000, 5000, 4000, 3000, 2000, 1000, 900, 800, 700, 600, 500, 400, 300, 200, 100, 90, 80, 70,
74
- 60, 50, 40, 30, 20, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1
75
- ],
76
- values: [
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
- 'Գ',
111
- 'Բ',
112
- 'Ա'
113
- ]
114
- };
115
-
116
- const HEBREW: CounterSymbols = {
117
- integers: [
118
- 10000, 9000, 8000, 7000, 6000, 5000, 4000, 3000, 2000, 1000, 400, 300, 200, 100, 90, 80, 70, 60, 50, 40, 30, 20,
119
- 19, 18, 17, 16, 15, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1
120
- ],
121
- values: [
122
- 'י׳',
123
- 'ט׳',
124
- 'ח׳',
125
- 'ז׳',
126
- 'ו׳',
127
- 'ה׳',
128
- 'ד׳',
129
- 'ג׳',
130
- 'ב׳',
131
- 'א׳',
132
- 'ת',
133
- 'ש',
134
- 'ר',
135
- 'ק',
136
- 'צ',
137
- 'פ',
138
- 'ע',
139
- 'ס',
140
- 'נ',
141
- 'מ',
142
- 'ל',
143
- 'כ',
144
- 'יט',
145
- 'יח',
146
- 'יז',
147
- 'טז',
148
- 'טו',
149
- 'י',
150
- 'ט',
151
- 'ח',
152
- 'ז',
153
- 'ו',
154
- 'ה',
155
- 'ד',
156
- 'ג',
157
- 'ב',
158
- 'א'
159
- ]
160
- };
161
-
162
- const GEORGIAN: CounterSymbols = {
163
- integers: [
164
- 10000, 9000, 8000, 7000, 6000, 5000, 4000, 3000, 2000, 1000, 900, 800, 700, 600, 500, 400, 300, 200, 100, 90,
165
- 80, 70, 60, 50, 40, 30, 20, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1
166
- ],
167
- values: [
168
- 'ჵ',
169
- 'ჰ',
170
- 'ჯ',
171
- 'ჴ',
172
- 'ხ',
173
- 'ჭ',
174
- 'წ',
175
- 'ძ',
176
- 'ც',
177
- 'ჩ',
178
- 'შ',
179
- 'ყ',
180
- 'ღ',
181
- 'ქ',
182
- 'ფ',
183
- 'ჳ',
184
- 'ტ',
185
- 'ს',
186
- 'რ',
187
- 'ჟ',
188
- 'პ',
189
- 'ო',
190
- 'ჲ',
191
- 'ნ',
192
- 'მ',
193
- 'ლ',
194
- 'კ',
195
- 'ი',
196
- 'თ',
197
- 'ჱ',
198
- 'ზ',
199
- 'ვ',
200
- 'ე',
201
- 'დ',
202
- 'გ',
203
- 'ბ',
204
- 'ა'
205
- ]
206
- };
207
-
208
- const createAdditiveCounter = (
209
- value: number,
210
- min: number,
211
- max: number,
212
- symbols: CounterSymbols,
213
- fallback: LIST_STYLE_TYPE,
214
- suffix: string
215
- ) => {
216
- if (value < min || value > max) {
217
- return createCounterText(value, fallback, suffix.length > 0);
218
- }
219
-
220
- return (
221
- symbols.integers.reduce((string, integer, index) => {
222
- while (value >= integer) {
223
- value -= integer;
224
- string += symbols.values[index];
225
- }
226
- return string;
227
- }, '') + suffix
228
- );
229
- };
230
-
231
- const createCounterStyleWithSymbolResolver = (
232
- value: number,
233
- codePointRangeLength: number,
234
- isNumeric: boolean,
235
- resolver: (codePoint: number) => string
236
- ): string => {
237
- let string = '';
238
-
239
- do {
240
- if (!isNumeric) {
241
- value--;
242
- }
243
- string = resolver(value) + string;
244
- value /= codePointRangeLength;
245
- } while (value * codePointRangeLength >= codePointRangeLength);
246
-
247
- return string;
248
- };
249
-
250
- const createCounterStyleFromRange = (
251
- value: number,
252
- codePointRangeStart: number,
253
- codePointRangeEnd: number,
254
- isNumeric: boolean,
255
- suffix: string
256
- ): string => {
257
- const codePointRangeLength = codePointRangeEnd - codePointRangeStart + 1;
258
-
259
- return (
260
- (value < 0 ? '-' : '') +
261
- (createCounterStyleWithSymbolResolver(Math.abs(value), codePointRangeLength, isNumeric, (codePoint) =>
262
- fromCodePoint(Math.floor(codePoint % codePointRangeLength) + codePointRangeStart)
263
- ) +
264
- suffix)
265
- );
266
- };
267
-
268
- const createCounterStyleFromSymbols = (value: number, symbols: string, suffix = '. '): string => {
269
- const codePointRangeLength = symbols.length;
270
- return (
271
- createCounterStyleWithSymbolResolver(
272
- Math.abs(value),
273
- codePointRangeLength,
274
- false,
275
- (codePoint) => symbols[Math.floor(codePoint % codePointRangeLength)]
276
- ) + suffix
277
- );
278
- };
279
-
280
- const CJK_ZEROS = 1 << 0;
281
- const CJK_TEN_COEFFICIENTS = 1 << 1;
282
- const CJK_TEN_HIGH_COEFFICIENTS = 1 << 2;
283
- const CJK_HUNDRED_COEFFICIENTS = 1 << 3;
284
-
285
- const createCJKCounter = (
286
- value: number,
287
- numbers: string,
288
- multipliers: string,
289
- negativeSign: string,
290
- suffix: string,
291
- flags: number
292
- ): string => {
293
- if (value < -9999 || value > 9999) {
294
- return createCounterText(value, LIST_STYLE_TYPE.CJK_DECIMAL, suffix.length > 0);
295
- }
296
- let tmp = Math.abs(value);
297
- let string = suffix;
298
-
299
- if (tmp === 0) {
300
- return numbers[0] + string;
301
- }
302
-
303
- for (let digit = 0; tmp > 0 && digit <= 4; digit++) {
304
- const coefficient = tmp % 10;
305
-
306
- if (coefficient === 0 && contains(flags, CJK_ZEROS) && string !== '') {
307
- string = numbers[coefficient] + string;
308
- } else if (
309
- coefficient > 1 ||
310
- (coefficient === 1 && digit === 0) ||
311
- (coefficient === 1 && digit === 1 && contains(flags, CJK_TEN_COEFFICIENTS)) ||
312
- (coefficient === 1 && digit === 1 && contains(flags, CJK_TEN_HIGH_COEFFICIENTS) && value > 100) ||
313
- (coefficient === 1 && digit > 1 && contains(flags, CJK_HUNDRED_COEFFICIENTS))
314
- ) {
315
- string = numbers[coefficient] + (digit > 0 ? multipliers[digit - 1] : '') + string;
316
- } else if (coefficient === 1 && digit > 0) {
317
- string = multipliers[digit - 1] + string;
318
- }
319
- tmp = Math.floor(tmp / 10);
320
- }
321
-
322
- return (value < 0 ? negativeSign : '') + string;
323
- };
324
-
325
- const CHINESE_INFORMAL_MULTIPLIERS = '十百千萬';
326
- const CHINESE_FORMAL_MULTIPLIERS = '拾佰仟萬';
327
- const JAPANESE_NEGATIVE = 'マイナス';
328
- const KOREAN_NEGATIVE = '마이너스';
329
-
330
- export const createCounterText = (value: number, type: LIST_STYLE_TYPE, appendSuffix: boolean): string => {
331
- const defaultSuffix = appendSuffix ? '. ' : '';
332
- const cjkSuffix = appendSuffix ? '、' : '';
333
- const koreanSuffix = appendSuffix ? ', ' : '';
334
- const spaceSuffix = appendSuffix ? ' ' : '';
335
- switch (type) {
336
- case LIST_STYLE_TYPE.DISC:
337
- return '•' + spaceSuffix;
338
- case LIST_STYLE_TYPE.CIRCLE:
339
- return '◦' + spaceSuffix;
340
- case LIST_STYLE_TYPE.SQUARE:
341
- return '◾' + spaceSuffix;
342
- case LIST_STYLE_TYPE.DECIMAL_LEADING_ZERO:
343
- const string = createCounterStyleFromRange(value, 48, 57, true, defaultSuffix);
344
- return string.length < 4 ? `0${string}` : string;
345
- case LIST_STYLE_TYPE.CJK_DECIMAL:
346
- return createCounterStyleFromSymbols(value, '〇一二三四五六七八九', cjkSuffix);
347
- case LIST_STYLE_TYPE.LOWER_ROMAN:
348
- return createAdditiveCounter(
349
- value,
350
- 1,
351
- 3999,
352
- ROMAN_UPPER,
353
- LIST_STYLE_TYPE.DECIMAL,
354
- defaultSuffix
355
- ).toLowerCase();
356
- case LIST_STYLE_TYPE.UPPER_ROMAN:
357
- return createAdditiveCounter(value, 1, 3999, ROMAN_UPPER, LIST_STYLE_TYPE.DECIMAL, defaultSuffix);
358
- case LIST_STYLE_TYPE.LOWER_GREEK:
359
- return createCounterStyleFromRange(value, 945, 969, false, defaultSuffix);
360
- case LIST_STYLE_TYPE.LOWER_ALPHA:
361
- return createCounterStyleFromRange(value, 97, 122, false, defaultSuffix);
362
- case LIST_STYLE_TYPE.UPPER_ALPHA:
363
- return createCounterStyleFromRange(value, 65, 90, false, defaultSuffix);
364
- case LIST_STYLE_TYPE.ARABIC_INDIC:
365
- return createCounterStyleFromRange(value, 1632, 1641, true, defaultSuffix);
366
- case LIST_STYLE_TYPE.ARMENIAN:
367
- case LIST_STYLE_TYPE.UPPER_ARMENIAN:
368
- return createAdditiveCounter(value, 1, 9999, ARMENIAN, LIST_STYLE_TYPE.DECIMAL, defaultSuffix);
369
- case LIST_STYLE_TYPE.LOWER_ARMENIAN:
370
- return createAdditiveCounter(
371
- value,
372
- 1,
373
- 9999,
374
- ARMENIAN,
375
- LIST_STYLE_TYPE.DECIMAL,
376
- defaultSuffix
377
- ).toLowerCase();
378
- case LIST_STYLE_TYPE.BENGALI:
379
- return createCounterStyleFromRange(value, 2534, 2543, true, defaultSuffix);
380
- case LIST_STYLE_TYPE.CAMBODIAN:
381
- case LIST_STYLE_TYPE.KHMER:
382
- return createCounterStyleFromRange(value, 6112, 6121, true, defaultSuffix);
383
- case LIST_STYLE_TYPE.CJK_EARTHLY_BRANCH:
384
- return createCounterStyleFromSymbols(value, '子丑寅卯辰巳午未申酉戌亥', cjkSuffix);
385
- case LIST_STYLE_TYPE.CJK_HEAVENLY_STEM:
386
- return createCounterStyleFromSymbols(value, '甲乙丙丁戊己庚辛壬癸', cjkSuffix);
387
- case LIST_STYLE_TYPE.CJK_IDEOGRAPHIC:
388
- case LIST_STYLE_TYPE.TRAD_CHINESE_INFORMAL:
389
- return createCJKCounter(
390
- value,
391
- '零一二三四五六七八九',
392
- CHINESE_INFORMAL_MULTIPLIERS,
393
- '負',
394
- cjkSuffix,
395
- CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS | CJK_HUNDRED_COEFFICIENTS
396
- );
397
- case LIST_STYLE_TYPE.TRAD_CHINESE_FORMAL:
398
- return createCJKCounter(
399
- value,
400
- '零壹貳參肆伍陸柒捌玖',
401
- CHINESE_FORMAL_MULTIPLIERS,
402
- '負',
403
- cjkSuffix,
404
- CJK_ZEROS | CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS | CJK_HUNDRED_COEFFICIENTS
405
- );
406
- case LIST_STYLE_TYPE.SIMP_CHINESE_INFORMAL:
407
- return createCJKCounter(
408
- value,
409
- '零一二三四五六七八九',
410
- CHINESE_INFORMAL_MULTIPLIERS,
411
- '负',
412
- cjkSuffix,
413
- CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS | CJK_HUNDRED_COEFFICIENTS
414
- );
415
- case LIST_STYLE_TYPE.SIMP_CHINESE_FORMAL:
416
- return createCJKCounter(
417
- value,
418
- '零壹贰叁肆伍陆柒捌玖',
419
- CHINESE_FORMAL_MULTIPLIERS,
420
- '负',
421
- cjkSuffix,
422
- CJK_ZEROS | CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS | CJK_HUNDRED_COEFFICIENTS
423
- );
424
- case LIST_STYLE_TYPE.JAPANESE_INFORMAL:
425
- return createCJKCounter(value, '〇一二三四五六七八九', '十百千万', JAPANESE_NEGATIVE, cjkSuffix, 0);
426
- case LIST_STYLE_TYPE.JAPANESE_FORMAL:
427
- return createCJKCounter(
428
- value,
429
- '零壱弐参四伍六七八九',
430
- '拾百千万',
431
- JAPANESE_NEGATIVE,
432
- cjkSuffix,
433
- CJK_ZEROS | CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS
434
- );
435
- case LIST_STYLE_TYPE.KOREAN_HANGUL_FORMAL:
436
- return createCJKCounter(
437
- value,
438
- '영일이삼사오육칠팔구',
439
- '십백천만',
440
- KOREAN_NEGATIVE,
441
- koreanSuffix,
442
- CJK_ZEROS | CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS
443
- );
444
- case LIST_STYLE_TYPE.KOREAN_HANJA_INFORMAL:
445
- return createCJKCounter(value, '零一二三四五六七八九', '十百千萬', KOREAN_NEGATIVE, koreanSuffix, 0);
446
- case LIST_STYLE_TYPE.KOREAN_HANJA_FORMAL:
447
- return createCJKCounter(
448
- value,
449
- '零壹貳參四五六七八九',
450
- '拾百千',
451
- KOREAN_NEGATIVE,
452
- koreanSuffix,
453
- CJK_ZEROS | CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS
454
- );
455
- case LIST_STYLE_TYPE.DEVANAGARI:
456
- return createCounterStyleFromRange(value, 0x966, 0x96f, true, defaultSuffix);
457
- case LIST_STYLE_TYPE.GEORGIAN:
458
- return createAdditiveCounter(value, 1, 19999, GEORGIAN, LIST_STYLE_TYPE.DECIMAL, defaultSuffix);
459
- case LIST_STYLE_TYPE.GUJARATI:
460
- return createCounterStyleFromRange(value, 0xae6, 0xaef, true, defaultSuffix);
461
- case LIST_STYLE_TYPE.GURMUKHI:
462
- return createCounterStyleFromRange(value, 0xa66, 0xa6f, true, defaultSuffix);
463
- case LIST_STYLE_TYPE.HEBREW:
464
- return createAdditiveCounter(value, 1, 10999, HEBREW, LIST_STYLE_TYPE.DECIMAL, defaultSuffix);
465
- case LIST_STYLE_TYPE.HIRAGANA:
466
- return createCounterStyleFromSymbols(
467
- value,
468
- 'あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわゐゑをん'
469
- );
470
- case LIST_STYLE_TYPE.HIRAGANA_IROHA:
471
- return createCounterStyleFromSymbols(
472
- value,
473
- 'いろはにほへとちりぬるをわかよたれそつねならむうゐのおくやまけふこえてあさきゆめみしゑひもせす'
474
- );
475
- case LIST_STYLE_TYPE.KANNADA:
476
- return createCounterStyleFromRange(value, 0xce6, 0xcef, true, defaultSuffix);
477
- case LIST_STYLE_TYPE.KATAKANA:
478
- return createCounterStyleFromSymbols(
479
- value,
480
- 'アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヰヱヲン',
481
- cjkSuffix
482
- );
483
- case LIST_STYLE_TYPE.KATAKANA_IROHA:
484
- return createCounterStyleFromSymbols(
485
- value,
486
- 'イロハニホヘトチリヌルヲワカヨタレソツネナラムウヰノオクヤマケフコエテアサキユメミシヱヒモセス',
487
- cjkSuffix
488
- );
489
- case LIST_STYLE_TYPE.LAO:
490
- return createCounterStyleFromRange(value, 0xed0, 0xed9, true, defaultSuffix);
491
- case LIST_STYLE_TYPE.MONGOLIAN:
492
- return createCounterStyleFromRange(value, 0x1810, 0x1819, true, defaultSuffix);
493
- case LIST_STYLE_TYPE.MYANMAR:
494
- return createCounterStyleFromRange(value, 0x1040, 0x1049, true, defaultSuffix);
495
- case LIST_STYLE_TYPE.ORIYA:
496
- return createCounterStyleFromRange(value, 0xb66, 0xb6f, true, defaultSuffix);
497
- case LIST_STYLE_TYPE.PERSIAN:
498
- return createCounterStyleFromRange(value, 0x6f0, 0x6f9, true, defaultSuffix);
499
- case LIST_STYLE_TYPE.TAMIL:
500
- return createCounterStyleFromRange(value, 0xbe6, 0xbef, true, defaultSuffix);
501
- case LIST_STYLE_TYPE.TELUGU:
502
- return createCounterStyleFromRange(value, 0xc66, 0xc6f, true, defaultSuffix);
503
- case LIST_STYLE_TYPE.THAI:
504
- return createCounterStyleFromRange(value, 0xe50, 0xe59, true, defaultSuffix);
505
- case LIST_STYLE_TYPE.TIBETAN:
506
- return createCounterStyleFromRange(value, 0xf20, 0xf29, true, defaultSuffix);
507
- case LIST_STYLE_TYPE.DECIMAL:
508
- default:
509
- return createCounterStyleFromRange(value, 48, 57, true, defaultSuffix);
510
- }
511
- };