@indodev/toolkit 0.2.0 → 0.3.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.
@@ -450,6 +450,741 @@ var ABBREVIATIONS = {
450
450
  "m3.": "meter kubik",
451
451
  "ha.": "hektar"
452
452
  };
453
+ var PROFANITY = [
454
+ "anjing",
455
+ "babi",
456
+ "bangsat",
457
+ "bajingan",
458
+ "brengsek",
459
+ "goblok",
460
+ "tolol",
461
+ "idiot",
462
+ "perek",
463
+ "jablay",
464
+ "kontol",
465
+ "memek",
466
+ "ngewe",
467
+ "puki",
468
+ "jembut",
469
+ "asu",
470
+ "itil",
471
+ "lanjiao",
472
+ "pantek",
473
+ "anying",
474
+ "anjrit"
475
+ ];
476
+ var STOPWORDS = [
477
+ "ada",
478
+ "adalah",
479
+ "adanya",
480
+ "adapun",
481
+ "agak",
482
+ "agaknya",
483
+ "agar",
484
+ "akan",
485
+ "akankah",
486
+ "akhir",
487
+ "akhiri",
488
+ "akhirnya",
489
+ "aku",
490
+ "akulah",
491
+ "amat",
492
+ "amatlah",
493
+ "anda",
494
+ "andalah",
495
+ "antar",
496
+ "antara",
497
+ "antaranya",
498
+ "apa",
499
+ "apaan",
500
+ "apabila",
501
+ "apakah",
502
+ "apalagi",
503
+ "apatah",
504
+ "artinya",
505
+ "asal",
506
+ "asalkan",
507
+ "atas",
508
+ "atau",
509
+ "ataukah",
510
+ "ataupun",
511
+ "awal",
512
+ "awalnya",
513
+ "bagai",
514
+ "bagaikan",
515
+ "bagaimana",
516
+ "bagaimanakah",
517
+ "bagaimanapun",
518
+ "bagi",
519
+ "bagian",
520
+ "bahkan",
521
+ "bahwa",
522
+ "bahwasanya",
523
+ "baik",
524
+ "bakal",
525
+ "bakalan",
526
+ "balik",
527
+ "banyak",
528
+ "bapak",
529
+ "baru",
530
+ "bawah",
531
+ "beberapa",
532
+ "begini",
533
+ "beginian",
534
+ "beginikah",
535
+ "beginilah",
536
+ "begitu",
537
+ "begitukah",
538
+ "begitulah",
539
+ "begitupun",
540
+ "bekerja",
541
+ "belakang",
542
+ "belakangan",
543
+ "belum",
544
+ "belumlah",
545
+ "benar",
546
+ "benarkah",
547
+ "benarlah",
548
+ "berada",
549
+ "berakhir",
550
+ "berakhirlah",
551
+ "berakhirnya",
552
+ "berapa",
553
+ "berapakah",
554
+ "berapalah",
555
+ "berapapun",
556
+ "berarti",
557
+ "berawal",
558
+ "berbagai",
559
+ "berikut",
560
+ "berikutnya",
561
+ "berjumlah",
562
+ "berkali-kali",
563
+ "berkata",
564
+ "berkeinginan",
565
+ "berkenaan",
566
+ "berlainan",
567
+ "berlalu",
568
+ "berlangsung",
569
+ "berlebihan",
570
+ "bermacam",
571
+ "bermacam-macam",
572
+ "bermaksud",
573
+ "bermula",
574
+ "bersama",
575
+ "bersama-sama",
576
+ "bersiap",
577
+ "bersiap-siap",
578
+ "bertanya",
579
+ "bertanya-tanya",
580
+ "berturut",
581
+ "berturut-turut",
582
+ "bertutur",
583
+ "berujar",
584
+ "berupa",
585
+ "besar",
586
+ "betul",
587
+ "betulkah",
588
+ "biasa",
589
+ "biasanya",
590
+ "bila",
591
+ "bilakah",
592
+ "bisa",
593
+ "bisakah",
594
+ "boleh",
595
+ "bolehkah",
596
+ "bolehlah",
597
+ "buat",
598
+ "bukan",
599
+ "bukankah",
600
+ "bukanlah",
601
+ "bukannya",
602
+ "bulan",
603
+ "bung",
604
+ "cara",
605
+ "caranya",
606
+ "cukup",
607
+ "cukupkah",
608
+ "cukuplah",
609
+ "cuma",
610
+ "dahulu",
611
+ "dalam",
612
+ "dan",
613
+ "dapat",
614
+ "dari",
615
+ "daripada",
616
+ "datang",
617
+ "dekat",
618
+ "demi",
619
+ "demikian",
620
+ "demikianlah",
621
+ "dengan",
622
+ "depan",
623
+ "di",
624
+ "dia",
625
+ "diakhiri",
626
+ "diakhirinya",
627
+ "dialah",
628
+ "diantara",
629
+ "diantaranya",
630
+ "diberi",
631
+ "diberikan",
632
+ "diberikannya",
633
+ "dibuat",
634
+ "dibuatnya",
635
+ "didapat",
636
+ "didatangkan",
637
+ "digunakan",
638
+ "diibaratkan",
639
+ "diingat",
640
+ "diingatkan",
641
+ "diinginkan",
642
+ "dijawab",
643
+ "dijelaskan",
644
+ "dijelaskannya",
645
+ "dikarenakan",
646
+ "dikatakan",
647
+ "dikatakannya",
648
+ "dikerjakan",
649
+ "diketahui",
650
+ "diketahuinya",
651
+ "dikira",
652
+ "dilakukan",
653
+ "dilalui",
654
+ "dilihat",
655
+ "dimaksud",
656
+ "dimaksudkan",
657
+ "dimaksudkannya",
658
+ "dimana",
659
+ "dimanalah",
660
+ "dimulai",
661
+ "dimulailah",
662
+ "dimulainya",
663
+ "diminta",
664
+ "dimintai",
665
+ "dimisalkan",
666
+ "dimungkinkan",
667
+ "dini",
668
+ "dipastikan",
669
+ "diperbuat",
670
+ "diperbuatnya",
671
+ "dipergunakan",
672
+ "diperkirakan",
673
+ "diperlihatkan",
674
+ "diperlukan",
675
+ "diperlukannya",
676
+ "dipersoalkan",
677
+ "dipertanyakan",
678
+ "dipunyai",
679
+ "diri",
680
+ "dirinya",
681
+ "disampaikan",
682
+ "disebut",
683
+ "disebutkan",
684
+ "disebutkannya",
685
+ "disini",
686
+ "disinilah",
687
+ "disitulah",
688
+ "diterangkan",
689
+ "diterangkannya",
690
+ "diteruskan",
691
+ "ditujukan",
692
+ "ditunjuk",
693
+ "ditunjuki",
694
+ "ditunjukkan",
695
+ "ditunjukkannya",
696
+ "ditunjuknya",
697
+ "dituturkan",
698
+ "dituturkannya",
699
+ "diucapkan",
700
+ "diucapkannya",
701
+ "diungkapkan",
702
+ "dua",
703
+ "dulu",
704
+ "empat",
705
+ "enggak",
706
+ "enggaknya",
707
+ "entah",
708
+ "entahlah",
709
+ "guna",
710
+ "gunakan",
711
+ "hal",
712
+ "hampir",
713
+ "hanya",
714
+ "hanyalah",
715
+ "hari",
716
+ "harus",
717
+ "haruslah",
718
+ "harusnya",
719
+ "hendak",
720
+ "hendaklah",
721
+ "hendaknya",
722
+ "hingga",
723
+ "ia",
724
+ "ialah",
725
+ "ibarat",
726
+ "ibaratkan",
727
+ "ibaratnya",
728
+ "ibu",
729
+ "ikut",
730
+ "ingat",
731
+ "ingat-ingat",
732
+ "ingin",
733
+ "inginkah",
734
+ "inginkan",
735
+ "ini",
736
+ "inikah",
737
+ "inilah",
738
+ "itu",
739
+ "itukah",
740
+ "itulah",
741
+ "jadi",
742
+ "jadilah",
743
+ "jadinya",
744
+ "jangan",
745
+ "jangankan",
746
+ "janganlah",
747
+ "jauh",
748
+ "jawab",
749
+ "jawaban",
750
+ "jawabnya",
751
+ "jelas",
752
+ "jelaskan",
753
+ "jelaslah",
754
+ "jelasnya",
755
+ "jika",
756
+ "jikalau",
757
+ "juga",
758
+ "jumlah",
759
+ "jumlahnya",
760
+ "justru",
761
+ "kala",
762
+ "kalau",
763
+ "kalaulah",
764
+ "kalaupun",
765
+ "kali",
766
+ "kalian",
767
+ "kami",
768
+ "kamilah",
769
+ "kamu",
770
+ "kamulah",
771
+ "kan",
772
+ "kapan",
773
+ "kapankah",
774
+ "kapanpun",
775
+ "karena",
776
+ "karenanya",
777
+ "ke",
778
+ "keadaan",
779
+ "kebetulan",
780
+ "kecil",
781
+ "kedua",
782
+ "keduanya",
783
+ "keinginan",
784
+ "kelak",
785
+ "kelihatan",
786
+ "kelihatannya",
787
+ "kelima",
788
+ "keluar",
789
+ "kembali",
790
+ "kemudian",
791
+ "kemungkinan",
792
+ "kemungkinannya",
793
+ "kenapa",
794
+ "kepada",
795
+ "kepadanya",
796
+ "kesampaian",
797
+ "keseluruhan",
798
+ "keseluruhannya",
799
+ "keterlaluan",
800
+ "ketika",
801
+ "khususnya",
802
+ "kini",
803
+ "kinilah",
804
+ "kira",
805
+ "kira-kira",
806
+ "kiranya",
807
+ "kita",
808
+ "kitalah",
809
+ "kok",
810
+ "kurang",
811
+ "lagi",
812
+ "lagian",
813
+ "lah",
814
+ "lain",
815
+ "lainnya",
816
+ "lalu",
817
+ "lama",
818
+ "lamanya",
819
+ "lanjut",
820
+ "lanjutnya",
821
+ "lebih",
822
+ "lewat",
823
+ "luar",
824
+ "macam",
825
+ "maka",
826
+ "makanya",
827
+ "makin",
828
+ "malah",
829
+ "malahan",
830
+ "mampu",
831
+ "mampukah",
832
+ "mana",
833
+ "manakala",
834
+ "manalagi",
835
+ "masih",
836
+ "masihkah",
837
+ "masing",
838
+ "masing-masing",
839
+ "mau",
840
+ "maupun",
841
+ "melainkan",
842
+ "melakukan",
843
+ "melalui",
844
+ "melihat",
845
+ "melihatnya",
846
+ "memang",
847
+ "memastikan",
848
+ "memberi",
849
+ "memberikan",
850
+ "membuat",
851
+ "memerlukan",
852
+ "memihak",
853
+ "meminta",
854
+ "memisalkan",
855
+ "memperbuat",
856
+ "mempergunakan",
857
+ "memperkirakan",
858
+ "memperlihatkan",
859
+ "mempersiapkan",
860
+ "mempersoalkan",
861
+ "mempertanyakan",
862
+ "mempunyai",
863
+ "memulai",
864
+ "memungkinkan",
865
+ "memutuskan",
866
+ "menanti",
867
+ "menanti-nanti",
868
+ "menantikan",
869
+ "menunjuk",
870
+ "menunjuknya",
871
+ "menuju",
872
+ "menurut",
873
+ "menurutnya",
874
+ "menurutmu",
875
+ "menurutku",
876
+ "menurutnya",
877
+ "menurut mereka",
878
+ "menyampaikan",
879
+ "menyebut",
880
+ "menyebutkan",
881
+ "menjelaskan",
882
+ "menjadi",
883
+ "menjadikan",
884
+ "menjalani",
885
+ "menjelang",
886
+ "menjawab",
887
+ "menunjukkan",
888
+ "menuangkan",
889
+ "menulis",
890
+ "menyatakan",
891
+ "merupakan",
892
+ "mereka",
893
+ "merekalah",
894
+ "meski",
895
+ "meskipun",
896
+ "mula",
897
+ "mulai",
898
+ "mulailah",
899
+ "mulanya",
900
+ "mungkin",
901
+ "mungkinkah",
902
+ "nah",
903
+ "naik",
904
+ "namun",
905
+ "nanti",
906
+ "nantinya",
907
+ "nyaris",
908
+ "oleh",
909
+ "olehnya",
910
+ "orang",
911
+ "pada",
912
+ "padahal",
913
+ "padanya",
914
+ "pakai",
915
+ "paling",
916
+ "panjang",
917
+ "pantas",
918
+ "para",
919
+ "pasti",
920
+ "pastilah",
921
+ "pagi",
922
+ "per",
923
+ "pernah",
924
+ "persoalan",
925
+ "pertama",
926
+ "pertama-tama",
927
+ "perlu",
928
+ "perlukah",
929
+ "perlulah",
930
+ "pernah",
931
+ "pihak",
932
+ "pihaknya",
933
+ "pukul",
934
+ "pula",
935
+ "pun",
936
+ "punya",
937
+ "rasa",
938
+ "rasanya",
939
+ "rata",
940
+ "rupanya",
941
+ "saat",
942
+ "saatnya",
943
+ "saja",
944
+ "sajalah",
945
+ "salam",
946
+ "saling",
947
+ "sama",
948
+ "sama-sama",
949
+ "sambil",
950
+ "sampai",
951
+ "sampai-sampai",
952
+ "sampaikan",
953
+ "sana",
954
+ "sangat",
955
+ "sangatlah",
956
+ "satu",
957
+ "saya",
958
+ "sayalah",
959
+ "sayang",
960
+ "seperti",
961
+ "seperti-itu",
962
+ "sepura",
963
+ "sebab",
964
+ "sebabnya",
965
+ "sebagai",
966
+ "sebagaimana",
967
+ "sebagainya",
968
+ "sebagian",
969
+ "sebaik",
970
+ "sebaik-baiknya",
971
+ "sebaiknya",
972
+ "sebaliknya",
973
+ "sebanyak",
974
+ "sebegini",
975
+ "sebegitu",
976
+ "sebelum",
977
+ "sebelumnya",
978
+ "sebenarnya",
979
+ "seberapa",
980
+ "sebesar",
981
+ "sebetulnya",
982
+ "sebisanya",
983
+ "sebuah",
984
+ "sebut",
985
+ "sebutkan",
986
+ "sebutnya",
987
+ "secara",
988
+ "secukupnya",
989
+ "sedang",
990
+ "sedangkan",
991
+ "sedikit",
992
+ "sedikitnya",
993
+ "sedemikian",
994
+ "sediakala",
995
+ "sedikit",
996
+ "sedikitnya",
997
+ "segala",
998
+ "segalanya",
999
+ "segera",
1000
+ "seharusnya",
1001
+ "sehingga",
1002
+ "seingat",
1003
+ "sejak",
1004
+ "sejauh",
1005
+ "sejenak",
1006
+ "sejumlah",
1007
+ "sekali",
1008
+ "sekali-kali",
1009
+ "sekalian",
1010
+ "sekaligus",
1011
+ "sekalipun",
1012
+ "sekarang",
1013
+ "sekaranglah",
1014
+ "sekecil",
1015
+ "seketika",
1016
+ "sekiranya",
1017
+ "sekitar",
1018
+ "sekitarnya",
1019
+ "sekurang",
1020
+ "sekurangnya",
1021
+ "sela",
1022
+ "selalu",
1023
+ "selama",
1024
+ "selama-lamanya",
1025
+ "selamanya",
1026
+ "selanjutnya",
1027
+ "seluruh",
1028
+ "seluruhnya",
1029
+ "semacam",
1030
+ "semakin",
1031
+ "semampu",
1032
+ "semampunya",
1033
+ "semasa",
1034
+ "semata",
1035
+ "semata-mata",
1036
+ "semaunya",
1037
+ "sementara",
1038
+ "semisal",
1039
+ "semisalnya",
1040
+ "sempat",
1041
+ "semua",
1042
+ "semuanya",
1043
+ "semula",
1044
+ "sendiri",
1045
+ "sendirinya",
1046
+ "seolah",
1047
+ "seolah-olah",
1048
+ "seorang",
1049
+ "sepanjang",
1050
+ "sepantasnya",
1051
+ "sepantasnyalah",
1052
+ "seperempat",
1053
+ "seperti",
1054
+ "sepertinya",
1055
+ "sepihak",
1056
+ "sepuluh",
1057
+ "seratus",
1058
+ "seribu",
1059
+ "sering",
1060
+ "seringnya",
1061
+ "serta",
1062
+ "serupa",
1063
+ "sesaat",
1064
+ "sesama",
1065
+ "sesampai",
1066
+ "sesampainya",
1067
+ "sesegera",
1068
+ "sesekali",
1069
+ "seseorang",
1070
+ "sesuatu",
1071
+ "sesuatunya",
1072
+ "sesudah",
1073
+ "sesudahnya",
1074
+ "setelah",
1075
+ "setempat",
1076
+ "setengah",
1077
+ "seterusnya",
1078
+ "setiap",
1079
+ "setidaknya",
1080
+ "setinggi",
1081
+ "seusai",
1082
+ "sewaktu",
1083
+ "siap",
1084
+ "siapa",
1085
+ "siapakah",
1086
+ "siapapun",
1087
+ "sini",
1088
+ "sinilah",
1089
+ "situ",
1090
+ "situlah",
1091
+ "suatu",
1092
+ "sudah",
1093
+ "sudahkah",
1094
+ "sudahlah",
1095
+ "supaya",
1096
+ "tadi",
1097
+ "tadinya",
1098
+ "tahu",
1099
+ "tak",
1100
+ "tambah",
1101
+ "tambahnya",
1102
+ "tampak",
1103
+ "tampaknya",
1104
+ "tandas",
1105
+ "tandasnya",
1106
+ "tanpa",
1107
+ "tanya",
1108
+ "tanyakan",
1109
+ "tanyanya",
1110
+ "tapi",
1111
+ "tegas",
1112
+ "tegasnya",
1113
+ "telah",
1114
+ "tempat",
1115
+ "tengah",
1116
+ "tentang",
1117
+ "tentu",
1118
+ "tentulah",
1119
+ "tentunya",
1120
+ "tepat",
1121
+ "terakhir",
1122
+ "terasa",
1123
+ "terbanyak",
1124
+ "terdahulu",
1125
+ "terdapat",
1126
+ "terdiri",
1127
+ "terdiri-dari",
1128
+ "terhadap",
1129
+ "terhadapnya",
1130
+ "teringat",
1131
+ "teringat-ingat",
1132
+ "terjadi",
1133
+ "terjadilah",
1134
+ "terjadinya",
1135
+ "terkira",
1136
+ "terlalu",
1137
+ "terlebih",
1138
+ "terlihat",
1139
+ "termasuk",
1140
+ "ternyata",
1141
+ "tersampaikan",
1142
+ "tersebut",
1143
+ "tersebutlah",
1144
+ "tertentu",
1145
+ "tertuju",
1146
+ "terus",
1147
+ "terutama",
1148
+ "tetap",
1149
+ "tetapi",
1150
+ "tiap",
1151
+ "tiba",
1152
+ "tiba-tiba",
1153
+ "tidak",
1154
+ "tidakkah",
1155
+ "tidaklah",
1156
+ "tiga",
1157
+ "tadi",
1158
+ "tadinya",
1159
+ "tinggi",
1160
+ "toh",
1161
+ "tuju",
1162
+ "tunjuk",
1163
+ "turut",
1164
+ "tutur",
1165
+ "tuturnya",
1166
+ "ucap",
1167
+ "ucapnya",
1168
+ "ujar",
1169
+ "ujarnya",
1170
+ "umumnya",
1171
+ "ungkap",
1172
+ "ungkapnya",
1173
+ "untuk",
1174
+ "untaian",
1175
+ "usai",
1176
+ "usah",
1177
+ "waduh",
1178
+ "wah",
1179
+ "wahai",
1180
+ "walau",
1181
+ "walaupun",
1182
+ "wong",
1183
+ "yaitu",
1184
+ "yakin",
1185
+ "yakni",
1186
+ "yang"
1187
+ ];
453
1188
 
454
1189
  // src/text/capitalization.ts
455
1190
  function capitalize(text) {
@@ -787,6 +1522,78 @@ function contractAbbreviation(text, options) {
787
1522
  return result;
788
1523
  }
789
1524
 
1525
+ // src/text/filter.ts
1526
+ function profanityFilter(text, mask = "*") {
1527
+ let filtered = text;
1528
+ PROFANITY.forEach((word) => {
1529
+ const regex = new RegExp(`\\b${word}\\b`, "gi");
1530
+ filtered = filtered.replace(regex, mask.repeat(word.length));
1531
+ });
1532
+ return filtered;
1533
+ }
1534
+ function removeStopwords(text) {
1535
+ const words = text.split(/\s+/);
1536
+ const filtered = words.filter(
1537
+ (word) => !STOPWORDS.includes(word.toLowerCase())
1538
+ );
1539
+ return filtered.join(" ");
1540
+ }
1541
+
1542
+ // src/text/normalization.ts
1543
+ var INFORMAL_MAP = {
1544
+ gw: "saya",
1545
+ gua: "saya",
1546
+ lu: "kamu",
1547
+ lo: "kamu",
1548
+ elo: "kamu",
1549
+ lagi: "sedang",
1550
+ gue: "saya",
1551
+ gwe: "saya",
1552
+ gak: "tidak",
1553
+ ga: "tidak",
1554
+ nggak: "tidak",
1555
+ kalo: "kalau",
1556
+ karna: "karena",
1557
+ tapi: "tetapi",
1558
+ udah: "sudah",
1559
+ dah: "sudah",
1560
+ aja: "saja",
1561
+ banget: "sekali",
1562
+ emang: "memang",
1563
+ pake: "pakai",
1564
+ bikin: "membuat",
1565
+ kasih: "memberi",
1566
+ dapet: "dapat",
1567
+ liat: "lihat",
1568
+ ngasih: "memberi",
1569
+ nyari: "mencari",
1570
+ nanya: "bertanya",
1571
+ bilang: "berkata"
1572
+ };
1573
+ function toFormal(text) {
1574
+ const words = text.split(/\s+/);
1575
+ const formalized = words.map((word) => {
1576
+ const lower = word.toLowerCase().replace(/[^\w]/g, "");
1577
+ const formal = INFORMAL_MAP[lower];
1578
+ if (formal) {
1579
+ if (word[0] === word[0].toUpperCase()) {
1580
+ return formal.charAt(0).toUpperCase() + formal.slice(1);
1581
+ }
1582
+ return formal;
1583
+ }
1584
+ return word;
1585
+ });
1586
+ return formalized.join(" ");
1587
+ }
1588
+ function isAlay(text) {
1589
+ if (!text) return false;
1590
+ const alternatingCaps = /([a-z][A-Z][a-z]|[A-Z][a-z][A-Z])/.test(text);
1591
+ const numberSub = /\b\w*[0431572]\w*\b/.test(text);
1592
+ const qSub = /q/i.test(text) && !/u/i.test(text);
1593
+ const excessiveChars = /(.)\1{2,}/.test(text);
1594
+ return alternatingCaps || numberSub || qSub || excessiveChars;
1595
+ }
1596
+
790
1597
  // src/text/extract.ts
791
1598
  function truncate(text, maxLength, options) {
792
1599
  if (!text || maxLength <= 0) {
@@ -903,11 +1710,15 @@ exports.compareStrings = compareStrings;
903
1710
  exports.contractAbbreviation = contractAbbreviation;
904
1711
  exports.expandAbbreviation = expandAbbreviation;
905
1712
  exports.extractWords = extractWords;
1713
+ exports.isAlay = isAlay;
906
1714
  exports.normalizeWhitespace = normalizeWhitespace;
1715
+ exports.profanityFilter = profanityFilter;
907
1716
  exports.removeAccents = removeAccents;
1717
+ exports.removeStopwords = removeStopwords;
908
1718
  exports.sanitize = sanitize;
909
1719
  exports.similarity = similarity;
910
1720
  exports.slugify = slugify;
1721
+ exports.toFormal = toFormal;
911
1722
  exports.toSentenceCase = toSentenceCase;
912
1723
  exports.toTitleCase = toTitleCase;
913
1724
  exports.truncate = truncate;