{{Module rating}}
{{#invoke:GHS phrases|tên-chức-năng}}
Mô đun này phụ thuộc vào các mô đun sau: |
Code | Phrase |
---|---|
H200 | Chất nổ không ổn định |
H201 | Chất nổ: nguy cơ nổ mạnh |
H202 | Chất nổ: nguy cơ phóng mảnh bụn |
H203 | Chất nổ: nguy cơ cháy nổ hoặc phóng mảnh vụn |
H204 | Nguy cơ cháy hoặc phóng mảnh vụn |
H205 | Có thể cháy hoặc nổ mạnh |
H206 | Fire, blast or projection hazard: increased risk of explosion if desensitizing agent is reduced |
H207 | Fire or projection hazard; increased risk of explosion if desensitizing agent is reduced |
H208 | Fire hazard; increased risk of explosion if desensitizing agent is reduced |
H209 | Explosive |
H210 | Very explosive |
H211 | May be sensitive |
H220 | Khí cực kỳ dễ cháy |
H221 | Khí dễ cháy |
H222 | Vật liệu cực kỳ dễ cháy |
H223 | Vật liệu dễ cháy |
H224 | Chất lỏng và hơi cực kỳ dễ cháy |
H225 | Chất lỏng và hơi rất dễ cháy |
H226 | Chất lỏng và hơi dễ cháy |
H227 | Chất lỏng dễ đốt |
H228 | Chất rắn dễ cháy |
H230 | May react explosively even in the absence of air |
H231 | May react explosively even in the absence of air at elevated pressure and/or temperature |
H240 | Làm nóng có thể gây nổ |
H241 | Làm nóng có thể gây cháy hoặc nổ |
H242 | Làm nóng có thể gây cháy |
H250 | Lập tức cháy khi tiếp xúc với không khí |
H251 | Tự làm nóng: có thể cháy |
H252 | Tự làm nóng số lượng lớn: có thể cháy |
H260 | Tạo khí dễ cháy khi tiếp xúc với nước, có thể cháy ngay lập tức |
H261 | Tạo khí dễ cháy khi tiếp xúc với nước |
H270 | Có thể gây hoặc tăng cường cháy: chất oxi hóa |
H271 | Có thể gây cháy hoặc nổ: chất oxi hóa mạnh |
H272 | Có thể tăng cường cháy: chất oxi hóa |
H280 | Chứa khí nén: có thể nổ nếu làm nóng |
H281 | Chứa khí lạnh: có thể gây bỏng lạnh hoặc bị thương |
H282 | Extremely flammable chemical under pressure: May explode if heated |
H283 | Flammable chemical under pressure: May explode if heated |
H284 | Chemical under pressure: May explode if heated |
H290 | Có thể ăn mòn kim loại |
H300 | Gây chết người nếu nuốt |
H300+H310 | Fatal NẾU NUỐT: or in contact with skin |
H300+H310+H330 | Fatal NẾU NUỐT:, in contact with skin or if inhaled |
H300+H330 | Fatal NẾU NUỐT: or if inhaled |
H301 | Gây độc nếu nuốt |
H301+H311 | Toxic NẾU NUỐT: or in contact with skin |
H301+H311+H331 | Toxic NẾU NUỐT:, in contact with skin or if inhaled |
H301+H331 | Toxic NẾU NUỐT: or if inhaled |
H302 | Gây hại nếu nuốt |
H302+H312 | Harmful NẾU NUỐT: or in contact with skin |
H302+H312+H332 | Harmful NẾU NUỐT:, in contact with skin or if inhaled |
H302+H332 | Harmful NẾU NUỐT: or inhaled |
H303 | Có thể làm tổn thương nếu nuốt |
H303+H313 | May be harmful NẾU NUỐT: or in contact with skin |
H303+H313+H333 | May be harmful NẾU NUỐT:, in contact with skin or if inhaled |
H303+H333 | May be harmful NẾU NUỐT: or if inhaled |
H304 | Có thể gây chết người nếu nuốt và vào đường hô hấp |
H305 | Có thể gây hại nếu nuốt và vào đường hô hấp |
H310 | Gây chết người nếu tiếp xúc với da |
H310+H330 | Fatal in contact with skin or if inhaled |
H311 | Gây độc nếu tiếp xúc với da |
H311+H331 | Toxic in contact with skin or if inhaled |
H312 | Gây hại nếu tiếp xúc với da |
H312+H332 | Harmful in contact with skin or if inhaled |
H313 | Có thể gây hại nếu tiếp xúc với da |
H313+H333 | May be harmful in contact with skin or if inhaled |
H314 | Gây bỏng da và tổn thương mắt nghiêm trọng |
H315 | Gây ngứa da |
H315+H320 | Causes skin and eye irritation |
H316 | Gây ngứa da nhẹ |
H317 | Có thể gây dị ứng da |
H318 | Làm tổn thương mắt nghiêm trọng |
H319 | Làm rát mắt nghiêm trọng |
H320 | Làm rát mắt |
H330 | Gây chết người nếu hít vào |
H331 | Gây độc nếu hít vào |
H332 | Gây hại nếu hít vào |
H333 | Có thể gây hại nếu hít vào |
H334 | Có thể gây dị ứng hoặc triệu chứng khó thở nếu hít vào |
H335 | Có thể gây rát đường hô hấp |
H336 | Có thể gây chóng mặt hoặc buồn ngủ |
H340 | Có thể gây khiếm khuyết di truyền |
H341 | Nghi ngờ có thể gây khiếm khuyết di truyền |
H350 | Có thể gây ung thư |
H350i | Có thể gây ung thư nếu hít vào |
H351 | Nghi ngờ có thể gây ung thư |
H360 | Có thể làm tổn thương khả năng sinh sản hoặc trẻ chưa sinh |
H360D | Có thể làm tổn thương cho trẻ chưa sinh |
H360Df | Có thể gây hại trẻ chưa sinh. Nghi ngờ tổn thương khả năng sinh sản. |
H360F | Có thể làm tổn thương khả năng sinh sản |
H360FD | Có thể làm tổn thương khả năng sinh sản. Có thể làm tổn thương trẻ chưa sinh. |
H360Fd | Có thể làm tổn thương khả năng sinh sản. Nghi ngờ có thể làm tổn thương trẻ chưa sinh. |
H361 | Nghi ngờ làm tổn thương khả năng sinh sản hay trẻ chưa sinh |
H361d | Nghi ngờ làm tổn thương trẻ chưa sinh |
H361f | Nghi ngờ làm tổn thương khả năng sinh sản |
H361fd | Nghi ngờ làm tổn thương khả năng sinh sản. Nghi ngờ làm tổn thương trẻ chưa sinh. |
H362 | Có thể gây hại trẻ bú mẹ |
H370 | Làm tổn thương nội tạng |
H371 | Có thể làm tổn thương nội tạng |
H372 | Làm tổn thương nội tạng nếu tiếp xúc lâu dài hoặc nhiều lần |
H373 | Có thể làm tổn thương nội tạng nếu tiếp xúc lâu dài hoặc nhiều lần |
H400 | Rất độc với sinh vật thủy sinh |
H401 | Độc với sinh vật thủy sinh |
H402 | Có hại với sinh vật thủy sinh |
H410 | Rất độc với sinh vật thủy sinh với hậu quả lâu dài |
H411 | Độc với sinh vật thủy sinh với hậu quả lâu dài |
H412 | Có hại với sinh vật thủy sinh với hậu quả lâu dài |
H413 | Có thể gây hậu quả lâu dài cho sinh vật thủy sinh |
H420 | Gây hại sức khỏa và môi trường do phá hủy tầng ôzôn ở thượng quyển |
H441 | Rất độc với động vật không xương sống trên cạn |
Code | Phrase |
---|---|
P102 | Tránh xa tầm tay trẻ em. |
P103 | Đọc nhãn mác trước khi sử dụng. |
P201 | Coi hướng dẫn đặc biệt trước khi sử dụng. |
P202 | Không sử dụng cho đến khi đọc và hiểu tất cả chỉ dẫn an toàn. |
P210 | Tránh xa nhiệt/tia lửa/ngọn lửa/bề mặt nóng – Không hút thuốc. |
P211 | Không phun lên ngọn lửa hay những nguồn đốt cháy khác. |
P212 | Tránh làm nóng trong môi trường kín hoặc thiếu tác nhân giảm nhạy. |
P220 | Giữ/Chứa tránh xa quần áo/.../vật liệu cháy được. |
P221 | Cẩn thận không để lẫn với chất cháy được. |
P222 | Không được để tiếp xúc với không khí. |
P223 | Tránh xa mọi tiếp xúc với nước, do phản ứng dữ dội và có thể gây cháy. |
P230 | Giữ ướt với ... |
P231 | Xử lý với khí trơ/... |
P231+P232 | Xử lý với khí trơ. Tránh xa ẩm. |
P232 | Bảo quản khỏi độ ẩm. |
P233 | Giữ kín vật chứa. |
P234 | Chỉ giữ trong vật chứa gốc. |
P235 | Giữ mát. |
P235+P410 | Giữ lạnh. Tránh xa ánh sáng mặt trời. |
P240 | Nối đất/liên kết vật chứa và thiết bị tiếp nhận. |
P241 | Dùng thiết bị điện/thông gió/ánh sáng/... chống nổ. |
P242 | Chỉ dùng dụng cụ không phát tia lửa. |
P243 | Thực hiện các biện pháp phòng ngừa chống phóng tĩnh điện. |
P244 | Giữ van giảm áp không có dầu mỡ. |
P250 | Tránh mài/sốc/.../ma sát. |
P251 | Vật chứa áp suất cao – Không đục hay đốt, ngay cả sau khi sử dụng. |
P260 | Không được hít bụi/khói/khí/sương/hơi/phun. |
P261 | Tránh hít phải bụi/khói/khí/sương/hơi/phun. |
P262 | Không để tiếp xúc với mắt, da hay quần áo. |
P263 | Tránh tiếp xúc khi mang thai/chăm sóc trẻ. |
P264 | Rủa … sạch sau khi sử dụng. |
P270 | Không được ăn, uống hay hút thuốc khi sử dụng sản phẩm này. |
P271 | Chỉ dùng ngoài trời hay khu vực thông khí. |
P272 | Không để quần áo bị nhiễm ra ngoài nơi làm việc. |
P273 | Tránh thải ra môi trường. |
P280 | Mặc găng tay bảo hộ/đồ bảo hộ/kính bảo hộ/mặt nạ bảo hộ. |
P281 | Sử dụng thiết bị bảo hộ cá nhân được yêu cầu. |
P282 | Đeo găng tay/mặt nạ/kính bảo hộ chịu lạnh. |
P283 | Mặc quần áo chống/chịu lửa. |
P284 | Mặc thiết bị bảo hộ hô hấp. |
P285 | Mặc thiết bị bảo hộ hô hấp trong trường hợp thông khí không đủ. |
P301 | NẾU NUỐT: |
P301+P310 | NẾU NUỐT: Lập tức gọi TRUNG TÂM TRỊ ĐỘC hoặc bác sĩ. |
P301+P310+P330 | NẾU NUỐT: Lập tức gọi TRUNG TÂM TRỊ ĐỘC hoặc bác sĩ. Súc miệng. |
P301+P312 | NẾU NUỐT: Gọi TRUNG TÂM TRỊ ĐỘC hoặc bác sĩ nếu cảm thấy không khỏe. |
P301+P312+P330 | NẾU NUỐT: Gọi TRUNG TÂM TRỊ ĐỘC hoặc bác sĩ nếu cảm thấy không khỏe. Súc miệng. |
P301+P330+P331 | NẾU NUỐT: Súc miệng. KHÔNG làm ói mửa. |
P302 | NẾU VÀO DA: |
P302+P312 | NẾU VÀO DA: Gọi TRUNG TÂM TRỊ ĐỘC hoặc bác sĩ nếu cảm thấy không khỏe. |
P302+P334 | NẾU VÀO DA: Ngâm trong nước lạnh/quấn trong băng ướt. |
P302+P335+P334 | NẾU VÀO DA: Loại bỏ hạt khỏi da. Ngâm trong nước lạnh/quấn trong băng ướt. |
P302+P350 | NẾU VÀO DA: Rửa nhẹ nhàng với xà phòng và nước. |
P302+P352 | NẾU VÀO DA: Rửa với xà phòng và nước. |
P302+P352+P312 | NẾU VÀO DA: Rửa với xà phòng và nước. Gọi TRUNG TÂM TRỊ ĐỘC hoặc bác sĩ nếu cảm thấy không khỏe. |
P302+P353 | NẾU VÀO DA: Rửa da với nước/vòi sen. |
P303 | NẾU VÀO DA (hoặc tóc): |
P303+P361+P353 | NẾU VÀO DA (hoặc tóc): Lập tức loại bỏ/cởi bỏ tất cả quần áo bị nhiễm. Rửa da với nước/vòi sen. |
P303+P361+P353+P315 | NẾU VÀO DA (hoặc tóc): Lập tức loại bỏ/cởi bỏ tất cả quần áo bị nhiễm. Rửa da với nước/vòi sen. Lập tức nhận tư vấn/chăm sóc y tế. |
P304 | NẾU HÍT VÀO: |
P304+P312 | NẾU HÍT VÀO: Gọi TRUNG TÂM TRỊ ĐỘC hoặc bác sĩ nếu cảm thấy không khỏe. |
P304+P340 | NẾU HÍT VÀO: Đưa nạn nhân ra chỗ không khí trong lành và giữ ở vị trí thoải mái cho việc thở. |
P304+P340+P310 | NẾU HÍT VÀO: Đưa nạn nhân ra chỗ không khí trong lành và giữ ở vị trí thoải mái cho việc thở. Lập tức gọi TRUNG TÂM TRỊ ĐỘC hoặc bác sĩ. |
P304+P340+P311 | NẾU HÍT VÀO: Đưa nạn nhân ra chỗ không khí trong lành và giữ ở vị trí thoải mái cho việc thở. Gọi TRUNG TÂM TRỊ ĐỘC hoặc bác sĩ. |
P304+P340+P312 | NẾU HÍT VÀO: Đưa nạn nhân ra chỗ không khí trong lành và giữ ở vị trí thoải mái cho việc thở. Gọi TRUNG TÂM TRỊ ĐỘC hoặc bác sĩ nếu cảm thấy không khỏe. |
P304+P340+P315 | NẾU HÍT VÀO: Đưa nạn nhân ra chỗ không khí trong lành và giữ ở vị trí thoải mái cho việc thở. Lập tức nhận tư vấn/chăm sóc y tế. |
P304+P341 | NẾU HÍT VÀO: Nếu hít thở khó khăn, đưa nạn nhân ra chỗ không khí trong lành và giữ ở vị trí thoải mái cho việc thở. |
P305 | NẾU VÀO MẮT: |
P305+P351+P338 | NẾU VÀO MẮT: Rửa cẩn thận bằng nước trong vài phút. Loại bỏ kính áp tròng nếu có và dễ thực hiện. Tiếp tục rửa. |
P305+P351+P338+P310 | NẾU VÀO MẮT: Rửa cẩn thận bằng nước trong vài phút. Loại bỏ kính áp tròng nếu có và dễ thực hiện. Tiếp tục rửa. Lập tức gọi TRUNG TÂM TRỊ ĐỘC hoặc bác sĩ. |
P305+P351+P338+P315 | NẾU VÀO MẮT: Rửa cẩn thận bằng nước trong vài phút. Loại bỏ kính áp tròng nếu có và dễ thực hiện. Tiếp tục rửa. Lập tức nhận tư vấn/chăm sóc y tế. |
P306 | NẾU VÀO QUẦN ÁO: |
P306+P360 | NẾU VÀO QUẦN ÁO: Lập tức rửa quần áo và da bị nhiễm với nhiều nước trước khi cởi đồ. |
P307 | NẾU phơi nhiễm: |
P307+P311 | NẾU phơi nhiễm: Gọi TRUNG TÂM TRỊ ĐỘC hoặc bác sĩ. |
P308 | NẾU phơi nhiễm hoặc lo ngại: |
P308+P310 | NẾU phơi nhiễm hoặc lo ngại: Lập tức gọi TRUNG TÂM TRỊ ĐỘC hoặc bác sĩ. |
P308+P311 | NẾU phơi nhiễm hoặc lo ngại: Gọi TRUNG TÂM TRỊ ĐỘC hoặc bác sĩ. |
P308+P313 | NẾU phơi nhiễm hoặc lo ngại: Nhận tư vấn/chăm sóc y tế. |
P309 | NẾU phơi nhiễm hoặc cảm thấy không khỏe: |
P309+P311 | NẾU phơi nhiễm hoặc cảm thấy không khỏe: Gọi TRUNG TÂM TRỊ ĐỘC hoặc bác sĩ. |
P310 | Lập tức gọi TRUNG TÂM TRỊ ĐỘC hoặc bác sĩ. |
P311 | Gọi TRUNG TÂM TRỊ ĐỘC hoặc bác sĩ. |
P312 | Gọi TRUNG TÂM TRỊ ĐỘC hoặc bác sĩ nếu cảm thấy không khỏe. |
P313 | Nhận tư vấn/chăm sóc y tế. |
P314 | Nhận tư vấn/chăm sóc y tế nếu cảm thấy không khỏe. |
P315 | Lập tức nhận tư vấn/chăm sóc y tế. |
P320 | Khẩn cấp điều trị cụ thể (xem ... trên nhãn mác). |
P321 | Điều trị cụ thể (xem … trên nhãn mác). |
P322 | Biện pháp cụ thể (xem … trên nhãn mác). |
P330 | Súc miệng. |
P331 | KHÔNG làm ói mửa. |
P332 | Nếu ngứa da: |
P332+P313 | Nếu ngứa da: Nhận tư vấn/chăm sóc y tế. |
P333 | Nếu ngứa hoặc rát da: |
P333+P313 | Nếu ngứa hoặc rát da: Nhận tư vấn/chăm sóc y tế. |
P334 | Ngâm trong nước lạnh/quấn trong băng ướt. |
P335 | Loại bỏ hạt khỏi da. |
P335+P334 | Loại bỏ hạt khỏi da. Ngâm trong nước lạnh/quấn trong băng ướt. |
P336 | Làm tan phần bị đóng băng với nước ấm. Không chà xát phần bị ảnh hưởng. |
P336+P315 | Làm tan phần bị đóng băng với nước ấm. Không chà xát phần bị ảnh hưởng. Lập tức nhận tư vấn/chăm sóc y tế. |
P337 | Nếu ngứa mắt kéo dài: |
P337+P313 | Nhận tư vấn/chăm sóc y tế. |
P338 | Loại bỏ kính áp tròng nếu có và dễ thực hiện. Tiếp tục rửa. |
P340 | Đưa nạn nhân ra chỗ không khí trong lành và giữ ở vị trí thoải mái cho việc thở. |
P341 | Nếu hít thở khó khăn, đưa nạn nhân ra chỗ không khí trong lành và giữ ở vị tri thoải mái cho việc thở. |
P342 | Nếu có triệu chúng hô hấp: |
P342+P311 | Nếu có triệu chúng hô hấp: Gọi TRUNG TÂM TRỊ ĐỘC hoặc bác sĩ. |
P350 | Rửa nhẹ nhàng với xà phòng và nước. |
P351 | Rửa cẩn thận bằng nước trong vài phút. |
P352 | Rửa với xà phòng và nước. |
P353 | Rửa da với nước/vòi sen. |
P360 | Lập tức rửa quần áo và da bị nhiễm với nhiều nước trước khi cởi đồ. |
P361 | Lập tức loại bỏ/cởi bỏ tất cả quần áo bị nhiễm. |
P361+P364 | Lập tức loại bỏ/cởi bỏ tất cả quần áo bị nhiễm và giặt nó trước khi dùng lại. |
P362 | Cởi bỏ quần áo bị nhiễm và rửa sạch trước khi dùng lại. |
P362+P364 | Cởi bỏ quần áo bị nhiễm và rửa sạch trước khi dùng lại và giặt nó trước khi dùng lại. |
P363 | Giặt quần áo bị nhiễm trước khi dùng lại. |
P364 | Và giặt nó trước khi dùng lại. |
P370 | Trong trường hợp cháy: |
P370+P372+P380+P373 | Trong trường hợp cháy: Nguy cơ nổ khi có lửa. Sơ tán khu vực. KHÔNG dập lửa khi lửa lan đến chất nổ. |
P370+P376 | Trong trường hợp cháy: Dừng rò rỉ nếu có thể thực hiện an toàn. |
P370+P378 | Trong trường hợp cháy: Dùng ... để dập lửa. |
P370+P380 | Trong trường hợp cháy: Sơ tán khu vực. |
P370+P380+P375 | Trong trường hợp cháy: Sơ tán khu vực. Dập lửa từ xa do nguy cơ nổ. |
P370+P380+P375+P378 | Trong trường hợp cháy: Sơ tán khu vực. Dập lửa từ xa do nguy cơ nổ. Dùng ... để dập lửa. |
P371 | Trong trường hợp cháy lớn và nhiều: |
P371+P380+P375 | Trong trường hợp cháy lớn và nhiều: Sơ tán khu vực. Dập lửa từ xa do nguy cơ nổ. |
P372 | Nguy cơ nổ khi có lửa. |
P373 | KHÔNG dập lửa khi lửa lan đến chất nổ. |
P374 | Dập lửa bằng biện pháp thông thường ở khoảng cách an toàn. |
P375 | Dập lửa từ xa do nguy cơ nổ. |
P376 | Dừng rò rỉ nếu có thể thực hiện an toàn. |
P377 | Khí rò rỉ cháy – không dập trừ khi rò rỉ có thể được dừng an toàn. |
P378 | Dùng ... để dập lửa. |
P380 | Sơ tán khu vực. |
P381 | Loại bỏ tất cả nguồn đốt cháy nếu có thể thực hiện an toàn. |
P390 | Hấp thụ chất lỏng tràn để tránh hư hỏng vật liệu. |
P391 | Thu gom chất lỏng tràn. |
P401 | Cất giữ ... |
P402 | Giữ ở nơi khô ráo. |
P402+P404 | Giữ ở nơi khô ráo. Giữ trong vật chứa kín. |
P403 | Giữ ở nơi thông thoáng. |
P403+P233 | Giữ ở nơi thông thoáng. Giữ kín vật chứa. |
P403+P235 | Giữ ở nơi thông thoáng. Giữ mát. |
P404 | Giữ trong vật chứa kín. |
P405 | Store locked up. |
P406 | Giữ trong vật chứa chống ăn mòn/... với lớp lót bên trong. |
P407 | Giữ khoảng không khí giữa các ngăn/pallet. |
P410 | Tránh ánh sáng mặt trời. |
P410+P403 | Tránh ánh sáng mặt trời. Giữ ở nơi thông thoáng. |
P410+P412 | Tránh ánh sáng mặt trời. Tránh nhiệt độ quá 50 ºC/122 ºF.. |
P411 | Giữ ở nhiệt độ không quá ... ºC/... ºF. |
P411+P235 | Giữ ở nhiệt độ không quá ... ºC/... ºF. Giữ mát. |
P412 | Tránh nhiệt độ quá 50 ºC/122 ºF.. |
P413 | Cất giữ số lượng lớn hơn ... kg/... lbs tại nhiệt độ không quá ... °C/... °F. |
P420 | Tránh xa những vật liệu khác. |
P422 | Cất giữ dưới ... |
P501 | Loại bỏ chất/vật chứa ... |
P502 | Liên hệ nhà sản xuất hoặc nhà cung cấp cho thông tin về phục hồi hoặc tái chế. |
|listtype=abbr
(default)Listtype options
|
---|
|
Complete H, P lists (H200, H201, H202, ...)
|
---|
As of 27 November 2021:
|
Repeated phrase codes are hidden:
{{GHS phrases|H400|H401|H401|H401}}
→ H400, H401|omit=true
(default)
Omit Rules: when the keep ID is present, do not show the omit ID phrase
|
{{GHS phrases|H314|H318}}
→ H314module function | template | note |
---|---|---|
main |
{{GHS phrases}} {{H-phrases}} {{P-phrases}} |
|setid=H, P preset
|
listAll |
{{GHS phrases/inline}} | equals main + |listtype=inline
|
numberOfPhrases |
{{GHS phrases/number of phrases}} | |
listAll |
{{GHS phrases/list all}} | |
listOmitRules |
{{GHS phrases/list omit rules}} | documentation only; no |setid=
|
--------------------------------------------------------------------------------
-- Module:GHS phrases
--
-- main: reads GHS parameters (arguments like "H301", "P401")
-- and returns for each (listtype='abbr'):
-- phraseID visible; formal phrase text as <abbr title="...">
-- setID = "H" or "P"
-- phraseID = e.g. "H201", "P231+P234"
-- phrase text read from array tables in [[Module:GHS phrases/data]]
--
-- Implements: [[Template:GHS phrases]]
-- Helppage: [[Template:GHS phrases]]
-- Error category: [[Category:GHS errors]], [[Thể loại:Lỗi GHS]] (mainspace pages only)
--
-- Also:
-- listAll(), numberOfPhrases(), listOmitRules(),
-- listtype, omit
--------------------------------------------------------------------------------
require('strict')
local r = {} -- "r" for return, so no confusion with setID P
local GHSdata = mw.loadData('Module:GHS phrases/data')
local getArgs = require('Module:Arguments').getArgs
local tTools = require('Module:TableTools')
local yesno = require('Module:Yesno')
local tArgName = {} -- named parameters (setid, omit, listtype)
local tMessagesToShow = {} -- the tail: Preview, Categories
--------------------------------------------------------------------------------
-- wlHelpPage
--
-- Formats page as [[Helppage#Section|Label]]
-- by default, sLabel == sSection
--------------------------------------------------------------------------------
local function wlHelpPage(sSection, sLabel)
local sHelpPage = 'Template:GHS phrases'
if sLabel == nil then sLabel = sSection end
if (sLabel or '') == '' then
sLabel = ''
else
sLabel = '|' .. sLabel
end
if (sSection or '') == '' then
sSection = ''
else
sSection = '#' .. sSection
end
return '[[' .. sHelpPage .. sSection .. sLabel .. ']]'
end
--------------------------------------------------------------------------------
-- addErrorCategory
--
-- Formats as [[Category:GHS errors|catsort]]
-- or '' when in other namespace.
-- sCatsort option using: H, P, _
--------------------------------------------------------------------------------
local function addErrorCategory(sCatsort)
local pagetype = require('Module:Pagetype').main
local wlErrCat = ''
if pagetype() == 'article' then -- mainspace only
if sCatsort == nil then sCatsort = tArgName['setID'] end
if sCatsort == '' then
wlErrCat = '[[Thể loại:Lỗi GHS]]'
else
wlErrCat = '[[Thể loại:Lỗi GHS|' .. sCatsort .. ']]'
end
else
return ''
end
table.insert(tMessagesToShow, wlErrCat)
return
end
--------------------------------------------------------------------------------
-- addWarningCategory
--
-- Formats as [[Thể loại:Lỗi GHS|catsort]]
-- mainspace only, or '' when in other namespace.
-- sCatsort option using: H, P, U, ?, D, O
--------------------------------------------------------------------------------
local function addWarningCategory(sCatsort)
local pagetype = require('Module:Pagetype').main
if sCatsort == nil then sCatsort = tArgName['setID'] end
local wlWarnCat = ''
if pagetype() == 'article' then -- mainspace only
if sCatsort == '' then
wlWarnCat = '[[Thể loại:Lỗi GHS]]'
else
wlWarnCat = '[[Thể loại:Lỗi GHS|' .. sCatsort .. ']]'
end
else
return
end
table.insert(tMessagesToShow, wlWarnCat)
return
end
--------------------------------------------------------------------------------
-- addPreviewMsg
--------------------------------------------------------------------------------
local function addPreviewMsg(sMsg)
local previewWarn = require('Module:If preview')._warning
table.insert(tMessagesToShow, previewWarn({sMsg}))
return
end
--------------------------------------------------------------------------------
-- showPreviewMsg
--
-- show table tMessagesToShow
-- preview-messages and errorcat
-- all namespaces
--------------------------------------------------------------------------------
local function showPreviewMsg()
if tTools.size(tMessagesToShow) > 0 then
return table.concat(tMessagesToShow, '')
else
return ''
end
end
--------------------------------------------------------------------------------
-- applyRemoveDuplicates
--
-- returns edited table, with double Codes removed
-- adds warning with codes.
-- base table tArgs is walked through by a iwalker that reads a singel code,
-- then a ikiller checks the upward part of the same table to delete all copies
-- ikiller starts at end of table, walks towards iwalker; then tArgs is compressed
-- iwalker steps 1 up in the freshly compressed table
-- Used: iArgs is sorted, and order stays same. compress does not change that.
--------------------------------------------------------------------------------
local function applyRemoveDuplicates(tArgs)
local iR, iK -- iR = reader, iK = killer
local hit = false
iR = 1
while iR < #tArgs do
iK = #tArgs -- will be counting downwards
while iK > iR do
if tArgs[iK] == tArgs[iR] then
hit = true
addPreviewMsg('Duplicate removed: ' .. tArgs[iR])
table.remove(tArgs, iK)
tTools.compressSparseArray(tArgs)
end
iK = iK - 1
end
tTools.compressSparseArray(tArgs)
iR = iR + 1
end
if hit then
addWarningCategory('D')
end
return tArgs
end
--------------------------------------------------------------------------------
-- applyOmitRules
--
-- returns edited table, with Omit phraseID's removed
-- Omit rule is per GHS_Rev9E_0.pdf (2021)
--------------------------------------------------------------------------------
local function applyOmitRules(tArgs)
local tRules = GHSdata['tOmitRules']
local hit = false
for keep, omit in pairs(tRules) do
if tTools.inArray(tArgs, omit) then
if tTools.inArray(tArgs, keep) then
hit = true
for i, k in pairs(tArgs) do
if k == omit then
table.remove(tArgs, i)
end
end
addPreviewMsg(wlHelpPage('Omit Rules') .. ': keep ' .. keep .. ', omit ' .. omit)
end
end
end
if hit then
tTools.compressSparseArray(tArgs)
addWarningCategory('O')
end
return tArgs
end
--------------------------------------------------------------------------------
-- label H-phrases or P-phrases
--------------------------------------------------------------------------------
local function PHlabel()
if tArgName['setID'] == 'GHS' then
return 'GHS phrases'
else
return tArgName['setID'] .. '-phrases'
end
end
--------------------------------------------------------------------------------
-- inMono
--
-- Use mono font-family (from: Template:Mono)
--------------------------------------------------------------------------------
local function inMono(s)
if s == nil then s = '' end
return '<span class="monospaced" style="font-family: monospace;">' .. s .. '</span>'
end
--------------------------------------------------------------------------------
-- wlInlineTag
--
-- Returns <sup>[?]</sup> with wikilink to [[helppage#section|errormessage]]
--------------------------------------------------------------------------------
local function wlInlineTag(phraseID)
local sMsg
sMsg = '<sup><span class="noprint Inline-Template">[<i>'
.. wlHelpPage(PHlabel(), '<span title="'
.. PHlabel() .. ': '
.. 'không tìm thấy '
.. phraseID
.. '">?</span>')
.. '</i>]</span></sup>'
return sMsg
end
--------------------------------------------------------------------------------
-- errorPhraseIDnotFound
--
-- Returns single value when error (not found in list):
-- plain value + inline warning [?] (linked) + error cat (mainsp) + preview warning
--------------------------------------------------------------------------------
local function errorPhraseIDnotFound(phraseID)
if phraseID == nil then phraseID = '' end
local inlineTag = wlInlineTag(phraseID)
local previewMsg = wlHelpPage(PHlabel()) .. ': không tìm thấy \"' .. phraseID .. '\"'
addPreviewMsg(previewMsg)
addErrorCategory()
return phraseID .. inlineTag
end
--------------------------------------------------------------------------------
-- errorHPsetIDnotFound
--
-- setID H or P could not be found
--------------------------------------------------------------------------------
local function errorHPsetIDnotFound()
local sMsg
sMsg = wlHelpPage('', PHlabel())
.. ': không tìm thấy id "H" hoặc "P"'
.. ' (vui lòng sử dụng mẫu như "|H200" hoặc "|P300+P301")'
addPreviewMsg(sMsg)
addErrorCategory('?')
return showPreviewMsg()
end
--------------------------------------------------------------------------------
-- errorHPsetIDmissing
--
-- parameter |setid= to be used
--------------------------------------------------------------------------------
local function errorHPsetIDmissing()
local sMsg
sMsg = wlHelpPage( '', PHlabel())
.. ': không tìm thấy id "H" hoặc "P",'
.. ' vui lòng sử dụng |setid=... (H hoặc P)'
addPreviewMsg(sMsg)
return
end
--------------------------------------------------------------------------------
-- formatPhraseAbbr
--
-- format phraseID and text, for abbr-form (infobox list form)
--------------------------------------------------------------------------------
local function formatPhraseAbbr(phraseID, sPhrase)
return '<abbr class="abbr" title=" ' .. phraseID .. ': ' .. sPhrase .. '">'
.. phraseID
.. '</abbr>'
end
--------------------------------------------------------------------------------
-- formatPhraseInline
--
-- format phraseID and text, for inline form (in sentence)
-- adds "quotes"
--------------------------------------------------------------------------------
local function formatPhraseInline(phraseID, sPhrase)
return inMono(phraseID) .. ': \"' .. sPhrase .. '\"'
end
--------------------------------------------------------------------------------
-- formatPhraseList
--
-- as inline, but no "quotes" added.
--------------------------------------------------------------------------------
local function formatPhraseList(phraseID, sPhrase)
return inMono(phraseID) .. ': ' .. sPhrase
end
--------------------------------------------------------------------------------
-- getSetID
--
-- Determines setID (expected either 'H' or 'P')
-- First route is: read |setid=
-- When |setid= is not set,
-- it looks for a first parameter that has an H of P prefix (in |P201|P202|...)
-- when not found, 'GHS' is retured
-- In one call, P and H numbers can *not* be mixed
-- so "|H201|P202|" will cause error "P202 not found" (... in H-list)
--------------------------------------------------------------------------------
local function getSetID(tArgs)
local setIDfound = 'GHS'
local paramsetID = tArgs['setid'] or nil
if (paramsetID ~= nil) and (paramsetID == 'P' or paramsetID == 'H') then
setIDfound = paramsetID
else
local initial = nil
for i, v in ipairs(tArgs) do
initial = mw.ustring.match(v, '^[PH]')
if initial ~=nil then
setIDfound = initial
break
end
end
end
return setIDfound
end
--------------------------------------------------------------------------------
-- getListType
--
-- Checks list format, including those from Module:List
--------------------------------------------------------------------------------
local function getListType(tArgs)
local listTypes = {
['abbr'] = true,
['bulleted'] = true,
['unbulleted'] = true,
['horizontal'] = true,
['ordered'] = true,
['horizontal_ordered'] = true,
['horizontal ordered'] = true,
['inline'] = true
}
local sListType = tArgs['listtype'] or 'abbr'
if sListType == '' or sListType == 'abbr' then
return 'abbr'
elseif listTypes[sListType] == true then
if sListType == 'horizontal ordered' then
sListType = 'horizontal_ordered'
end
return sListType
else
sListType = 'abbr'
end
return sListType
end
--------------------------------------------------------------------------------
-- getDoOmitRules
--------------------------------------------------------------------------------
local function getDoOmitRules(tArgs)
local b = yesno(tArgs['omit'], true)
if b == nil then b = true end
return yesno(b, true)
end
--------------------------------------------------------------------------------
-- prepareArgs
--
-- First: determine setID (from |setID= OR from prefixes in parameters)
-- Then: clean up & format phrase IDs (=unnamed parameters)
-- remove bad characters, create H/P pattern "H201", "P310+P302"
-- straight array, no nil's, sorted
--------------------------------------------------------------------------------
local function prepareArgs(tArgs)
tArgName['setID'] = getSetID(tArgs)
tArgName['listtype'] = getListType(tArgs)
tArgName['omit'] = getDoOmitRules(tArgs)
tArgs = tTools.compressSparseArray(tArgs) -- removes all named args
if string.len(tArgName['setID']) == 1 and #tArgs > 0 then
for i, v in ipairs(tArgs) do
v = mw.text.decode(v)
v = mw.ustring.gsub(v, '[^%d%+A-Za-z]', '')
v = mw.ustring.gsub(v, '^(%d)', tArgName['setID'] .. '%1')
v = mw.ustring.gsub(v, '%+(%d)', '+' .. tArgName['setID'] .. '%1')
tArgs[i] = v
end
table.sort(tArgs)
end
return tArgs
end
--------------------------------------------------------------------------------
-- listAll
--
-- Returns wikitable rows for each phrase id.
-- requires |setID=P/H
-- returns full list, all phrases, for a setID
-- 2-columns wikitable, sorted, sortable, anchor like "H201" for each
--------------------------------------------------------------------------------
function r.listAll(frame)
local newArgs = getArgs(frame)
local tL = {}
prepareArgs(newArgs)
local tRead
if tArgName['setID'] == 'H' then
tRead = GHSdata['Hphrases']
elseif tArgName['setID'] == 'P' then
tRead = GHSdata['Pphrases']
else
errorHPsetIDmissing()
return showPreviewMsg()
end
-- Intermediate table t2 to maintain order; read from original table (/data)
local t2 = {}
local iPh
for s, v in pairs(tRead) do
iPh = tonumber(mw.ustring.match(s, '[PH](%d%d%d)'))
if string.len(s) > 4 then
iPh = tTools.size(t2) + 1
end
table.insert(t2, iPh, s)
end
t2 = tTools.compressSparseArray(t2)
table.sort(t2)
local sTR, v, sAnchor
-- i = array index, s = phraseID, v = phrase text
for i, s in ipairs(t2) do
v = tRead[s]
sAnchor = '<span class="anchor" id="' .. s .. '"></span>'
sTR = '|- ' .. sAnchor .. '\n| datasortvalue="' .. i .. '" | <span style="font-family: monospace;">' .. s .. '</span> || ' .. v
table.insert(tL, sTR)
end
return table.concat(tL, '\n')
end
--------------------------------------------------------------------------------
-- numberOfPhrases
--
-- Documentation
-- requires |setID=H/P
-- Returns number of phrases, in format
-- "GHS H-phrases (123)"
--------------------------------------------------------------------------------
function r.numberOfPhrases(frame)
local newArgs = getArgs(frame)
prepareArgs(newArgs)
local iT
if tArgName['setID'] == 'H' then
iT = tTools.size(GHSdata['Hphrases'])
elseif tArgName['setID'] == 'P' then
iT = tTools.size(GHSdata['Pphrases'])
else
errorHPsetIDmissing()
return showPreviewMsg()
end
return 'GHS ' .. PHlabel() .. ' <span style="font-weight: normal;">(' .. tostring(iT) .. ')</span>'
end
--------------------------------------------------------------------------------
-- listOmitRules
--
-- self-documentation
--------------------------------------------------------------------------------
function r.listOmitRules()
local tRules = GHSdata['tOmitRules']
local tL = {}
local s
s = wlHelpPage('Omit Rules')
.. ': when the <i>keep</i> ID is present, do not show the <i>omit</i> ID phrase'
table.insert(tL, s)
for keep, omit in pairs (tRules) do
s = '• keep ' .. inMono(keep) .. ', omit ' .. inMono(omit)
table.insert(tL, s)
end
return table.concat(tL, '<br/>')
end
--------------------------------------------------------------------------------
-- _main
--
-- processes setID (H, P) and phrase codes
-- error: setID not P, H
-- code not found
-- cannot mix H and P phrases
-- reads phrases from /data H or P phrases tables
-- formats phrase (abbreviation, abbr-title, phraseID)
--------------------------------------------------------------------------------
function r._main(tArgs)
tArgs = prepareArgs(tArgs)
if #tArgs == 0 then
return showPreviewMsg() -- no content
elseif tArgName['setID'] == 'GHS' then
return errorHPsetIDnotFound()
end
tArgs = applyRemoveDuplicates(tArgs)
if tArgName['omit'] then
tArgs = applyOmitRules(tArgs)
end
local formatterF
if tArgName['listtype'] == 'abbr' then
formatterF = formatPhraseAbbr
elseif tArgName['listtype'] == 'inline' then
formatterF = formatPhraseInline
else --- Module:List options
formatterF = formatPhraseList
end
local tReadD = {}
if tArgName['setID'] == 'H' then
tReadD = GHSdata['Hphrases']
elseif tArgName['setID'] == 'P' then
tReadD = GHSdata['Pphrases']
else
return showPreviewMsg()
end
local sPhrase
local tR = {}
for i, v in ipairs(tArgs) do
sPhrase = tReadD[v]
if sPhrase == nil then
table.insert(tR, errorPhraseIDnotFound(tostring(v)))
else
table.insert(tR, formatterF(v, sPhrase))
end
end
if tArgName['listtype'] == 'abbr' then
return table.concat(tR, ', ') .. showPreviewMsg()
elseif tArgName['listtype'] == 'inline' then
return table.concat(tR, ', ') .. showPreviewMsg()
else
local mList = require('Module:List')
return mList[tArgName['listtype']](tR) .. showPreviewMsg()
end
end
--------------------------------------------------------------------------------
-- main
--
-- handles template input frame, then calls generic _main() function
-- To be invoked from {{template}}
--------------------------------------------------------------------------------
function r.main(frame)
local newArgs = getArgs(frame)
return r._main(newArgs)
end
return r