Entity Parser (entity-parser
)
Mengubah Telegram entities menjadi semantic HTML.
Kapan Plugin Ini Diperlukan?
Kemungkinan besar kamu TIDAK AKAN PERNAH membutuhkannya sama sekali!
Meski plugin ini mampu menghasilkan HTML, namun, pada umumnya, mengirim teks beserta entity-nya kembali ke Telegram jauh lebih baik.
Pengonversian ke HTML hanya dibutuhkan untuk kondisi khusus ketika kamu perlu menggunakan teks pemformatan Telegram di luar ekosistem Telegram itu sendiri, misalnya menampilkan pesan Telegram di suatu website.
Silahkan lihat bagian Contoh-Contoh Kasus yang Sebaiknya Tidak Menggunakan Plugin Ini untuk menemukan solusi yang lebih baik ketika kamu memiliki permasalahan yang serupa.
Jika kamu masih ragu apakah plugin ini sesuai, jangan ragun untuk bertanya di grup Telegram kami. Dalam kebanyakan kasus, sebagian besar orang sebenarnya tidak terlalu memerlukan plugin untuk menyelesaikan permasalahan mereka!
Penginstalan
Jalankan perintah berikut di terminal. Sesuaikan dengan runtime atau package manager yang kamu gunakan:
deno add jsr:@qz/telegram-entities-parser
bunx jsr add @qz/telegram-entities-parser
pnpm dlx jsr add @qz/telegram-entities-parser
yarn dlx jsr add @qz/telegram-entities-parser
npx jsr add @qz/telegram-entities-parser
Penggunaan Sederhana
Menggunakan plugin ini cukup simpel. Berikut contohnya:
import { EntitiesParser } from "@qz/telegram-entities-parser";
import type { Message } from "@qz/telegram-entities-parser/types";
// Agar tidak mempengaruhi performa, buat instansiasi di luar function terkait.
const entitiesParser = new EntitiesParser();
const parse = (message: Message) => entitiesParser.parse({ message });
bot.on(":text", (ctx) => {
const html = parse(ctx.msg); // Konversi teks menjadi string HTML
});
bot.on(":photo", (ctx) => {
const html = parse(ctx.msg); // Konversi caption menjadi string HTML
});
2
3
4
5
6
7
8
9
10
11
12
13
14
Penggunaan Tingkat Lanjut
Menyesuaikan Keluaran Tag HTML
Plugin ini mengonversi entity menjadi semantic HTML sesuai dengan standar dan praktik terbaik sebisa mungkin. Namun, keluaran yang dihasilkan mungkin tidak sesuai dengan harapan kamu.
Untuk mengatasinya, kamu bisa menggunakan renderer
-mu sendiri untuk menyesuaikan element HTML yang membungkus teks terkait sesuai dengan aturan yang telah diterapkan. Kamu bisa memodifikasi aturan tertentu dengan cara meng-extend Renderer
bawaan ataupun menimpa semua aturan dengan cara mengimplementasikan Renderer
.
Untuk meng-extend renderer
yang sudah ada, lakukan hal berikut:
import { EntitiesParser, RendererHtml } from "@qz/telegram-entities-parser";
import type {
CommonEntity,
RendererOutput,
} from "@qz/telegram-entities-parser/types";
// Gunakan aturan yang diterapkan oleh `RendererHtml`,
// tetapi khusus untuk entity bold, gunakan aturan berikut:
class MyRenderer extends RendererHtml {
override bold(
options: { text: string; entity: CommonEntity },
): RendererOutput {
return {
prefix: '<strong class="tg-bold">',
suffix: "</strong>",
};
}
}
const entitiesParser = new EntitiesParser({ renderer: new MyRenderer() });
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Parameter options
menerima sebuah object berupa text
dan entity
.
text
: Porsi teks yang direferensikan oleh entity terkait.entity
: Paramater ini memiliki beragam interface sesuai dengan tipe entity-nya, entah ituCommon
,Entity Custom
,Emoji Entity Pre
,Entity Text
, ataupunLink Entity Text
. Contohnya, tipeMention Entity bold
memiliki entity dengan interfaceCommon
, sementara tipeEntity text
interface-nya berupa_link Text
karena mengandung property tambahan sepertiLink Entity url
.
Berikut daftar lengkap interface beserta keluaran untuk masing-masing tipe entity:
Tipe Entity | Interface | Keluaran |
---|---|---|
blockquote | Common | <blockquote class |
bold | Common | <b class |
bot | Common | <span class |
cashtag | Common | <span class |
code | Common | <code class |
custom | Custom | <span class |
email | Common | <a class |
expandable | Common | <blockquote class |
hashtag | Common | <span class |
italic | Common | <i class |
mention | Common | <a class |
phone | Common | <a class |
pre | Pre | <pre class atau <pre class |
spoiler | Common | <span class |
strikethrough | Common | <del class |
text | Text | <a class |
text | Text | <a class atau <a class |
underline | Common | <span class |
url | Common | <a class |
Jika kamu ragu interface mana yang benar, silahkan lihat pengimplentasian Renderer dan Renderer
Menyesuaikan Pembersih Teks (Text Sanitizer)
Secara bawaan, keluaran teks dibersihkan agar HTML bisa di-render dengan baik dan menghindari kerentanan XSS.
Masukan | Keluaran |
---|---|
& | & |
< | & |
> | & |
" | & |
' | & |
Sebagai contoh, hasil keluaran <b>Tebal<
akan dibersihkan menjadi <b>Tebal<
.
Kamu bisa mengubah perilaku tersebut dengan cara menentukan text
ketika menginisiasi Entities
:
- Jika
text
tidak ditentukan, ia secara bawaan akan menggunakanSanitizer sanitizer
sebagai pembersihnya.Html - Jika nilai
false
diberikan, pembersihan tidak akan dilakukan, sehingga keluaran teks yang dihasilkan apa adanya. Langkah ini tidak disarankan karena dapat menyebabkan kesalahan pe-render-an dan membuat aplikasimu rentan terhadap serangan XSS. Pastikan penanganan dilakukan dengan baik jika kamu memilih opsi ini. - Jika sebuah function diberikan, function tersebut akan digunakan sebagai pembersih bawaannya.
const myTextSanitizer: TextSanitizer = (options: TextSanitizerOption): string =>
// Ganti karakter-karakter yang berbahaya
options.text.replaceAll(/[&<>"']/, (match) => {
switch (match) {
case "&":
return "&";
case "<":
return "<";
case ">":
return ">";
case '"':
return """;
case "'":
return "'";
default:
return match;
}
});
// Terapkan pembersihnya (sanitizer).
const entitiesParser = new EntitiesParser({ textSanitizer: myTextSanitizer });
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Contoh-Contoh Kasus yang Sebaiknya Tidak Menggunakan Plugin Ini
Jika menghadapi permasalahan serupa dengan berikut, kamu kemungkinan besar bisa menyelesaikannya tanpa menggunakan plugin ini.
Menyalin dan Meneruskan Pesan yang Sama
Gunakan forward
untuk meneruskan pesan apapun.
Kamu juga bisa menggunakan API copy
untuk melakukan aksi yang serupa tanpa menyertakan link ke pesan aslinya. copy
memiliki perilaku layaknya menyalin lalu mengirim ulang pesan tersebut ke Telegram, sehingga wujudnya berupa pesan biasa alih-alih pesan terusan.
bot.on(":text", async (ctx) => {
// Id chat tujuan.
const chatId = -946659600;
// Teruskan pesan berikut tanpa menyertakan link ke pesan aslinya.
await ctx.copyMessage(chatId);
// Teruskan pesan berikut dengan menyertakan link ke pesan aslinya.
await ctx.forwardMessage(chatId);
});
2
3
4
5
6
7
8
Membalas Pesan Menggunakan Format Teks yang Telah Dimodifikasi
Kamu juga bisa dengan mudah membalas pesan yang datang menggunakan HTML, Markdown, atau entity.
bot.on(":text", async (ctx) => {
// Balas dengan HTML
await ctx.reply("<b>tebal</b> <i>miring</i>", { parse_mode: "HTML" });
// Balas dengan Telegram Markdown V2
await ctx.reply("*tebal* _miring_", { parse_mode: "MarkdownV2" });
// Balas dengan entity
await ctx.reply("tebal miring", {
entities: [
{ offset: 0, length: 5, type: "bold" },
{ offset: 6, length: 6, type: "italic" },
],
});
});
2
3
4
5
6
7
8
9
10
11
12
13
Gunakan parse-mode untuk Pengalaman Pemformatan yang Lebih Baik
Gunakan plugin resmi parse
untuk memformat pesan dengan cara yang lebih elegan.