Discourse Rake Posts Snippets dari BBCode ke Markdown

Sudah 1 tahun lebih sedikit sejak migrasi devilzc0de dari MyBB ke Discourse. Banyak yang perlu dirapikan, salah satunya melakukan replace tags dari BBCode ke Markdown di setiap topik dan reply. Di artikel ini tersedia beberapa snippet yang mungkin berguna bagi sysadmin CMS Discourse yang migrasi dari board yang berbasis BBcode.

Sebelum memulai, kamu perlu untuk:

  • Backup forum kamu sebelum melakukan aksi apapun di bawah ini karena kemungkinan rusaknya konten setiap topik dan reply pasti ada. :ngakak:
  • Siapkan waktu dan resource server, terutama jika jumlah topik dan reply forum banyak.
  • Tau bahwa Discourse menggunakan database PostgreSQL dimana ia menggunakan POSIX regex untuk regex dan itu case-sensitive.
  • Tau bahwa kamu bisa pake BBCode plugin untuk Discourse seperti discourse-bbcode tanpa harus melakukan step-step di bawah ini. :hammer:

Klo kamu udah tau resikonya (karena kamu sebenarnya punya pilihan lain) dan masih pingin lanjut tanpa menggunakan plugin tambahan seperti aku, silahkan dilanjutkan. :metal: Langkah awal adalah masuk ke app Discourse dengan mengeksekusi ./launcher enter app dari Discourse root direktori.

Hapus Tag Color, Size, Align, dan Font

Color, size, font dan align tag di BBCode punya banyak variasi di setiap posting, misalnya [color=#ff3333] atau [color=red], [font=‘Open Sans’, sans-serif], [align=center], dll. Perintah rake posts dibawah ini akan menghapus setiap tag BBCode color, size, font, dan align.

BBCode Color Tag

rake posts:delete_word['\\[color.*?\\]|\\[\\/color\\]',regex]

BBCode Size Tag

rake posts:delete_word['\\[size.*?\\]|\\[\\/size\\]',regex]

BBCode Align Tag

rake posts:delete_word['\\[align.*?\\]|\\[\\/align\\]',regex]

BBCode Font Tag

rake posts:delete_word['\\[font.*?\\]|\\[\\/font\\]',regex]

Gabungan antara semua tag diatas

rake posts:delete_word['\\[color.*?\\]|\\[\\/color\\]|\\[size.*?\\]|\\[\\/size\\]|\\[align.*?\\]|\\[\\/align\\]|\\[font.*?\\]|\\[\\/font\\]',regex]

Note: regex nya case-sensitive ya, jadi tag dengan uppercase ga akan ke eksekusi. Kamu perlu cek lagi hasil rake diatas. :grin:

Replace String atau Kata Menggunakan Remap

Kamu bisa mengunakan perintah rake post:remap untuk melakukan string replacement yang sederhana. Misalnya, posting topik awal2 devilzc0de menggunakan MyBB ada di tahun 2010 dimana saat itu jarang kita temui situs yang menggunakan https. Tapi sekarang, https sudah dimana-mana dan browser tidak mau menampilkan gambar atau mengeksekusi script dengan mixed content. Jadi, untuk mereplace dari http:// ke https:// untuk setiap posting :

rake posts:remap["http://","https://"]

:bulb: Perintah remap diatas juga bisa digunakan untuk melakukan replace tagging dan emoji.

Note: Kamu mungkin perlu naikin jumlah sidekiq workers dengan mengupdate Discourse app.yml UNICORN_SIDEKIQS env untuk mempercepat queue sidekiq untuk fetch onebox dan gambar dari situs external setelah melakukan remap konten posting dari http ke https.

Sayangnya, rake remap tidak bekerja dengan baik untuk tag seperti [code] , [spoiler] , [php] , dan [qoute]. Berikut contoh studi kasusnya :

Di forum lama yang menggunakan MyBB, user yang menggunakan tag [code] dan langsung diikuti kode yang sebenarnya tanpa harus berada di baris baru akan bekerja. Tapi di markdown, blok code hanya bererja jika kamu memberikan new line dan meletakkan kode yang sebenarnya setelah new line tersebut.
Untuk lebih jelas, liat kasus berikut:

[code]var promise = new Promise(function(resolve, reject) {
  // do a thing, possibly async, then…

  if (/* everything is fine */) {
    resolve("Worked!");
  }
  else {
    reject(Error("Didn't work"));
  }
});
[/code]

Tag [code] diatas akan bekerja di MyBB dan menghasilkan output:

var promise = new Promise(function(resolve, reject) {
  // do a thing, possibly async, then…

  if (/* everything is fine */) {
    resolve("Worked!");
  }
  else {
    reject(Error("Didn't work"));
  }
});

Tapi di Discourse yang menggunakan Markdown, jika kita hanya melakukan replace tag [code] dengan ``` akan menghasilkan :

```var promise = new Promise(function(resolve, reject) {
  // do a thing, possibly async, then…

  if (/* everything is fine */) {
    resolve("Worked!");
  }
  else {
    reject(Error("Didn't work"));
  }
});
```

Kode diatas tidak akan diformat sebagai markup blok kode . Kita perlu menambahkan new line setelah pembukaan ```. Sayangnya jika menggunakan rake posts:remap["[code]","````\n"] tidak dapat bekerja karena “\n” diproses sebagai plain text. Satu-satunya solusi yang bekerja hanya melakukan update langsung dari database PostgreSQL.

PostgreSQL Raw Update

Kamu perlu masuk sebagai user PostgreSQL di container Discourse untuk menjalankan setiap query dibawah. Klo ga tau caranya masuk sebagai user postgres di container DIscourse, jalankan su -c 'psql discourse' postgres setelah perintah ./launcher enter app.

Note: Kamu perlu melakukan rebake post setelah melakukan update konten di database postgre. Untuk menghindari rebake semua posting, kamu bisa gunakan rebake_match . Contohnya rebake_match nanti ada di bawah.

Replace [spoiler] tag dengan [details] tag

UPDATE posts set raw=replace(raw, '[spoiler]', '[details=Spoiler]'||chr(10)) where raw like '%[spoiler]%';
UPDATE posts set raw=replace(raw, '[spoiler=', '[details=') where raw like '%[spoiler=%';
UPDATE posts set raw=replace(raw, '[/spoiler]', chr(10)||'[/details]') where raw like '%[/spoiler]%';

Setelah melakukan update database, keluar dari user posrgres dan jalankan rebake post.

rake posts:rebake_match["\[details"]

Replace MyBB tag [php] dengan Markdown PHP syntax highlight

UPDATE posts set raw=replace(raw, '[php]', '```php'||chr(10)) where raw like '%[php]%';
UPDATE posts set raw=replace(raw, '[/php]', chr(10)||'```') where raw like '%[/php]%';

Setelah melakukan update database, keluar dari user posrgres dan jalankan rebake post.

rake posts:rebake_match["\`\`\`php"]

Replace tag [code] dengan Markdown blok code

UPDATE posts set raw=replace(raw, '[code]', '```'||chr(10)) where raw like '%[code]%';
UPDATE posts set raw=replace(raw, '[/code]', chr(10)||'```') where raw like '%[/code]%';

Setelah melakukan update database, keluar dari user posrgres dan jalankan rebake post.

rake posts:rebake_match["\`\`\`"]

To Do’s

  • Replace tag BBCode [ul], [ol] dan [li] ke Markdown list tag
  • Replace tag BBCode ke Markdown quote tag

Kalau kamu berhasil melakukan mass replace kedua list di atas, boleh dong share disini :smangat:

Credits:

2 Likes

mantab anyeng ude mulai oke lagi kaga berantakan kayak TPU :hammer:

burakakakkaka… :ngakak: kek desktop gue berantakan.

klo bisa pake font color bukannya lebih menarik dan ga monoton om dit?

share dong tutor install software forum ini om. :smile:

ALAY :adukepala: pake color segalak

kwkwkwkw… Maklum blom sempet bril.

Ntar klo ada user yg pake light theme dan warnanya kontras sama dark theme jd ga keliatan om. :grin:

Gampang kok om installnya.


:ngacir:

Om, saran, klo link di forum lama misal yg di posting konsep bot comment itu ga bisa di benerin yah? pan harusnya bisa tuh di replace krn ada thread IDnya [OLD_DC_DOMAIN_ORG]/forum/thread-19033.html :bingung:

Bisa, tapi semi otomatis :gun: om soalnya post id forum lama (MyBB) sama forum baru yg skrg beda. Jd harus cari arsip di forum lama 1 per 1, ambil judul topik di forum lama, cari id dari judul topik dari forum lama di forum baru, baru bisa bulk update (itu pun cuma buat 1 link itu aja).

Emang beberapa udah gue replace, cuman linknya kan banyak banget. :ngakak:
Klo sekiranya ada post link forum lama yang mau di replace, bisa by request dulu, ntar pasti gue gantiin.

Owh begenyong… :lemes:
Klo gitu ane rekues link tadi dulu aja :asik:

Ga support di cpanel ya?

cPanel kan shared hosting, ini butuh root kynya. Ga mungkin pemilik hosting serahin rootnya. :smiley:

1 Like

vuset serem bet