mirror of
https://github.com/ditatompel/insights.git
synced 2025-01-08 03:12:06 +07:00
189 lines
6.9 KiB
Markdown
189 lines
6.9 KiB
Markdown
|
---
|
|||
|
title: "Discourse Rake Posts Snippets from BBCode to Markdown"
|
|||
|
description: "After migrated devilzc0de from MyBB to Discourse, many things needs to be done. One of them is to rake and rebake the BBCode tags posts to Markdown."
|
|||
|
date: 2020-06-14T12:55:12+07:00
|
|||
|
lastmod:
|
|||
|
draft: false
|
|||
|
noindex: false
|
|||
|
featured: false
|
|||
|
pinned: false
|
|||
|
# comments: false
|
|||
|
series:
|
|||
|
# -
|
|||
|
categories:
|
|||
|
- SysAdmin
|
|||
|
tags:
|
|||
|
- Discourse
|
|||
|
- Devilzc0de
|
|||
|
- Ruby
|
|||
|
- MyBB
|
|||
|
- PostgreSQL
|
|||
|
images:
|
|||
|
# -
|
|||
|
# menu:
|
|||
|
# main:
|
|||
|
# weight: 100
|
|||
|
# params:
|
|||
|
# icon:
|
|||
|
# vendor: bs
|
|||
|
# name: book
|
|||
|
# color: '#e24d0e'
|
|||
|
authors:
|
|||
|
- ditatompel
|
|||
|
---
|
|||
|
|
|||
|
It's been more than 1 year since I [migrated devilzc0de from MyBB to Discourse]({{< ref "/blog/story-behind-the-all-new-devilzc0de-migration-process/index.md" >}}) and many things needs to be done after the migration process is complete. One of them is to `rake` (and `rebake`, if needed) the **BBCode** tags to **Markdown** for each posts.
|
|||
|
|
|||
|
<!--more-->
|
|||
|
|
|||
|
Before you start you need to:
|
|||
|
- Backup your forum before perform any actions because you may break every single posts content and PMs.
|
|||
|
- Prepare your time and resource, especially if your forum had lots of posts.
|
|||
|
- Know that Discourse use PostgreSQL database which use [POSIX regex](https://www.postgresql.org/docs/9.3/functions-matching.html#FUNCTIONS-POSIX-REGEXP) to perform regex matching and it will be case-sensitive.
|
|||
|
- Know that you can use BBCode plugin for Discourse like [discourse-bbcode](https://meta.discourse.org/t/discourse-bbcode/65425) without perform any of these actions.
|
|||
|
|
|||
|
If you understand the risks (and you have another option) and still want to continue without additional plugins like I do, then go ahead. You need to enter your Discourse app by executing `./launcher enter app` from your root Discourse directory.
|
|||
|
|
|||
|
## Remove Color, Size, Align, and Font Tags
|
|||
|
Color, size, font and align tags may different in each post, like `[color=#ff3333]` or `[color=red]`, `[font=‘Open Sans’, sans-serif]`, `[align=center]`, etc. These rake post command will remove any general BBCode color, size, font, and align tags.
|
|||
|
|
|||
|
![Discourse Rake](dc-rake.png#center)
|
|||
|
|
|||
|
![Discourse Replace BBCode to Markdown](feature-dc-rake-01.png#center)
|
|||
|
|
|||
|
### BBCode Color Tags
|
|||
|
```ruby
|
|||
|
rake posts:delete_word['\\[color.*?\\]|\\[\\/color\\]',regex]
|
|||
|
```
|
|||
|
|
|||
|
### BBCode Size Tags
|
|||
|
```ruby
|
|||
|
rake posts:delete_word['\\[size.*?\\]|\\[\\/size\\]',regex]
|
|||
|
```
|
|||
|
### BBCode Align Tags
|
|||
|
```ruby
|
|||
|
rake posts:delete_word['\\[align.*?\\]|\\[\\/align\\]',regex]
|
|||
|
```
|
|||
|
|
|||
|
### BBCode Font Tags
|
|||
|
```ruby
|
|||
|
rake posts:delete_word['\\[font.*?\\]|\\[\\/font\\]',regex]
|
|||
|
```
|
|||
|
|
|||
|
### All of Them Together
|
|||
|
```ruby
|
|||
|
rake posts:delete_word['\\[color.*?\\]|\\[\\/color\\]|\\[size.*?\\]|\\[\\/size\\]|\\[align.*?\\]|\\[\\/align\\]|\\[font.*?\\]|\\[\\/font\\]',regex]
|
|||
|
```
|
|||
|
|
|||
|
> _**Note**: The regex is **case-sensitive**, tags with **uppercase** will not be removed. You need to check posts again by your self._
|
|||
|
|
|||
|
## Replace String or Words (Remap)
|
|||
|
You can use `rake post:remap` to perform simple replacement. For example, oldest devilzc0de forum post is from 2010 where at that time, we rarely found sites using https.
|
|||
|
|
|||
|
But now, https is everywhere and browser won't display mixed content. So, to replace `http://` to `https://` for each posts :
|
|||
|
```ruby
|
|||
|
rake posts:remap["http://","https://"]
|
|||
|
```
|
|||
|
|
|||
|
This works for tagging user tags and emoji too.
|
|||
|
|
|||
|
> _**Note**: You may increase `sidekiq` workers by updating Discourse `app.yml` `UNICORN_SIDEKIQS` **env** to spin up sidekiq queue for onebox and remote image fetch after remapping http to https._
|
|||
|
|
|||
|
Unfortunately, rake remap doesn't work for `[code]`, `[spoiler]`, `[php]`, and `[qoute]` tags. Here is the example :
|
|||
|
|
|||
|
In old MyBB forum, user using `[code]` block following with the actual codes without new line will work. But, markdown code tags works if you use new line after <code>```</code> block.
|
|||
|
|
|||
|
```plain
|
|||
|
[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]
|
|||
|
```
|
|||
|
|
|||
|
`[code]` tags above will work on **MyBB** and produce:
|
|||
|
|
|||
|
```javascript
|
|||
|
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"));
|
|||
|
}
|
|||
|
});
|
|||
|
```
|
|||
|
|
|||
|
But on Discourse which use **Markdown**, if I replace `[code]` tags with <code>```</code> will produce :
|
|||
|
<pre>```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"));
|
|||
|
}
|
|||
|
});
|
|||
|
```
|
|||
|
</pre>
|
|||
|
|
|||
|
Code above **will not recognised as code block**. We need to add **new line** after first opening <code>\```</code> block. Unfortunately (at least for me), using <code>rake posts:remap["[code]","```\n"]</code> doesn't work and only produce the **"\n"** as plain text. The only working solution for me is **directly update raw PG database**.
|
|||
|
|
|||
|
## PostgreSQL Raw Update
|
|||
|
You need to enter **PostgreSQL** on your Discourse app to run all PG query below. If you don't know how to do it, run `su -c 'psql discourse' postgres` after `./launcher enter app` command.
|
|||
|
|
|||
|
> _**Note**: You need to `rebake` your post after update PostgreSQL post DB. To avoid rebake all your posts, you can use `rebake_match`. See example below._
|
|||
|
|
|||
|
### Replace Spoiler Tags With Details Tags
|
|||
|
```sql
|
|||
|
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]%';
|
|||
|
```
|
|||
|
|
|||
|
After updating database, exit from postgres user and run rebake post.
|
|||
|
```ruby
|
|||
|
rake posts:rebake_match["\[details"]
|
|||
|
```
|
|||
|
|
|||
|
### Replace MyBB [php] Tags With Markdown PHP Syntax Highlight
|
|||
|
```sql
|
|||
|
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]%';
|
|||
|
```
|
|||
|
|
|||
|
After updating database, exit from postgres user and run rebake post.
|
|||
|
|
|||
|
```ruby
|
|||
|
rake posts:rebake_match["\`\`\`php"]
|
|||
|
```
|
|||
|
|
|||
|
### Replace [code] tags With Markdown Tags
|
|||
|
```sql
|
|||
|
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]%';
|
|||
|
```
|
|||
|
|
|||
|
After updating database, exit from postgres user and run rebake post.
|
|||
|
|
|||
|
```ruby
|
|||
|
rake posts:rebake_match["\`\`\`"]
|
|||
|
```
|
|||
|
|
|||
|
## ToDo's
|
|||
|
- `[ul]`, `[ol]` and `[li]` tags replace to Markdown list tags
|
|||
|
- `[quote]` Tags to Markdown quote tags
|
|||
|
|
|||
|
Please share if you have done mass replace for those two to do lists above.
|
|||
|
|
|||
|
## Credits
|
|||
|
- [Cameron:D](https://meta.discourse.org/t/replace-a-string-in-all-posts/48729/70?u=ditatompel) and [Coin-coin le Canapin](https://meta.discourse.org/t/replace-a-string-in-all-posts/48729/72?u=ditatompel) post.
|