chuijs 4.0.2 → 4.0.4
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/CHANGELOG.md +597 -0
- package/README.md +43 -644
- package/framework/appLayout/default/chui_app_layout.js +602 -496
- package/framework/appLayout/default/global_style.css +288 -97
- package/framework/appLayout/default/main_theme_style.css +188 -101
- package/framework/components/chui_accordion/accordion.js +38 -35
- package/framework/components/chui_accordion/styles.css +13 -12
- package/framework/components/chui_action_sheet/action_sheet.js +93 -64
- package/framework/components/chui_action_sheet/styles.css +12 -5
- package/framework/components/chui_actions_bar/actions_bar.js +338 -0
- package/framework/components/chui_actions_bar/styles.css +139 -0
- package/framework/components/chui_affix/affix.js +16 -11
- package/framework/components/chui_affix/styles.css +5 -0
- package/framework/components/chui_alert/alert.js +34 -19
- package/framework/components/chui_alert/styles.css +7 -0
- package/framework/components/chui_avatar/avatar.js +36 -35
- package/framework/components/chui_avatar/styles.css +1 -1
- package/framework/components/chui_avatar_group/avatar_group.js +25 -23
- package/framework/components/chui_avatar_group/styles.css +1 -1
- package/framework/components/chui_backtop/backtop.js +60 -21
- package/framework/components/chui_backtop/styles.css +21 -0
- package/framework/components/chui_badge/badge.js +30 -28
- package/framework/components/chui_badge/styles.css +6 -6
- package/framework/components/chui_banner/banner.js +222 -0
- package/framework/components/chui_banner/styles.css +170 -0
- package/framework/components/chui_breadcrumb/breadcrumb.js +15 -13
- package/framework/components/chui_breadcrumb/styles.css +1 -1
- package/framework/components/chui_button/button.js +52 -36
- package/framework/components/chui_button/styles.css +7 -7
- package/framework/components/chui_calendar/calendar.js +18 -16
- package/framework/components/chui_card/card.js +52 -32
- package/framework/components/chui_card_scroll/card_scroll.js +169 -0
- package/framework/components/chui_card_scroll/styles.css +86 -0
- package/framework/components/chui_chat/chat.js +140 -79
- package/framework/components/chui_chat/styles.css +18 -7
- package/framework/components/chui_clipboard_history/clipboard_history.js +53 -39
- package/framework/components/chui_clipboard_history/styles.css +13 -9
- package/framework/components/chui_code/code.js +10 -10
- package/framework/components/chui_code/styles.css +4 -4
- package/framework/components/chui_code_editor/code_editor.js +73 -57
- package/framework/components/chui_code_editor/styles.css +6 -5
- package/framework/components/chui_command_palette/command_palette.js +87 -64
- package/framework/components/chui_command_palette/styles.css +5 -5
- package/framework/components/chui_console/console.js +13 -13
- package/framework/components/chui_console/styles.css +6 -3
- package/framework/components/chui_content_block/content_block.js +35 -21
- package/framework/components/chui_content_block/styles.css +2 -2
- package/framework/components/chui_context_menu/context_menu.js +171 -58
- package/framework/components/chui_context_menu/styles.css +82 -8
- package/framework/components/chui_custom_element/custom_element.js +25 -18
- package/framework/components/chui_data_grid/data_grid.js +633 -471
- package/framework/components/chui_data_grid/styles.css +24 -22
- package/framework/components/chui_descriptions/descriptions.js +34 -17
- package/framework/components/chui_descriptions/styles.css +1 -1
- package/framework/components/chui_details/details.js +42 -36
- package/framework/components/chui_details/styles.css +12 -11
- package/framework/components/chui_diff_viewer/diff_viewer.js +172 -147
- package/framework/components/chui_diff_viewer/styles.css +10 -10
- package/framework/components/chui_divider/divider.js +19 -17
- package/framework/components/chui_divider/styles.css +2 -2
- package/framework/components/chui_drawer/drawer.js +63 -38
- package/framework/components/chui_drawer/styles.css +18 -4
- package/framework/components/chui_drop_zone/drop_zone.js +37 -27
- package/framework/components/chui_drop_zone/styles.css +10 -6
- package/framework/components/chui_empty_state/empty_state.js +20 -15
- package/framework/components/chui_fieldset/fieldset.js +40 -23
- package/framework/components/chui_fieldset/styles.css +6 -6
- package/framework/components/chui_file_explorer/file_explorer.js +260 -189
- package/framework/components/chui_file_explorer/styles.css +8 -7
- package/framework/components/chui_form/form.js +40 -28
- package/framework/components/chui_form/styles.css +1 -1
- package/framework/components/chui_gantt/gantt.js +102 -78
- package/framework/components/chui_gantt/styles.css +5 -5
- package/framework/components/chui_graphs/graphs.js +376 -239
- package/framework/components/chui_graphs/styles.css +27 -6
- package/framework/components/chui_hero/hero.js +98 -37
- package/framework/components/chui_hero/styles.css +176 -7
- package/framework/components/chui_html_block/html_block.js +8 -8
- package/framework/components/chui_html_block/styles.css +3 -3
- package/framework/components/chui_hx/hx.js +3 -3
- package/framework/components/chui_hx/styles.css +13 -6
- package/framework/components/chui_icons/icons.js +2115 -2115
- package/framework/components/chui_icons/styles.css +4 -3
- package/framework/components/chui_inputs/chui_check_box/check_box.js +31 -19
- package/framework/components/chui_inputs/chui_check_box/styles.css +30 -21
- package/framework/components/chui_inputs/chui_chips/chips.js +141 -70
- package/framework/components/chui_inputs/chui_chips/styles.css +32 -7
- package/framework/components/chui_inputs/chui_color_picker/color_picker.js +55 -38
- package/framework/components/chui_inputs/chui_color_picker/styles.css +7 -7
- package/framework/components/chui_inputs/chui_combo_box/combo_box.js +127 -109
- package/framework/components/chui_inputs/chui_combo_box/styles.css +23 -21
- package/framework/components/chui_inputs/chui_date/date.js +161 -127
- package/framework/components/chui_inputs/chui_date/styles.css +20 -19
- package/framework/components/chui_inputs/chui_date_range/date_range.js +61 -50
- package/framework/components/chui_inputs/chui_date_range/styles.css +3 -3
- package/framework/components/chui_inputs/chui_datetime/datetime.js +47 -39
- package/framework/components/chui_inputs/chui_datetime/styles.css +3 -3
- package/framework/components/chui_inputs/chui_email/email.js +48 -36
- package/framework/components/chui_inputs/chui_email/styles.css +11 -11
- package/framework/components/chui_inputs/chui_file/file.js +71 -44
- package/framework/components/chui_inputs/chui_file/styles.css +23 -19
- package/framework/components/chui_inputs/chui_hotkey/hotkey.js +101 -76
- package/framework/components/chui_inputs/chui_hotkey/styles.css +6 -6
- package/framework/components/chui_inputs/chui_masked/masked.js +83 -72
- package/framework/components/chui_inputs/chui_masked/styles.css +5 -5
- package/framework/components/chui_inputs/chui_mention/mention.js +87 -40
- package/framework/components/chui_inputs/chui_mention/styles.css +14 -8
- package/framework/components/chui_inputs/chui_multi_combo_box/multi_combo_box.js +242 -212
- package/framework/components/chui_inputs/chui_multi_combo_box/styles.css +23 -15
- package/framework/components/chui_inputs/chui_number/number.js +84 -70
- package/framework/components/chui_inputs/chui_number/styles.css +13 -13
- package/framework/components/chui_inputs/chui_otp/otp.js +71 -62
- package/framework/components/chui_inputs/chui_otp/styles.css +5 -5
- package/framework/components/chui_inputs/chui_password/password.js +72 -56
- package/framework/components/chui_inputs/chui_password/styles.css +15 -15
- package/framework/components/chui_inputs/chui_radio_button/radio_button.js +37 -25
- package/framework/components/chui_inputs/chui_radio_button/styles.css +22 -22
- package/framework/components/chui_inputs/chui_rating/rating.js +54 -50
- package/framework/components/chui_inputs/chui_rating/styles.css +3 -3
- package/framework/components/chui_inputs/chui_select_box/select_box.js +132 -108
- package/framework/components/chui_inputs/chui_select_box/styles.css +21 -21
- package/framework/components/chui_inputs/chui_slider/slider.js +41 -38
- package/framework/components/chui_inputs/chui_slider/styles.css +7 -5
- package/framework/components/chui_inputs/chui_text/styles.css +14 -14
- package/framework/components/chui_inputs/chui_text/text.js +69 -52
- package/framework/components/chui_inputs/chui_text_area/styles.css +14 -14
- package/framework/components/chui_inputs/chui_text_area/text_area.js +59 -36
- package/framework/components/chui_inputs/chui_time/styles.css +18 -20
- package/framework/components/chui_inputs/chui_time/time.js +71 -49
- package/framework/components/chui_inputs/chui_toggle/styles.css +13 -6
- package/framework/components/chui_inputs/chui_toggle/toggle.js +27 -27
- package/framework/components/chui_json_editor/json_editor.js +137 -127
- package/framework/components/chui_json_editor/styles.css +5 -5
- package/framework/components/chui_json_viewer/json_viewer.js +133 -114
- package/framework/components/chui_json_viewer/styles.css +9 -8
- package/framework/components/chui_kanban/kanban.js +78 -60
- package/framework/components/chui_kanban/styles.css +8 -4
- package/framework/components/chui_kbd/kbd.js +12 -10
- package/framework/components/chui_kbd/styles.css +1 -1
- package/framework/components/chui_label/label.js +31 -29
- package/framework/components/chui_label/styles.css +3 -3
- package/framework/components/chui_link/link.js +36 -29
- package/framework/components/chui_link/styles.css +11 -4
- package/framework/components/chui_list/list.js +42 -38
- package/framework/components/chui_list/styles.css +4 -3
- package/framework/components/chui_markdown_editor/markdown_editor.js +125 -109
- package/framework/components/chui_markdown_editor/styles.css +5 -5
- package/framework/components/chui_media/audio.js +457 -364
- package/framework/components/chui_media/audio_styles.css +74 -37
- package/framework/components/chui_media/image.js +99 -64
- package/framework/components/chui_media/image_compare.js +86 -55
- package/framework/components/chui_media/image_compare_styles.css +5 -5
- package/framework/components/chui_media/image_styles.css +4 -4
- package/framework/components/chui_media/video.js +264 -171
- package/framework/components/chui_media/video_styles.css +57 -24
- package/framework/components/chui_menu_bar/menu_bar.js +67 -65
- package/framework/components/chui_menu_bar/styles.css +14 -12
- package/framework/components/chui_message_bar/message_bar.js +551 -0
- package/framework/components/chui_message_bar/styles.css +248 -0
- package/framework/components/chui_modal/modal.js +81 -56
- package/framework/components/chui_modal/styles.css +3 -2
- package/framework/components/chui_notification/notification.js +107 -69
- package/framework/components/chui_notification/notification_download.js +28 -77
- package/framework/components/chui_notification/notification_download_card.js +115 -0
- package/framework/components/chui_notification/notification_download_progress.css +5 -4
- package/framework/components/chui_notification/notification_download_progress.js +73 -105
- package/framework/components/chui_notification/notification_update.js +44 -37
- package/framework/components/chui_notification/status_plate.css +3 -3
- package/framework/components/chui_notification/status_plate.js +2 -2
- package/framework/components/chui_notification/styles.css +6 -1
- package/framework/components/chui_notification/styles_download.css +2 -2
- package/framework/components/chui_notification/styles_update.css +3 -3
- package/framework/components/chui_org_chart/org_chart.js +101 -62
- package/framework/components/chui_org_chart/styles.css +2 -2
- package/framework/components/chui_pagination/pagination.js +65 -30
- package/framework/components/chui_pagination/styles.css +1 -1
- package/framework/components/chui_paragraph/paragraph.js +2 -2
- package/framework/components/chui_paragraph/styles.css +3 -3
- package/framework/components/chui_popover/popover.js +77 -50
- package/framework/components/chui_popover/styles.css +1 -1
- package/framework/components/chui_popups/popups.js +210 -181
- package/framework/components/chui_popups/styles.css +7 -7
- package/framework/components/chui_print_button/print_button.js +48 -33
- package/framework/components/chui_progress_bar/progress_bar.js +49 -19
- package/framework/components/chui_progress_bar/styles.css +6 -6
- package/framework/components/chui_progress_ring/progress_ring.js +32 -30
- package/framework/components/chui_progress_ring/styles.css +1 -1
- package/framework/components/chui_qrcode/qrcode.js +85 -41
- package/framework/components/chui_query_builder/query_builder.js +263 -170
- package/framework/components/chui_query_builder/styles.css +4 -4
- package/framework/components/chui_radio_group/radio_group.js +36 -26
- package/framework/components/chui_radio_group/styles.css +2 -2
- package/framework/components/chui_result/result.js +41 -31
- package/framework/components/chui_result/styles.css +3 -3
- package/framework/components/chui_scheduler/scheduler.js +126 -104
- package/framework/components/chui_scheduler/styles.css +11 -7
- package/framework/components/chui_screen_spinner/screen_spinner.js +167 -0
- package/framework/components/chui_screen_spinner/styles.css +49 -0
- package/framework/components/chui_segmented_control/segmented_control.js +90 -27
- package/framework/components/chui_segmented_control/styles.css +32 -6
- package/framework/components/chui_settings/settings.js +160 -87
- package/framework/components/chui_settings/styles.css +4 -4
- package/framework/components/chui_shortcut_help/shortcut_help.js +82 -61
- package/framework/components/chui_sidebar_nav/sidebar_nav.js +132 -53
- package/framework/components/chui_sidebar_nav/styles.css +9 -3
- package/framework/components/chui_skeleton/skeleton.js +29 -24
- package/framework/components/chui_slideshow/slideshow.js +122 -103
- package/framework/components/chui_slideshow/styles.css +22 -16
- package/framework/components/chui_spinner/spinner.js +17 -17
- package/framework/components/chui_spinner/styles.css +0 -1
- package/framework/components/chui_split_button/split_button.js +53 -30
- package/framework/components/chui_split_button/styles.css +22 -6
- package/framework/components/chui_splitter/splitter.js +46 -39
- package/framework/components/chui_splitter/styles.css +2 -2
- package/framework/components/chui_statistic/statistic.js +111 -84
- package/framework/components/chui_status_bar/status_bar.js +11 -9
- package/framework/components/chui_status_bar/styles.css +2 -2
- package/framework/components/chui_stepper/stepper.js +230 -54
- package/framework/components/chui_stepper/styles.css +79 -14
- package/framework/components/chui_sticky_bar/sticky_bar.js +53 -17
- package/framework/components/chui_sticky_bar/styles.css +11 -7
- package/framework/components/chui_tabs/chui_tabs.js +100 -46
- package/framework/components/chui_tabs/styles.css +43 -15
- package/framework/components/chui_text_editor/styles.css +24 -23
- package/framework/components/chui_text_editor/text_editor.js +103 -79
- package/framework/components/chui_text_editor/text_editor_panel.js +428 -367
- package/framework/components/chui_theme_toggle/theme_toggle.js +46 -25
- package/framework/components/chui_timeline/styles.css +3 -1
- package/framework/components/chui_timeline/timeline.js +14 -12
- package/framework/components/chui_toast_queue/styles.css +11 -11
- package/framework/components/chui_toast_queue/toast_queue.js +82 -73
- package/framework/components/chui_toolbar/styles.css +2 -2
- package/framework/components/chui_toolbar/toolbar.js +20 -13
- package/framework/components/chui_tooltip/styles.css +2 -2
- package/framework/components/chui_tooltip/tooltip.js +40 -27
- package/framework/components/chui_tour/styles.css +12 -7
- package/framework/components/chui_tour/tour.js +132 -98
- package/framework/components/chui_transfer/styles.css +8 -7
- package/framework/components/chui_transfer/transfer.js +143 -123
- package/framework/components/chui_tree_table/styles.css +4 -4
- package/framework/components/chui_tree_table/tree_table.js +88 -74
- package/framework/components/chui_tree_view/styles.css +14 -10
- package/framework/components/chui_tree_view/tree_view.js +298 -253
- package/framework/components/chui_user_bar/styles.css +145 -0
- package/framework/components/chui_user_bar/user_bar.js +402 -0
- package/framework/components/chui_user_list_bar/styles.css +173 -0
- package/framework/components/chui_user_list_bar/user_list_bar.js +485 -0
- package/framework/components/chui_watermark/watermark.js +41 -33
- package/framework/components/chui_webview/styles.css +2 -2
- package/framework/components/chui_webview/webview.js +64 -52
- package/framework/components/chui_write_bar/styles.css +172 -0
- package/framework/components/chui_write_bar/write_bar.js +320 -0
- package/framework/main_window.js +1234 -0
- package/framework/modules/chui_a11y/chui_a11y.js +153 -123
- package/framework/modules/chui_animations/animations.js +105 -43
- package/framework/modules/chui_animations/motion.js +120 -0
- package/framework/modules/chui_animations/styles.css +37 -4
- package/framework/modules/chui_bridge/preload.js +36 -25
- package/framework/modules/chui_functions.js +69 -63
- package/framework/modules/chui_highlight/chui_highlight.js +25 -22
- package/framework/modules/chui_highlight/styles.css +13 -10
- package/framework/modules/chui_i18n/chui_i18n.js +12 -10
- package/framework/modules/chui_i18n/locales/a11y.js +5 -5
- package/framework/modules/chui_i18n/locales/app_layout.js +5 -5
- package/framework/modules/chui_i18n/locales/calendar.js +3 -3
- package/framework/modules/chui_i18n/locales/common.js +3 -3
- package/framework/modules/chui_i18n/locales/data.js +36 -26
- package/framework/modules/chui_i18n/locales/editors.js +40 -13
- package/framework/modules/chui_i18n/locales/feedback.js +65 -3
- package/framework/modules/chui_i18n/locales/forms.js +8 -8
- package/framework/modules/chui_i18n/locales/graphics.js +8 -8
- package/framework/modules/chui_i18n/locales/media.js +4 -4
- package/framework/modules/chui_i18n/locales/navigation.js +12 -8
- package/framework/modules/chui_i18n/locales/validate.js +3 -3
- package/framework/modules/chui_json/chui_json.js +11 -11
- package/framework/modules/chui_layout/chui_layout.js +12 -10
- package/framework/modules/chui_logger/chui_logger.js +47 -28
- package/framework/modules/chui_page/page.js +39 -33
- package/framework/modules/chui_palette/palette.js +61 -0
- package/framework/modules/chui_qr/chui_qr.js +179 -88
- package/framework/modules/chui_scrollbar/chui_scrollbar.js +79 -68
- package/framework/modules/chui_scrollbar/styles.css +4 -2
- package/framework/modules/chui_services/chui_channels.js +27 -13
- package/framework/modules/chui_services/chui_services.js +47 -39
- package/framework/modules/chui_services/desktop.js +108 -101
- package/framework/modules/chui_sortable/chui_sortable.js +33 -28
- package/framework/modules/chui_validate/chui_validate.js +10 -7
- package/framework/tray_bar/chui_menu_items.js +136 -46
- package/index.d.ts +5046 -0
- package/index.js +199 -1254
- package/package.json +81 -68
- package/framework/components/telegram_bot/chui_telegram_bot.js +0 -184
|
@@ -33,63 +33,119 @@ const LEVELS = {
|
|
|
33
33
|
LOW: "L",
|
|
34
34
|
MEDIUM: "M",
|
|
35
35
|
QUARTILE: "Q",
|
|
36
|
-
HIGH: "H"
|
|
36
|
+
HIGH: "H",
|
|
37
37
|
};
|
|
38
38
|
const MODES = {
|
|
39
39
|
AUTO: "auto",
|
|
40
40
|
NUMERIC: "numeric",
|
|
41
41
|
ALPHANUMERIC: "alphanumeric",
|
|
42
|
-
BYTE: "byte"
|
|
42
|
+
BYTE: "byte",
|
|
43
43
|
};
|
|
44
44
|
/** Знаки, которые кодируются в алфавитно-цифровом режиме (45 значений) */
|
|
45
45
|
const ALPHANUMERIC_CHARS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:";
|
|
46
46
|
/** Биты режима, разрядность счётчика символов по диапазонам версий (1–9, 10–26, 27–40) */
|
|
47
47
|
const MODE_INFO = {
|
|
48
|
-
numeric: {bits: 0b0001, count: [10, 12, 14]},
|
|
49
|
-
alphanumeric: {bits: 0b0010, count: [9, 11, 13]},
|
|
50
|
-
byte: {bits: 0b0100, count: [8, 16, 16]}
|
|
48
|
+
numeric: { bits: 0b0001, count: [10, 12, 14] },
|
|
49
|
+
alphanumeric: { bits: 0b0010, count: [9, 11, 13] },
|
|
50
|
+
byte: { bits: 0b0100, count: [8, 16, 16] },
|
|
51
51
|
};
|
|
52
52
|
/** Биты уровня в информации о формате (порядок в таблицах блоков — L, M, Q, H) */
|
|
53
53
|
const LEVEL_INFO = {
|
|
54
|
-
L: {format: 0b01, index: 0},
|
|
55
|
-
M: {format: 0b00, index: 1},
|
|
56
|
-
Q: {format: 0b11, index: 2},
|
|
57
|
-
H: {format: 0b10, index: 3}
|
|
54
|
+
L: { format: 0b01, index: 0 },
|
|
55
|
+
M: { format: 0b00, index: 1 },
|
|
56
|
+
Q: { format: 0b11, index: 2 },
|
|
57
|
+
H: { format: 0b10, index: 3 },
|
|
58
58
|
};
|
|
59
59
|
/** Кодовых слов коррекции в блоке по версиям 1…40 (строки — L, M, Q, H) */
|
|
60
60
|
const EC_CODEWORDS = [
|
|
61
|
-
[
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
61
|
+
[
|
|
62
|
+
7, 10, 15, 20, 26, 18, 20, 24, 30, 18, 20, 24, 26, 30, 22, 24, 28, 30, 28, 28, 28, 28, 30, 30, 26, 28, 30, 30,
|
|
63
|
+
30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
|
|
64
|
+
],
|
|
65
|
+
[
|
|
66
|
+
10, 16, 26, 18, 24, 16, 18, 22, 22, 26, 30, 22, 22, 24, 24, 28, 28, 26, 26, 26, 26, 28, 28, 28, 28, 28, 28, 28,
|
|
67
|
+
28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
|
|
68
|
+
],
|
|
69
|
+
[
|
|
70
|
+
13, 22, 18, 26, 18, 24, 18, 22, 20, 24, 28, 26, 24, 20, 30, 24, 28, 28, 26, 30, 28, 30, 30, 30, 30, 28, 30, 30,
|
|
71
|
+
30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
|
|
72
|
+
],
|
|
73
|
+
[
|
|
74
|
+
17, 28, 22, 16, 22, 28, 26, 26, 24, 28, 24, 28, 22, 24, 24, 30, 28, 28, 26, 28, 30, 24, 30, 30, 30, 30, 30, 30,
|
|
75
|
+
30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
|
|
76
|
+
],
|
|
65
77
|
];
|
|
66
78
|
/** Число блоков коррекции по версиям 1…40 (строки — L, M, Q, H) */
|
|
67
79
|
const EC_BLOCKS = [
|
|
68
|
-
[
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
80
|
+
[
|
|
81
|
+
1, 1, 1, 1, 1, 2, 2, 2, 2, 4, 4, 4, 4, 4, 6, 6, 6, 6, 7, 8, 8, 9, 9, 10, 12, 12, 12, 13, 14, 15, 16, 17, 18, 19,
|
|
82
|
+
19, 20, 21, 22, 24, 25,
|
|
83
|
+
],
|
|
84
|
+
[
|
|
85
|
+
1, 1, 1, 2, 2, 4, 4, 4, 5, 5, 5, 8, 9, 9, 10, 10, 11, 13, 14, 16, 17, 17, 18, 20, 21, 23, 25, 26, 28, 29, 31,
|
|
86
|
+
33, 35, 37, 38, 40, 43, 45, 47, 49,
|
|
87
|
+
],
|
|
88
|
+
[
|
|
89
|
+
1, 1, 2, 2, 4, 4, 6, 6, 8, 8, 8, 10, 12, 16, 12, 17, 16, 18, 21, 20, 23, 23, 25, 27, 29, 34, 34, 35, 38, 40, 43,
|
|
90
|
+
45, 48, 51, 53, 56, 59, 62, 65, 68,
|
|
91
|
+
],
|
|
92
|
+
[
|
|
93
|
+
1, 1, 2, 4, 4, 4, 5, 6, 8, 8, 11, 11, 16, 16, 18, 16, 19, 21, 25, 25, 25, 34, 30, 32, 35, 37, 40, 42, 45, 48,
|
|
94
|
+
51, 54, 57, 60, 63, 66, 70, 74, 77, 81,
|
|
95
|
+
],
|
|
72
96
|
];
|
|
73
97
|
/** Центры узоров выравнивания по версиям 1…40 (пусто у первой версии) */
|
|
74
98
|
const ALIGNMENT_POSITIONS = [
|
|
75
|
-
[],
|
|
76
|
-
[6,
|
|
77
|
-
[6,
|
|
78
|
-
[6,
|
|
79
|
-
[6,
|
|
80
|
-
[6,
|
|
81
|
-
[6,
|
|
82
|
-
[6,
|
|
99
|
+
[],
|
|
100
|
+
[6, 18],
|
|
101
|
+
[6, 22],
|
|
102
|
+
[6, 26],
|
|
103
|
+
[6, 30],
|
|
104
|
+
[6, 34],
|
|
105
|
+
[6, 22, 38],
|
|
106
|
+
[6, 24, 42],
|
|
107
|
+
[6, 26, 46],
|
|
108
|
+
[6, 28, 50],
|
|
109
|
+
[6, 30, 54],
|
|
110
|
+
[6, 32, 58],
|
|
111
|
+
[6, 34, 62],
|
|
112
|
+
[6, 26, 46, 66],
|
|
113
|
+
[6, 26, 48, 70],
|
|
114
|
+
[6, 26, 50, 74],
|
|
115
|
+
[6, 30, 54, 78],
|
|
116
|
+
[6, 30, 56, 82],
|
|
117
|
+
[6, 30, 58, 86],
|
|
118
|
+
[6, 34, 62, 90],
|
|
119
|
+
[6, 28, 50, 72, 94],
|
|
120
|
+
[6, 26, 50, 74, 98],
|
|
121
|
+
[6, 30, 54, 78, 102],
|
|
122
|
+
[6, 28, 54, 80, 106],
|
|
123
|
+
[6, 32, 58, 84, 110],
|
|
124
|
+
[6, 30, 58, 86, 114],
|
|
125
|
+
[6, 34, 62, 90, 118],
|
|
126
|
+
[6, 26, 50, 74, 98, 122],
|
|
127
|
+
[6, 30, 54, 78, 102, 126],
|
|
128
|
+
[6, 26, 52, 78, 104, 130],
|
|
129
|
+
[6, 30, 56, 82, 108, 134],
|
|
130
|
+
[6, 34, 60, 86, 112, 138],
|
|
131
|
+
[6, 30, 58, 86, 114, 142],
|
|
132
|
+
[6, 34, 62, 90, 118, 146],
|
|
133
|
+
[6, 30, 54, 78, 102, 126, 150],
|
|
134
|
+
[6, 24, 50, 76, 102, 128, 154],
|
|
135
|
+
[6, 28, 54, 80, 106, 132, 158],
|
|
136
|
+
[6, 32, 58, 84, 110, 136, 162],
|
|
137
|
+
[6, 26, 54, 82, 110, 138, 166],
|
|
138
|
+
[6, 30, 58, 86, 114, 142, 170],
|
|
83
139
|
];
|
|
84
140
|
const MIN_VERSION = 1;
|
|
85
141
|
const MAX_VERSION = 40;
|
|
86
142
|
/** Полином поля Галуа и порождающий полином модуля `x^8 + x^4 + x^3 + x^2 + 1` */
|
|
87
|
-
const GF_PRIME =
|
|
88
|
-
const PAD_BYTES = [
|
|
89
|
-
const PENALTY = {N1: 3, N2: 3, N3: 40, N4: 10};
|
|
143
|
+
const GF_PRIME = 0x11d;
|
|
144
|
+
const PAD_BYTES = [0xec, 0x11];
|
|
145
|
+
const PENALTY = { N1: 3, N2: 3, N3: 40, N4: 10 };
|
|
90
146
|
const FORMAT_POLYNOMIAL = 0x537;
|
|
91
147
|
const FORMAT_MASK = 0x5412;
|
|
92
|
-
const VERSION_POLYNOMIAL =
|
|
148
|
+
const VERSION_POLYNOMIAL = 0x1f25;
|
|
93
149
|
|
|
94
150
|
class QR {
|
|
95
151
|
static LEVEL = LEVELS;
|
|
@@ -105,11 +161,11 @@ class QR {
|
|
|
105
161
|
* `version` по умолчанию — 40: это предел всего формата.
|
|
106
162
|
*/
|
|
107
163
|
static capacity(version = MAX_VERSION, level = LEVELS.MEDIUM, mode = MODES.AUTO) {
|
|
108
|
-
const
|
|
164
|
+
const checkedLevel = QR.#checkLevel(QR.#option(level));
|
|
109
165
|
const chosen = QR.#option(mode);
|
|
110
|
-
const
|
|
111
|
-
const
|
|
112
|
-
return QR.#capacity(
|
|
166
|
+
const checkedMode = chosen === undefined || chosen === MODES.AUTO ? MODES.BYTE : QR.#checkMode(chosen);
|
|
167
|
+
const checkedVersion = QR.#checkVersion(QR.#option(version) === undefined ? MAX_VERSION : version);
|
|
168
|
+
return QR.#capacity(checkedVersion, checkedLevel, checkedMode);
|
|
113
169
|
}
|
|
114
170
|
|
|
115
171
|
/** Режим, который выберет `AUTO` для этой строки: цифры, буквы и цифры или байты */
|
|
@@ -134,9 +190,15 @@ class QR {
|
|
|
134
190
|
for (const char of String(text)) {
|
|
135
191
|
const code = char.codePointAt(0);
|
|
136
192
|
if (code < 0x80) bytes.push(code);
|
|
137
|
-
else if (code < 0x800) bytes.push(
|
|
138
|
-
else if (code < 0x10000) bytes.push(
|
|
139
|
-
else
|
|
193
|
+
else if (code < 0x800) bytes.push(0xc0 | (code >> 6), 0x80 | (code & 0x3f));
|
|
194
|
+
else if (code < 0x10000) bytes.push(0xe0 | (code >> 12), 0x80 | ((code >> 6) & 0x3f), 0x80 | (code & 0x3f));
|
|
195
|
+
else
|
|
196
|
+
bytes.push(
|
|
197
|
+
0xf0 | (code >> 18),
|
|
198
|
+
0x80 | ((code >> 12) & 0x3f),
|
|
199
|
+
0x80 | ((code >> 6) & 0x3f),
|
|
200
|
+
0x80 | (code & 0x3f)
|
|
201
|
+
);
|
|
140
202
|
}
|
|
141
203
|
return bytes;
|
|
142
204
|
}
|
|
@@ -150,21 +212,21 @@ class QR {
|
|
|
150
212
|
*/
|
|
151
213
|
static encode(value = String(), options = {}) {
|
|
152
214
|
const text = value === undefined || value === null ? "" : String(value);
|
|
153
|
-
if (text === "") return {ok: false, error: {code: "empty"}};
|
|
215
|
+
if (text === "") return { ok: false, error: { code: "empty" } };
|
|
154
216
|
// Пустая строка в опции значит «не задана» — общее правило фреймворка
|
|
155
217
|
const level = QR.#checkLevel(QR.#option(options.level));
|
|
156
218
|
const requested = QR.#option(options.mode);
|
|
157
219
|
const mode = requested === undefined || requested === MODES.AUTO ? MODES.AUTO : QR.#checkMode(requested);
|
|
158
|
-
const
|
|
159
|
-
const
|
|
160
|
-
const first = QR.#checkVersion(
|
|
161
|
-
const last = QR.#checkVersion(
|
|
220
|
+
const minVersion = QR.#option(options.minVersion);
|
|
221
|
+
const maxVersion = QR.#option(options.maxVersion);
|
|
222
|
+
const first = QR.#checkVersion(minVersion === undefined ? MIN_VERSION : minVersion);
|
|
223
|
+
const last = QR.#checkVersion(maxVersion === undefined ? MAX_VERSION : maxVersion);
|
|
162
224
|
if (first > last) throw new RangeError("QR: minVersion больше maxVersion");
|
|
163
225
|
const mask = QR.#option(options.mask) === undefined ? undefined : QR.#checkMask(options.mask);
|
|
164
226
|
|
|
165
227
|
const chosen = mode === MODES.AUTO ? QR.modeOf(text) : mode;
|
|
166
228
|
const payload = QR.#payload(text, chosen);
|
|
167
|
-
if (payload === undefined) return {ok: false, error: {code: "mode", mode: chosen}};
|
|
229
|
+
if (payload === undefined) return { ok: false, error: { code: "mode", mode: chosen } };
|
|
168
230
|
|
|
169
231
|
// Версия — наименьшая, в которую влезает заголовок (4 бита режима и счётчик) и данные
|
|
170
232
|
let version = undefined;
|
|
@@ -176,24 +238,34 @@ class QR {
|
|
|
176
238
|
}
|
|
177
239
|
}
|
|
178
240
|
if (version === undefined) {
|
|
179
|
-
return {
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
241
|
+
return {
|
|
242
|
+
ok: false,
|
|
243
|
+
error: {
|
|
244
|
+
code: "tooLong",
|
|
245
|
+
mode: payload.mode,
|
|
246
|
+
length: payload.length,
|
|
247
|
+
needed: payload.length,
|
|
248
|
+
capacity: QR.#capacity(last, level, payload.mode),
|
|
249
|
+
},
|
|
250
|
+
};
|
|
183
251
|
}
|
|
184
252
|
|
|
185
253
|
const codewords = QR.#codewords(payload, version, level);
|
|
186
254
|
const size = QR.size(version);
|
|
187
255
|
const pattern = QR.#functionPatterns(version, level);
|
|
188
256
|
QR.#placeData(pattern.modules, pattern.isFunction, codewords, size);
|
|
189
|
-
const
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
QR.#applyMask(pattern.modules, pattern.isFunction, size, chosen_mask);
|
|
193
|
-
QR.#drawFormat(pattern.modules, pattern.isFunction, size, level, chosen_mask);
|
|
257
|
+
const chosenMask = mask === undefined ? QR.#bestMask(pattern.modules, pattern.isFunction, size, level) : mask;
|
|
258
|
+
QR.#applyMask(pattern.modules, pattern.isFunction, size, chosenMask);
|
|
259
|
+
QR.#drawFormat(pattern.modules, pattern.isFunction, size, level, chosenMask);
|
|
194
260
|
return {
|
|
195
|
-
ok: true,
|
|
196
|
-
|
|
261
|
+
ok: true,
|
|
262
|
+
matrix: pattern.modules,
|
|
263
|
+
size: size,
|
|
264
|
+
version: version,
|
|
265
|
+
mask: chosenMask,
|
|
266
|
+
level: level,
|
|
267
|
+
mode: payload.mode,
|
|
268
|
+
length: payload.length,
|
|
197
269
|
};
|
|
198
270
|
}
|
|
199
271
|
|
|
@@ -207,23 +279,24 @@ class QR {
|
|
|
207
279
|
const group = text.slice(i, i + 3);
|
|
208
280
|
QR.#append(bits, Number(group), group.length * 3 + 1);
|
|
209
281
|
}
|
|
210
|
-
return {mode: mode, length: text.length, bits: bits};
|
|
282
|
+
return { mode: mode, length: text.length, bits: bits };
|
|
211
283
|
}
|
|
212
284
|
if (mode === MODES.ALPHANUMERIC) {
|
|
213
285
|
if (!QR.isAlphanumeric(text)) return undefined;
|
|
214
286
|
const bits = [];
|
|
215
287
|
let i = 0;
|
|
216
288
|
for (; i + 2 <= text.length; i += 2) {
|
|
217
|
-
const value =
|
|
289
|
+
const value =
|
|
290
|
+
ALPHANUMERIC_CHARS.indexOf(text.charAt(i)) * 45 + ALPHANUMERIC_CHARS.indexOf(text.charAt(i + 1));
|
|
218
291
|
QR.#append(bits, value, 11);
|
|
219
292
|
}
|
|
220
293
|
if (i < text.length) QR.#append(bits, ALPHANUMERIC_CHARS.indexOf(text.charAt(i)), 6);
|
|
221
|
-
return {mode: mode, length: text.length, bits: bits};
|
|
294
|
+
return { mode: mode, length: text.length, bits: bits };
|
|
222
295
|
}
|
|
223
296
|
const bytes = QR.toBytes(text);
|
|
224
297
|
const bits = [];
|
|
225
298
|
for (const byte of bytes) QR.#append(bits, byte, 8);
|
|
226
|
-
return {mode: MODES.BYTE, length: bytes.length, bits: bits};
|
|
299
|
+
return { mode: MODES.BYTE, length: bytes.length, bits: bits };
|
|
227
300
|
}
|
|
228
301
|
|
|
229
302
|
/** Сколько символов влезает в версию при уровне и режиме */
|
|
@@ -270,27 +343,27 @@ class QR {
|
|
|
270
343
|
*/
|
|
271
344
|
static #interleave(data = [], version = MIN_VERSION, level = LEVELS.MEDIUM) {
|
|
272
345
|
const blocks = EC_BLOCKS[LEVEL_INFO[level].index][version - 1];
|
|
273
|
-
const
|
|
346
|
+
const errorCorrectionLength = EC_CODEWORDS[LEVEL_INFO[level].index][version - 1];
|
|
274
347
|
const total = QR.#rawDataModules(version) >> 3;
|
|
275
|
-
const
|
|
276
|
-
const
|
|
277
|
-
const divisor = QR.#divisor(
|
|
348
|
+
const shortLength = Math.floor(total / blocks) - errorCorrectionLength;
|
|
349
|
+
const shortBlocks = blocks - (total % blocks);
|
|
350
|
+
const divisor = QR.#divisor(errorCorrectionLength);
|
|
278
351
|
const chunks = [];
|
|
279
352
|
let offset = 0;
|
|
280
353
|
for (let index = 0; index < blocks; index += 1) {
|
|
281
|
-
const length =
|
|
354
|
+
const length = shortLength + (index < shortBlocks ? 0 : 1);
|
|
282
355
|
const chunk = data.slice(offset, offset + length);
|
|
283
356
|
offset += length;
|
|
284
|
-
chunks.push({data: chunk, ec: QR.#remainder(chunk, divisor)});
|
|
357
|
+
chunks.push({ data: chunk, ec: QR.#remainder(chunk, divisor) });
|
|
285
358
|
}
|
|
286
359
|
const result = [];
|
|
287
|
-
const longest =
|
|
360
|
+
const longest = shortLength + 1;
|
|
288
361
|
for (let position = 0; position < longest; position += 1) {
|
|
289
362
|
for (const chunk of chunks) {
|
|
290
363
|
if (position < chunk.data.length) result.push(chunk.data[position]);
|
|
291
364
|
}
|
|
292
365
|
}
|
|
293
|
-
for (let position = 0; position <
|
|
366
|
+
for (let position = 0; position < errorCorrectionLength; position += 1) {
|
|
294
367
|
for (const chunk of chunks) result.push(chunk.ec[position]);
|
|
295
368
|
}
|
|
296
369
|
return result;
|
|
@@ -298,7 +371,7 @@ class QR {
|
|
|
298
371
|
|
|
299
372
|
/** Порождающий полином коррекции степени `degree` (без старшего члена) */
|
|
300
373
|
static #divisor(degree = Number()) {
|
|
301
|
-
|
|
374
|
+
const result = new Array(degree).fill(0);
|
|
302
375
|
result[degree - 1] = 1;
|
|
303
376
|
let root = 1;
|
|
304
377
|
for (let index = 0; index < degree; index += 1) {
|
|
@@ -358,8 +431,8 @@ class QR {
|
|
|
358
431
|
/** Матрица со служебными узорами: где можно ставить данные, отмечено в `isFunction` */
|
|
359
432
|
static #functionPatterns(version = MIN_VERSION, level = LEVELS.MEDIUM) {
|
|
360
433
|
const size = QR.size(version);
|
|
361
|
-
const modules = Array.from({length: size}, () => new Array(size).fill(false));
|
|
362
|
-
const isFunction = Array.from({length: size}, () => new Array(size).fill(false));
|
|
434
|
+
const modules = Array.from({ length: size }, () => new Array(size).fill(false));
|
|
435
|
+
const isFunction = Array.from({ length: size }, () => new Array(size).fill(false));
|
|
363
436
|
const set = (x, y, dark) => {
|
|
364
437
|
if (x < 0 || y < 0 || x >= size || y >= size) return;
|
|
365
438
|
modules[y][x] = dark;
|
|
@@ -371,7 +444,11 @@ class QR {
|
|
|
371
444
|
set(i, 6, i % 2 === 0);
|
|
372
445
|
}
|
|
373
446
|
// Поисковые узоры 7×7 с разделителем: расстояние Чебышёва до центра 3 — тёмное, 2 и 4 — светлое
|
|
374
|
-
for (const center of [
|
|
447
|
+
for (const center of [
|
|
448
|
+
[3, 3],
|
|
449
|
+
[size - 4, 3],
|
|
450
|
+
[3, size - 4],
|
|
451
|
+
]) {
|
|
375
452
|
for (let dy = -4; dy <= 4; dy += 1) {
|
|
376
453
|
for (let dx = -4; dx <= 4; dx += 1) {
|
|
377
454
|
const distance = Math.max(Math.abs(dx), Math.abs(dy));
|
|
@@ -383,7 +460,8 @@ class QR {
|
|
|
383
460
|
const centers = ALIGNMENT_POSITIONS[version - 1];
|
|
384
461
|
for (let row = 0; row < centers.length; row += 1) {
|
|
385
462
|
for (let column = 0; column < centers.length; column += 1) {
|
|
386
|
-
const corner =
|
|
463
|
+
const corner =
|
|
464
|
+
(row === 0 && column === 0) ||
|
|
387
465
|
(row === 0 && column === centers.length - 1) ||
|
|
388
466
|
(row === centers.length - 1 && column === 0);
|
|
389
467
|
if (corner) continue;
|
|
@@ -398,7 +476,7 @@ class QR {
|
|
|
398
476
|
// считаются сразу — данные туда не попадут
|
|
399
477
|
QR.#drawFormat(modules, isFunction, size, level, 0);
|
|
400
478
|
QR.#drawVersion(modules, isFunction, size, version);
|
|
401
|
-
return {modules: modules, isFunction: isFunction};
|
|
479
|
+
return { modules: modules, isFunction: isFunction };
|
|
402
480
|
}
|
|
403
481
|
|
|
404
482
|
/** Информация о формате: 5 битов данных, 10 битов BCH-остатка и маска 0x5412 */
|
|
@@ -467,15 +545,24 @@ class QR {
|
|
|
467
545
|
/** Маска: `true` — модуль инвертируется */
|
|
468
546
|
static #maskAt(mask = 0, x = Number(), y = Number()) {
|
|
469
547
|
switch (mask) {
|
|
470
|
-
case 0:
|
|
471
|
-
|
|
472
|
-
case
|
|
473
|
-
|
|
474
|
-
case
|
|
475
|
-
|
|
476
|
-
case
|
|
477
|
-
|
|
478
|
-
|
|
548
|
+
case 0:
|
|
549
|
+
return (x + y) % 2 === 0;
|
|
550
|
+
case 1:
|
|
551
|
+
return y % 2 === 0;
|
|
552
|
+
case 2:
|
|
553
|
+
return x % 3 === 0;
|
|
554
|
+
case 3:
|
|
555
|
+
return (x + y) % 3 === 0;
|
|
556
|
+
case 4:
|
|
557
|
+
return (Math.floor(x / 3) + Math.floor(y / 2)) % 2 === 0;
|
|
558
|
+
case 5:
|
|
559
|
+
return ((x * y) % 2) + ((x * y) % 3) === 0;
|
|
560
|
+
case 6:
|
|
561
|
+
return (((x * y) % 2) + ((x * y) % 3)) % 2 === 0;
|
|
562
|
+
case 7:
|
|
563
|
+
return (((x + y) % 2) + ((x * y) % 3)) % 2 === 0;
|
|
564
|
+
default:
|
|
565
|
+
throw new RangeError("QR: маска вне диапазона 0…7");
|
|
479
566
|
}
|
|
480
567
|
}
|
|
481
568
|
|
|
@@ -491,14 +578,14 @@ class QR {
|
|
|
491
578
|
/** Маска с наименьшим штрафом; повторное применение снимает маску */
|
|
492
579
|
static #bestMask(modules = [], isFunction = [], size = Number(), level = LEVELS.MEDIUM) {
|
|
493
580
|
let best = 0;
|
|
494
|
-
let
|
|
581
|
+
let bestScore = Infinity;
|
|
495
582
|
for (let mask = 0; mask < 8; mask += 1) {
|
|
496
583
|
QR.#applyMask(modules, isFunction, size, mask);
|
|
497
584
|
QR.#drawFormat(modules, isFunction, size, level, mask);
|
|
498
585
|
const score = QR.#penalty(modules, size);
|
|
499
|
-
if (score <
|
|
586
|
+
if (score < bestScore) {
|
|
500
587
|
best = mask;
|
|
501
|
-
|
|
588
|
+
bestScore = score;
|
|
502
589
|
}
|
|
503
590
|
QR.#applyMask(modules, isFunction, size, mask);
|
|
504
591
|
}
|
|
@@ -520,7 +607,8 @@ class QR {
|
|
|
520
607
|
for (let y = 0; y < size - 1; y += 1) {
|
|
521
608
|
for (let x = 0; x < size - 1; x += 1) {
|
|
522
609
|
const dark = modules[y][x];
|
|
523
|
-
if (dark === modules[y][x + 1] && dark === modules[y + 1][x] && dark === modules[y + 1][x + 1])
|
|
610
|
+
if (dark === modules[y][x + 1] && dark === modules[y + 1][x] && dark === modules[y + 1][x + 1])
|
|
611
|
+
score += PENALTY.N2;
|
|
524
612
|
}
|
|
525
613
|
}
|
|
526
614
|
// Правило 4: доля тёмных модулей вне 45…55 %, шаг — 5 %
|
|
@@ -581,10 +669,13 @@ class QR {
|
|
|
581
669
|
/** Узор 1:1:3:1:1 в истории полос: тёмная полоса шириной 3 единицы в тёмной рамке */
|
|
582
670
|
static #finderRuns(history = []) {
|
|
583
671
|
const unit = history[1];
|
|
584
|
-
const core =
|
|
672
|
+
const core =
|
|
673
|
+
unit > 0 && history[2] === unit && history[3] === unit * 3 && history[4] === unit && history[5] === unit;
|
|
585
674
|
if (!core) return 0;
|
|
586
|
-
return (
|
|
587
|
-
(history[
|
|
675
|
+
return (
|
|
676
|
+
(history[0] >= unit * 4 && history[6] >= unit ? 1 : 0) +
|
|
677
|
+
(history[6] >= unit * 4 && history[0] >= unit ? 1 : 0)
|
|
678
|
+
);
|
|
588
679
|
}
|
|
589
680
|
|
|
590
681
|
/** Число, записанное `length` битами, в конец потока */
|
|
@@ -622,4 +713,4 @@ class QR {
|
|
|
622
713
|
}
|
|
623
714
|
}
|
|
624
715
|
|
|
625
|
-
exports.QR = QR
|
|
716
|
+
exports.QR = QR;
|