@luonghaminhvy/songma-std 0.5.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.
- package/LICENSE +21 -0
- package/README.md +41 -0
- package/package.json +33 -0
- package/src/bang_du_lieu.sm +61 -0
- package/src/index.sm +24 -0
- package/src/kiem_tra.sm +77 -0
- package/src/ma_hoa.sm +43 -0
- package/src/ngay_thang.sm +38 -0
- package/test/std.test.sm +45 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Luong Ha Minh Vy
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# songma-std - Thư Viện Tiện Ích Mở Rộng Chuẩn SongMa
|
|
2
|
+
|
|
3
|
+
Gói thư viện tiện ích chuẩn mở rộng cung cấp các công cụ thiết yếu: Ngày Tháng, Mã Hóa/UUID, Kiểm Tra Định Dạng Việt Nam và Xử Lý Bảng CSV cho ngôn ngữ lập trình SongMa (.smjs / .smts).
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Cài đặt & Sử dụng
|
|
8
|
+
|
|
9
|
+
Trong tệp SongMa (`.smjs` / `.smts`):
|
|
10
|
+
|
|
11
|
+
```vietlang
|
|
12
|
+
dùng {
|
|
13
|
+
tinh_khoang_cach_ngay,
|
|
14
|
+
tao_uuid,
|
|
15
|
+
la_so_dien_thoai_vn,
|
|
16
|
+
la_email_hop_le,
|
|
17
|
+
doc_csv
|
|
18
|
+
} từ "songma-std";
|
|
19
|
+
|
|
20
|
+
// 1. Sinh UUID v4
|
|
21
|
+
biến ma_dinh_danh = tao_uuid();
|
|
22
|
+
in("UUID: " + ma_dinh_danh);
|
|
23
|
+
|
|
24
|
+
// 2. Kiểm tra định dạng số điện thoại Việt Nam
|
|
25
|
+
nếu (la_so_dien_thoai_vn("0912345678")) {
|
|
26
|
+
in("Số điện thoại hợp lệ!");
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// 3. Đọc dữ liệu bảng CSV
|
|
30
|
+
biến danh_sach = doc_csv("ten,gia\nAo thun,150000\nQuan jean,350000");
|
|
31
|
+
in(danh_sach[0].ten); // "Ao thun"
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## Danh sách Modules
|
|
37
|
+
|
|
38
|
+
- **`ngay_thang`**: Xử lý tính toán khoảng cách ngày, kiểm tra năm nhuận, lấy tên thứ trong tuần.
|
|
39
|
+
- **`ma_hoa`**: Sinh UUID ngẫu nhiên v4, mã hóa và giải mã Base64 URL-safe.
|
|
40
|
+
- **`kiem_tra`**: Kiểm tra số điện thoại di động Việt Nam, email, căn cước công dân (CCCD 12 số).
|
|
41
|
+
- **`bang_du_lieu`**: Phân tích cú pháp chuỗi CSV thành mảng đối tượng và ngược lại.
|
package/package.json
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@luonghaminhvy/songma-std",
|
|
3
|
+
"version": "0.5.0",
|
|
4
|
+
"description": "Thư viện Tiện ích Chuẩn Mở Rộng cho Hệ sinh thái Ngôn ngữ Lập trình SongMa (.smjs / .smts / .smjx / .smtx)",
|
|
5
|
+
"main": "src/index.sm",
|
|
6
|
+
"module": "src/index.sm",
|
|
7
|
+
"types": "src/index.d.ts",
|
|
8
|
+
"keywords": [
|
|
9
|
+
"songma",
|
|
10
|
+
"std",
|
|
11
|
+
"standard-library",
|
|
12
|
+
"vietnamese",
|
|
13
|
+
"utils",
|
|
14
|
+
"date-time",
|
|
15
|
+
"crypto",
|
|
16
|
+
"csv",
|
|
17
|
+
"validator"
|
|
18
|
+
],
|
|
19
|
+
"author": "Luong Ha Minh Vy",
|
|
20
|
+
"license": "MIT",
|
|
21
|
+
"publishConfig": {
|
|
22
|
+
"access": "public"
|
|
23
|
+
},
|
|
24
|
+
"repository": {
|
|
25
|
+
"type": "git",
|
|
26
|
+
"url": "https://github.com/LuongHaMinhVy/SongMa.git"
|
|
27
|
+
},
|
|
28
|
+
"homepage": "https://github.com/LuongHaMinhVy/SongMa",
|
|
29
|
+
"scripts": {
|
|
30
|
+
"test": "sm test test/",
|
|
31
|
+
"check": "sm check src/"
|
|
32
|
+
}
|
|
33
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
// ========================================================
|
|
2
|
+
// Module: Xử lý Bảng Dữ Liệu & Tệp Tin CSV (Table & CSV)
|
|
3
|
+
// ========================================================
|
|
4
|
+
|
|
5
|
+
// Phân tích chuỗi CSV thành mảng các đối tượng
|
|
6
|
+
hàm doc_csv(chuoi_csv) {
|
|
7
|
+
nếu (!chuoi_csv) {
|
|
8
|
+
trả [];
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
biến cac_dong = tách(cắt_khoảng_trắng(chuoi_csv), "\n");
|
|
12
|
+
nếu (độ_dài(cac_dong) < 2) {
|
|
13
|
+
trả [];
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
biến tieu_de = tách(cắt_khoảng_trắng(cac_dong[0]), ",");
|
|
17
|
+
biến ket_qua = [];
|
|
18
|
+
|
|
19
|
+
lặp (biến i = 1; i < độ_dài(cac_dong); i++) {
|
|
20
|
+
biến dong = cắt_khoảng_trắng(cac_dong[i]);
|
|
21
|
+
nếu (độ_dài(dong) == 0) {
|
|
22
|
+
tiếp;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
biến cac_cot = tách(dong, ",");
|
|
26
|
+
biến doi_tuong = {};
|
|
27
|
+
|
|
28
|
+
lặp (biến j = 0; j < độ_dài(tieu_de); j++) {
|
|
29
|
+
biến khoa = cắt_khoảng_trắng(tieu_de[j]);
|
|
30
|
+
biến gia_tri = (j < độ_dài(cac_cot)) ? cắt_khoảng_trắng(cac_cot[j]) : "";
|
|
31
|
+
doi_tuong[khoa] = gia_tri;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
ket_qua.push(doi_tuong);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
trả ket_qua;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Chuyển danh sách đối tượng thành chuỗi CSV
|
|
41
|
+
hàm tao_csv(danh_sach, danh_sach_cot) {
|
|
42
|
+
nếu (!danh_sach || độ_dài(danh_sach) == 0) {
|
|
43
|
+
trả "";
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
biến hang_dau = nối(danh_sach_cot, ",");
|
|
47
|
+
biến cac_hang = [hang_dau];
|
|
48
|
+
|
|
49
|
+
mỗi (item trong danh_sach) {
|
|
50
|
+
biến cac_gia_tri = [];
|
|
51
|
+
mỗi (cot trong danh_sach_cot) {
|
|
52
|
+
biến val = item[cot] ?? "";
|
|
53
|
+
cac_gia_tri.push(val);
|
|
54
|
+
}
|
|
55
|
+
cac_hang.push(nối(cac_gia_tri, ","));
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
trả nối(cac_hang, "\n");
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
xuất { doc_csv, tao_csv };
|
package/src/index.sm
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// ========================================================
|
|
2
|
+
// Thư Viện Tiện Ích Mở Rộng Chuẩn SongMa Standard Library
|
|
3
|
+
// ========================================================
|
|
4
|
+
|
|
5
|
+
dùng { CAC_THU, tinh_khoang_cach_ngay, la_nam_nhuan, lay_ten_thu } từ "./ngay_thang.smjs";
|
|
6
|
+
dùng { tao_uuid, ma_hoa_base64_url, giai_ma_base64_url } từ "./ma_hoa.smjs";
|
|
7
|
+
dùng { la_so_dien_thoai_vn, la_email_hop_le, la_cccd_hop_le, la_chuoi_rong } từ "./kiem_tra.smjs";
|
|
8
|
+
dùng { doc_csv, tao_csv } từ "./bang_du_lieu.smjs";
|
|
9
|
+
|
|
10
|
+
xuất {
|
|
11
|
+
CAC_THU,
|
|
12
|
+
tinh_khoang_cach_ngay,
|
|
13
|
+
la_nam_nhuan,
|
|
14
|
+
lay_ten_thu,
|
|
15
|
+
tao_uuid,
|
|
16
|
+
ma_hoa_base64_url,
|
|
17
|
+
giai_ma_base64_url,
|
|
18
|
+
la_so_dien_thoai_vn,
|
|
19
|
+
la_email_hop_le,
|
|
20
|
+
la_cccd_hop_le,
|
|
21
|
+
la_chuoi_rong,
|
|
22
|
+
doc_csv,
|
|
23
|
+
tao_csv
|
|
24
|
+
};
|
package/src/kiem_tra.sm
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
// ========================================================
|
|
2
|
+
// Module: Kiểm Tra Định Dạng Dữ Liệu Việt Nam (Validator)
|
|
3
|
+
// ========================================================
|
|
4
|
+
|
|
5
|
+
// Kiểm tra số điện thoại di động Việt Nam (10 số, đầu 03, 05, 07, 08, 09)
|
|
6
|
+
hàm la_so_dien_thoai_vn(sdt) {
|
|
7
|
+
nếu (!sdt || độ_dài(sdt) != 10) {
|
|
8
|
+
trả sai;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
biến hop_le = bắt_đầu_bằng(sdt, "03")
|
|
12
|
+
|| bắt_đầu_bằng(sdt, "05")
|
|
13
|
+
|| bắt_đầu_bằng(sdt, "07")
|
|
14
|
+
|| bắt_đầu_bằng(sdt, "08")
|
|
15
|
+
|| bắt_đầu_bằng(sdt, "09");
|
|
16
|
+
|
|
17
|
+
nếu (!hop_le) {
|
|
18
|
+
trả sai;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// Kiểm tra toàn bộ là chữ số
|
|
22
|
+
lặp (biến i = 0; i < 10; i++) {
|
|
23
|
+
biến ky_tu = cắt(sdt, i, i + 1);
|
|
24
|
+
nếu (ky_tu < "0" || ky_tu > "9") {
|
|
25
|
+
trả sai;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
trả đúng;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Kiểm tra định dạng email cơ bản
|
|
33
|
+
hàm la_email_hop_le(email) {
|
|
34
|
+
nếu (!email || độ_dài(email) < 5) {
|
|
35
|
+
trả sai;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
nếu (!chứa(email, "@") || !chứa(email, ".")) {
|
|
39
|
+
trả sai;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
biến vi_tri_at = tìm(email, "@");
|
|
43
|
+
biến vi_tri_cham = tìm(email, ".");
|
|
44
|
+
|
|
45
|
+
nếu (vi_tri_at <= 0 || vi_tri_cham <= vi_tri_at + 1) {
|
|
46
|
+
trả sai;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
trả đúng;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Kiểm tra số Căn cước công dân (CCCD 12 chữ số)
|
|
53
|
+
hàm la_cccd_hop_le(cccd) {
|
|
54
|
+
nếu (!cccd || độ_dài(cccd) != 12) {
|
|
55
|
+
trả sai;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
lặp (biến i = 0; i < 12; i++) {
|
|
59
|
+
biến ky_tu = cắt(cccd, i, i + 1);
|
|
60
|
+
nếu (ky_tu < "0" || ky_tu > "9") {
|
|
61
|
+
trả sai;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
trả đúng;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Kiểm tra chuỗi rỗng
|
|
69
|
+
hàm la_chuoi_rong(chuoi) {
|
|
70
|
+
nếu (!chuoi) {
|
|
71
|
+
trả đúng;
|
|
72
|
+
}
|
|
73
|
+
biến cat = cắt_khoảng_trắng(chuoi);
|
|
74
|
+
trả độ_dài(cat) == 0;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
xuất { la_so_dien_thoai_vn, la_email_hop_le, la_cccd_hop_le, la_chuoi_rong };
|
package/src/ma_hoa.sm
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// ========================================================
|
|
2
|
+
// Module: Mã Hóa, Băm Dữ Liệu & Tạo Định Danh Ngẫu Nhiên
|
|
3
|
+
// ========================================================
|
|
4
|
+
|
|
5
|
+
biến HEX_CHARS = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"];
|
|
6
|
+
|
|
7
|
+
hàm sinh_hex_ngau_nhien(do_dai) {
|
|
8
|
+
biến kq = "";
|
|
9
|
+
lặp (biến i = 0; i < do_dai; i++) {
|
|
10
|
+
biến idx = ngẫu_nhiên(0, 15);
|
|
11
|
+
kq = kq + HEX_CHARS[idx];
|
|
12
|
+
}
|
|
13
|
+
trả kq;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// Sinh chuỗi UUID phiên bản 4 chuẩn (VD: "f47ac10b-58cc-4372-a567-0e02b2c3d479")
|
|
17
|
+
hàm tao_uuid() {
|
|
18
|
+
biến p1 = sinh_hex_ngau_nhien(8);
|
|
19
|
+
biến p2 = sinh_hex_ngau_nhien(4);
|
|
20
|
+
biến p3 = "4" + sinh_hex_ngau_nhien(3);
|
|
21
|
+
biến p4 = "a" + sinh_hex_ngau_nhien(3);
|
|
22
|
+
biến p5 = sinh_hex_ngau_nhien(12);
|
|
23
|
+
|
|
24
|
+
trả p1 + "-" + p2 + "-" + p3 + "-" + p4 + "-" + p5;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// Mã hóa Base64 an toàn cho URL (URL-safe Base64)
|
|
28
|
+
hàm ma_hoa_base64_url(chuoi) {
|
|
29
|
+
biến goc = mã_hóa_base64(chuoi);
|
|
30
|
+
biến b1 = thay_thế_tất_cả(goc, "+", "-");
|
|
31
|
+
biến b2 = thay_thế_tất_cả(b1, "/", "_");
|
|
32
|
+
biến b3 = thay_thế_tất_cả(b2, "=", "");
|
|
33
|
+
trả b3;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Giải mã Base64 URL-safe
|
|
37
|
+
hàm giai_ma_base64_url(chuoi) {
|
|
38
|
+
biến b1 = thay_thế_tất_cả(chuoi, "-", "+");
|
|
39
|
+
biến b2 = thay_thế_tất_cả(b1, "_", "/");
|
|
40
|
+
trả giải_mã_base64(b2);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
xuất { tao_uuid, ma_hoa_base64_url, giai_ma_base64_url };
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
// ========================================================
|
|
2
|
+
// Module: Xử lý Thời gian & Ngày Tháng Thuần Việt
|
|
3
|
+
// ========================================================
|
|
4
|
+
|
|
5
|
+
biến CAC_THU = [
|
|
6
|
+
"Chủ Nhật",
|
|
7
|
+
"Thứ Hai",
|
|
8
|
+
"Thứ Ba",
|
|
9
|
+
"Thứ Tư",
|
|
10
|
+
"Thứ Năm",
|
|
11
|
+
"Thứ Sáu",
|
|
12
|
+
"Thứ Bảy"
|
|
13
|
+
];
|
|
14
|
+
|
|
15
|
+
// Tính số ngày chênh lệch giữa hai mốc mili-giây
|
|
16
|
+
hàm tinh_khoang_cach_ngay(moc1, moc2) {
|
|
17
|
+
biến do_lech = trị_tuyệt_đối(moc2 - moc1);
|
|
18
|
+
biến mot_ngay = 1000 * 60 * 60 * 24;
|
|
19
|
+
trả làm_tròn(do_lech / mot_ngay);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// Kiểm tra năm nhuận dương lịch
|
|
23
|
+
hàm la_nam_nhuan(nam) {
|
|
24
|
+
nếu ((nam % 4 == 0 && nam % 100 != 0) || (nam % 400 == 0)) {
|
|
25
|
+
trả đúng;
|
|
26
|
+
}
|
|
27
|
+
trả sai;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// Lấy tên thứ từ chỉ số (0: Chủ Nhật, 1: Thứ Hai...)
|
|
31
|
+
hàm lay_ten_thu(chi_so) {
|
|
32
|
+
nếu (chi_so >= 0 && chi_so < 7) {
|
|
33
|
+
trả CAC_THU[chi_so];
|
|
34
|
+
}
|
|
35
|
+
trả "Không xác định";
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
xuất { CAC_THU, tinh_khoang_cach_ngay, la_nam_nhuan, lay_ten_thu };
|
package/test/std.test.sm
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
// ========================================================
|
|
2
|
+
// Kiểm thử Thư viện Chuẩn Mở Rộng SongMa Std
|
|
3
|
+
// ========================================================
|
|
4
|
+
|
|
5
|
+
dùng {
|
|
6
|
+
la_nam_nhuan,
|
|
7
|
+
lay_ten_thu,
|
|
8
|
+
tinh_khoang_cach_ngay,
|
|
9
|
+
tao_uuid,
|
|
10
|
+
ma_hoa_base64_url,
|
|
11
|
+
giai_ma_base64_url,
|
|
12
|
+
la_so_dien_thoai_vn,
|
|
13
|
+
la_email_hop_le,
|
|
14
|
+
la_cccd_hop_le,
|
|
15
|
+
doc_csv,
|
|
16
|
+
tao_csv
|
|
17
|
+
} từ "../src/index.smjs";
|
|
18
|
+
|
|
19
|
+
// 1. Kiểm thử Ngày Tháng
|
|
20
|
+
nếu (!la_nam_nhuan(2024)) { ném "Lỗi: 2024 phải là năm nhuận"; }
|
|
21
|
+
nếu (la_nam_nhuan(2023)) { ném "Lỗi: 2023 không phải năm nhuận"; }
|
|
22
|
+
nếu (lay_ten_thu(1) != "Thứ Hai") { ném "Lỗi: 1 phải là Thứ Hai"; }
|
|
23
|
+
|
|
24
|
+
// 2. Kiểm thử Mã Hóa & UUID
|
|
25
|
+
biến id = tao_uuid();
|
|
26
|
+
nếu (độ_dài(id) != 36) { ném "Lỗi: Độ dài UUID phải bằng 36"; }
|
|
27
|
+
|
|
28
|
+
biến text = "Xin chào Sông Mã 2026";
|
|
29
|
+
biến encoded = ma_hoa_base64_url(text);
|
|
30
|
+
biến decoded = giai_ma_base64_url(encoded);
|
|
31
|
+
nếu (decoded != text) { ném "Lỗi: Base64 URL-safe encode/decode không khớp"; }
|
|
32
|
+
|
|
33
|
+
// 3. Kiểm thử Validator Việt Nam
|
|
34
|
+
nếu (!la_so_dien_thoai_vn("0912345678")) { ném "Lỗi: 0912345678 phải hợp lệ"; }
|
|
35
|
+
nếu (la_so_dien_thoai_vn("0123456789")) { ném "Lỗi: Đầu số 012 không còn hợp lệ"; }
|
|
36
|
+
nếu (!la_email_hop_le("contact@songma.dev")) { ném "Lỗi: Email phải hợp lệ"; }
|
|
37
|
+
nếu (!la_cccd_hop_le("038204012345")) { ném "Lỗi: CCCD 12 số phải hợp lệ"; }
|
|
38
|
+
|
|
39
|
+
// 4. Kiểm thử Bảng Dữ Liệu CSV
|
|
40
|
+
biến csv_mau = "ten,tuoi,vai_tro\nMinh Vy,20,Admin\nThanh Hoa,22,User";
|
|
41
|
+
biến parsed = doc_csv(csv_mau);
|
|
42
|
+
nếu (độ_dài(parsed) != 2) { ném "Lỗi: Phải parse được 2 dòng dữ liệu"; }
|
|
43
|
+
nếu (parsed[0].ten != "Minh Vy") { ném "Lỗi: Tên dòng 1 phải là Minh Vy"; }
|
|
44
|
+
|
|
45
|
+
in("[KIỂM THỬ THÀNH CÔNG] Toàn bộ module songma-std hoạt động chính xác!");
|