Go to main content

Textpattern CMS support forum

You are not logged in. Register | Login | Help

#1 2021-05-10 08:18:09

demoncleaner
Plugin Author
From: Germany
Registered: 2008-06-29
Posts: 225
Website

dem_clone: Duplicating articles with a reference to their origin

Without the adi_menu plugin installed

It does just that. When cloning, it stores the ID of the original article in the custom-field of your choice (default custom-1) of the new article.

With adi_menu installed

it is a little helper plugin for a multi-language setup (see how it should be set up here – site is down: download archive of that page as a PDF file)
The plugin copies an article with a reference to the original article.
A chosen custom-field is used to hold the ID of the original article. Which should be in your default language.
The relation between articles in their different languages can then be detected through this custom-field.

Furthermore it puts the newly cloned article straight in its correct section.
It also marks articles red that are in a non-default language section and hides all non-default sections in the sections dropdown (toggleable).

Download dem_clone v0.2.

EDIT: code pasted here as the original site is down. (jakob)

# Name: dem_clone v0.2 
# Type: Admin plugin
# Clones articles with a reference to the original article. Helpful on multi-lingual setups of textpattern.
# Author: Christian Rapp
# URL: https://www.rappid.de/
# Recommended load order: 5

# .....................................................................
# This is a plugin for Textpattern CMS - http://textpattern.com/
# To install: textpattern > admin > plugins
# Paste the following text into the 'Install plugin' box:
# .....................................................................

YToxNjp7czo0OiJuYW1lIjtzOjk6ImRlbV9jbG9uZSI7czo3OiJ2ZXJzaW9uIjtzOjM6IjAu
MiI7czo4OiJyZXZpc2lvbiI7czowOiIiO3M6NjoiYXV0aG9yIjtzOjE0OiJDaHJpc3RpYW4g
UmFwcCI7czoxMDoiYXV0aG9yX3VyaSI7czoyMjoiaHR0cHM6Ly93d3cucmFwcGlkLmRlLyI7
czoxMToiZGVzY3JpcHRpb24iO3M6MTA1OiJDbG9uZXMgYXJ0aWNsZXMgd2l0aCBhIHJlZmVy
ZW5jZSB0byB0aGUgb3JpZ2luYWwgYXJ0aWNsZS4gSGVscGZ1bCBvbiBtdWx0aS1saW5ndWFs
IHNldHVwcyBvZiB0ZXh0cGF0dGVybi4iO3M6NToib3JkZXIiO3M6MToiNSI7czo0OiJ0eXBl
IjtzOjE6IjMiO3M6NToiZmxhZ3MiO2k6MztzOjg6InRleHRwYWNrIjtzOjIyMToiI0BkZW1f
Y2xvbmUKZGVtX2Nsb25lX2FsZXJ0ID0+IEZyZW1kc3ByYWNoaWdlciBBcnRpa2VsCmRlbV9j
bG9uZV9oaWRlX3NlY3Rpb25zID0+IFZlcnN0ZWNrZSBTcHJhY2gtU2VrdGlvbmVuCmRlbV9j
bG9uZV9zaG93X3NlY3Rpb25zID0+IFplaWdlIGFsbGUgU2VrdGlvbmVuCmRlbV9jbG9uZV9z
aW1wbGUgPT4gS2xvbmVuCmRlbV9jbG9uZV9zdHJpbmcgPT4gSW4gU2VjdGlvbiBrbG9uZW4i
O3M6MTU6ImFsbG93X2h0bWxfaGVscCI7czoxOiIwIjtzOjEwOiJsb2FkX29yZGVyIjtzOjE6
IjUiO3M6NDoiaGVscCI7czoxMTkzOiI8aDE+Q2xvbmluZyBhcnRpY2xlcyB3aXRoIGEgcmVm
ZXJlbmNlIHRvIHRoZWlyIG9yaWdpbnMuPC9oMT4KCjxoMj5XaXRob3V0IGFkaV9tZW51IGlu
c3RhbGxlZDwvaDI+Cgo8cD5JdCBqdXN0IGRvZXMgdGhhdC48YnIgLz4KV2hlbiBjbG9uaW5n
LCBpdCBzdG9yZXMgdGhlIElEIG9mIHRoZSBvcmlnaW5hbCBhcnRpY2xlIGluIGN1c3RvbV9m
aWVsZCAjMSBvZiB0aGUgbmV3IGFydGljbGUuPC9wPgoKPGgyPldpdGggYWRpX21lbnUgaW5z
dGFsbGVkPC9oMj4KCjxwPkl0IGNsb25lcyBhcnRpY2xlcyB3aXRoIGEgcmVmZXJlbmNlIHRv
IHRoZSBzaXN0ZXIgYXJ0aWNsZSBvZiB0aGUgZGVmYXVsdCBsYW5ndWFnZS48YnIgLz4KVGhl
IGN1c3RvbV9maWVsZCAjMSBpcyB1c2VkIHRvIGhvbGQgdGhlIElEIG9mIHRoZSBvcmlnaW5h
bCBzaXN0ZXIgYXJ0aWNsZS48YnIgLz4KVGhlIHJlbGF0aW9uIGJldHdlZW4gYXJ0aWNsZXMg
aW4gdGhlaXIgZGlmZmVyZW50IGxhbmd1YWdlcyBjYW4gdGhlbiBiZSBkZXRlY3RlZCB0aHJv
dWdoIGN1c3RvbS0xLjwvcD4KCjxwPkZ1cnRoZXJtb3JlIGl0IHB1dHMgdGhlIG5ld2x5IGNs
b25lZCBhcnRpY2xlIGFscmVhZHkgaW4gaXRzIGNvcnJlY3Qgc2VjdGlvbi48YnIgLz4KSXQg
YWxzbyBtYXJrcyBhcnRpY2xlcyByZWQgdGhhdCBhcmUgaW4gYSBub24tZGVmYXVsdCBsYW5n
dWFnZSBzZWN0aW9uIGFuZCBoaWRlcyBhbGwgbm9uLWRlZmF1bHQgc2VjdGlvbnMgaW4gdGhl
IHNlY3Rpb25zIGRyb3Bkb3duICh0b2dnbGVhYmxlKS48YnIgLz4KVGhpcyBpcyBqdXN0IGZv
ciBlYXNpZXIgbWFpbnRlbmFuY2Ugb2YgdGhlIHNpdGUgZm9yIHRoZSBhZG1pbi48L3A+Cgo8
cD5Zb3Ugd291bGQgd2FudCB0byBmb2xsb3cgdGhpcyB0dXRvcmlhbCB0byBnZXQgdGhlIGZ1
bGwgYmVuZWZpdHMgZnJvbSBkZW1fY2xvbmU6IDxhIGhyZWY9Imh0dHBzOi8vd3d3LnJhcHBp
ZC5kZS90eHBfbWwiPnd3dy5yYXBwaWQuZGUvdHhwX21sPC9hPjwvcD4KCjxwPiMjIyMjIzwv
cD4KCjxwPlRoZSBwbHVnaW4gaXMganVzdCBhdCBpdHMgYmVnaW5uaW5nLiBIb3BlZnVsbHkg
ScK0bGwgZmluZCB0aGUgdGltZSB0byBtYWtlIGl0IGdyb3cgYW5kIHdvcmsgaW4gYSBtb3Jl
IHN0YW5kLWFsb25lIGFuZCB1bml2ZXJzYWwgd2F5IHRvIGhlbHAgd2l0aCBtdWx0aWxpbmd1
YWwgdGV4dHBhdHRlcm4gd2Vic2l0ZXMuPC9wPiI7czozOiJjc3MiO3M6MDoiIjtzOjQ6ImNv
ZGUiO3M6NDQyODoiZ2xvYmFsICRwcmVmcywgJHR4cGNmZzsKCnJlZ2lzdGVyX2NhbGxiYWNr
KCdkZW1fY2xvbmVfb3B0aW9ucycsICdwbHVnaW5fcHJlZnMuZGVtX2Nsb25lJyk7CnJlZ2lz
dGVyX2NhbGxiYWNrKCdkZW1fY2xvbmVfYXJ0aWNsZScsICdhcnRpY2xlX3VpJywgJ3NvcnRf
ZGlzcGxheScpOwphZGRfcHJpdnMoJ3BsdWdpbl9wcmVmcy5kZW1fY2xvbmUnLCAnMSwyJyk7
CgpmdW5jdGlvbiBkZW1fY2xvbmVfb3B0aW9ucygkZXZlbnQsICRzdGVwKQp7CiAgICBnbG9i
YWwgJHByZWZzOwoKICAgIGlmICgkc3RlcCA9PSAncHJlZnNfc2F2ZScpIHsKICAgICAgICBw
YWdldG9wKCdkZW1fY2xvbmUnLCAnUHJlZmVyZW5jZXMgc2F2ZWQnKTsKICAgIH0gZWxzZSB7
CiAgICAgICAgcGFnZXRvcCgnZGVtX2Nsb25lJyk7CiAgICB9CgogICAgLy8gRGVmaW5lIHRo
ZSBmb3JtIGZpZWxkcy4KICAgICRmaWVsZHMgPSBhcnJheSgKICAgICAgICAnZGVtX2Nsb25l
X2N1c3RvbV9maWVsZCcgPT4gJ1VzZSBDdXN0b20gRmllbGQgTnIuOicsCiAgICAgICAgLy8n
ZGVtX2Nsb25lX2RlZmF1bHRfbGFuZ3VhZ2UnID0+ICdEZWZhdWx0IExhbmd1YWdlIChlLmcu
IGVuKScsCgogICAgKTsKCiAgICBpZiAoJHN0ZXAgPT0gJ3ByZWZzX3NhdmUnKSB7CgogICAg
ICAgIGZvcmVhY2ggKCRmaWVsZHMgYXMgJGtleSA9PiAkbGFiZWwpIHsKICAgICAgICAgICAg
JHByZWZzWyRrZXldID0gdHJpbShncHMoJGtleSkpOwogICAgICAgICAgICBzZXRfcHJlZigk
a2V5LCAkcHJlZnNbJGtleV0pOwogICAgICAgIH0KCiAgICB9CgogICAgLy8gUmVtb3ZlIHRo
ZSBkZW1fY2xvbmVfc2VjdGlvbl90YWIgZmllbGQgYXMgd2Ugd2FudCB0byBtYW51YWxseSBh
ZGQgdGhpcy4KICAgIHVuc2V0KCRmaWVsZHNbJ2RlbV9jbG9uZV9zZWN0aW9uX3RhYiddKTsK
CiAgICAkZm9ybSA9ICcnOwoKICAgIC8vJGZvcm0gLj0gaGVkKCdEYXMga2FubiBlaW5lIG3D
tmdsaWNoZSBIZWFkbGluZSBzZWluJywgMik7CgogICAgZm9yZWFjaCAoJGZpZWxkcyBhcyAk
a2V5ID0+ICRsYWJlbCkgewogICAgICAgICRmb3JtIC49ICI8cCBjbGFzcz0nJGtleSc+PHNw
YW4gY2xhc3M9J2VkaXQtbGFiZWwnPjxsYWJlbCBmb3I9JyRrZXknPiRsYWJlbDwvbGFiZWw+
PC9zcGFuPiI7CiAgICAgICAgJGZvcm0gLj0gIjxzcGFuIGNsYXNzPSdlZGl0LXZhbHVlJz4i
IC4gZklucHV0KCd0ZXh0JywgJGtleSwgJHByZWZzWyRrZXldLCAnJywgJycsICcnLCAnJywg
JycsICRrZXksJycsJycsJ2UuZy4gMScpIC4gIjwvc3Bhbj4iOwogICAgICAgICRmb3JtIC49
ICc8L3A+JzsKICAgIH0KCiAgICAkcGFuZWxzID0gYXJyYXkoCiAgICAgICAgJ2NvbnRlbnQn
ID0+ICdDb250ZW50JywKICAgICAgICAnZXh0ZW5zaW9ucycgPT4gJ0V4dGVuc2lvbnMnLAog
ICAgICAgICcnID0+ICdIaWRkZW4nCiAgICApOwoKICAgICRwYW5lbCA9ICRwcmVmc1snZGVt
X2Nsb25lX3NlY3Rpb25fdGFiJ107CgoKICAgICRmb3JtIC49IHNJbnB1dCgncHJlZnNfc2F2
ZScpIC4gbiAuIGVJbnB1dCgncGx1Z2luX3ByZWZzLmRlbV9jbG9uZScpOwoKICAgICRmb3Jt
IC49ICc8cD4nIC4gZklucHV0KCdzdWJtaXQnLCAnU3VibWl0JywgZ1R4dCgnc2F2ZScpLCAn
cHVibGlzaCcpIC4gJzwvcD4nOwoKICAgICRodG1sID0gIjxoMSBjbGFzcz0ndHhwLWhlYWRp
bmcnPmRlbV9jbG9uZSBQcmVmZXJlbmNlczwvaDE+PHA+RGVmaW5lIHRoZSBjdXN0b20gZmll
bGQgbnVtYmVyIHRoYXQgc2hvdWxkIGhvbGQgdGhlIElEIG9mIHRoZSByZWxhdGVkIGFydGlj
bGU8L3A+IjsKICAgICRodG1sIC49IGZvcm0oIjxkaXYgY2xhc3M9J3R4cC1lZGl0Jz4iIC4g
JGZvcm0gLiAiPC9kaXY+IiwgIiBjbGFzcz0nZWRpdC1mb3JtJyIpOwoKICAgIGVjaG8gJGh0
bWw7CgogICAgcmV0dXJuOwp9CgoKCgoKZnVuY3Rpb24gZGVtX2Nsb25lX2FydGljbGUoJGV2
ZW50LCAkc3RlcCwgJGRhdGEsICRycykgewoKCWdsb2JhbCAkcHJlZnM7CgoJZXh0cmFjdCgk
cnMpOwoKCgkgLy8gREVCVUcKCS8vIGRtcCgkYXJyX3ZhbHVlcyk7CgoJLy8gWW91IGFyZSB1
c2lnIGFkaV9tZW51LiBHcmVhdCEgQmVuZWZpdCBmcm9tIGFuIGVuaGFjZWQgY2xvbmUgZnVu
Y3Rpb24uIFNlY3Rpb24gaXMgY2hhbmdlZCBpbnRvIHNpc3RlciBzZWN0aW9uIGluIHNlY29u
ZCBsYW5ndWFnZQoJaWYgKGxvYWRfcGx1Z2luKCdhZGlfbWVudScpKSB7CgoJCSRzaXN0ZXJf
c2VjdGlvbiA9IGdldFRoaW5nKCdTRUxFQ1QgbmFtZSBGUk9NIHR4cF9zZWN0aW9uCgkJCQkJ
CVdIRVJFIGFkaV9tZW51X3RpdGxlID0gIicuJFNlY3Rpb24uJyIKCQkJCQkJQU5EIG5hbWUg
IT0gIicuJFNlY3Rpb24uJyIKCQkJCQkJJyk7CgoKCQkkaGlkZV90ZXh0ID0gZ1R4dCgnZGVt
X2Nsb25lX2hpZGVfc2VjdGlvbnMnKTsKCQkkc2hvd190ZXh0ID0gZ1R4dCgnZGVtX2Nsb25l
X3Nob3dfc2VjdGlvbnMnKTsKCQlpZigkcHJlZnNbJ2RlbV9jbG9uZV9jdXN0b21fZmllbGQn
XSl7CgkJCSRkZW1fY2xvbmVfY3VzdG9tX2ZpZWxkID0gJHByZWZzWydkZW1fY2xvbmVfY3Vz
dG9tX2ZpZWxkJ107CgkJfSBlbHNlIHsKCQkJJGRlbV9jbG9uZV9jdXN0b21fZmllbGQgPSAi
MSI7CgkJfQoJCS8qaWYoJHByZWZzWydkZW1fY2xvbmVfZGVmYXVsdF9sYW5ndWFnZSddKXsK
CQkJJGRlbV9jbG9uZV9kZWZhdWx0X2xhbmd1YWdlID0gJHByZWZzWydkZW1fY2xvbmVfZGVm
YXVsdF9sYW5ndWFnZSddOwoJCX0gZWxzZSB7CgkJCSRkZW1fY2xvbmVfZGVmYXVsdF9sYW5n
dWFnZSA9ICdlbic7CgkJfSovCgoKCSAJZWNobyBzY3JpcHRfanMoPDw8RU9KUwoJCQkkKGRv
Y3VtZW50KS5yZWFkeShmdW5jdGlvbigpIHsKCQkJCS8vIGhpZGUgYWxsIG9wdGlvbnMvc2Vj
dGlvbnMgd2l0aCBsYW5ndWFnZSB1bmRlcnNjb3JlICJfIgoJCQkJJCgnc2VsZWN0W25hbWU9
IlNlY3Rpb24iXSBvcHRpb246Y29udGFpbnMoXyknKS5jc3MoImRpc3BsYXkiLCJub25lIik7
CgoJCQkJJCggIiNkZW0tdG9nZ2xlLXNlY3Rpb25zIiApLmNsaWNrKGZ1bmN0aW9uKCkgewoJ
CQkJICAkKCdzZWxlY3RbbmFtZT0iU2VjdGlvbiJdIG9wdGlvbjpjb250YWlucyhfKScpLnRv
Z2dsZSgpOwoJCQkJICAkKHRoaXMpLnRleHQoJCh0aGlzKS50ZXh0KCkgPT0gJyRoaWRlX3Rl
eHQnID8gJyRzaG93X3RleHQnIDogJyRoaWRlX3RleHQnKTsKCQkJCX0pOwoKCQkJCXZhciBv
cmlnaW5faWQgPSAkSUQ7CgkJCQkkKCIjZGVtX2Nsb25lIikuY2xpY2soZnVuY3Rpb24oZXZl
bnQpewoJCQkJCSQoJyNjdXN0b20tJGRlbV9jbG9uZV9jdXN0b21fZmllbGQnKS52YWwob3Jp
Z2luX2lkKTsKCQkJCQkkKCdzZWxlY3RbbmFtZT0iU2VjdGlvbiJdJykudmFsKCckc2lzdGVy
X3NlY3Rpb24nKS50cmlnZ2VyKCdjaGFuZ2UnKTsKCQkJCX0pOwoJCQl9KTsKCQlFT0pTCgkJ
KTsKCgkgCWlmICgkc2lzdGVyX3NlY3Rpb24pIHsKCSAgIAkgCSRjbG9uZV9saW5rID0gbi5o
cmVmKCc8c3BhbiBjbGFzcz0idWktaWNvbiB1aS1pY29uLWNvcHkiPjwvc3Bhbj4gJy5nVHh0
KCdkZW1fY2xvbmVfc3RyaW5nJykuJzogJyAuICRzaXN0ZXJfc2VjdGlvbiwgJyMnLCBhcnJh
eSgKCSAgICAgICAgJ2NsYXNzJyA9PiAndHhwLWNsb25lJywKCSAgICAgICAgJ2lkJyAgICA9
PiAnZGVtX2Nsb25lJywKCSAgICApKTsKCSAgIAl9IGVsc2UgewoJICAgCQkkY2xvbmVfbGlu
ayA9ICc8c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPicuZ1R4dCgnZGVtX2Nsb25lX2FsZXJ0
JykuJzwvc3Bhbj4nOwoJICAgCX0KCgkgICAJJHRvZ2dsZV9zZWN0aW9ucyA9ICc8YnIvPjxz
bWFsbD48YSBocmVmPSIjIiBpZD0iZGVtLXRvZ2dsZS1zZWN0aW9ucyI+Jy4kc2hvd190ZXh0
Lic8L2E+PC9zbWFsbD4nOwoKCS8vIHNpbXBsZSBjbG9uaW5nIHdpdGggb3JpZ2luIElEIGlu
IGRlZmluZWQgY3VzdG9tLWZpZWxkLiBObyBzZWN0aW9uIGNoYW5nZS4KCX0gZWxzZSB7CgoJ
CWVjaG8gc2NyaXB0X2pzKDw8PEVPSlMKCQkJJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24o
KSB7CgkJCQl2YXIgb3JpZ2luX2lkID0gJElEOwoJCQkJJCgiI2RlbV9jbG9uZSIpLmNsaWNr
KGZ1bmN0aW9uKGV2ZW50KXsKCQkJCQkkKCcjY3VzdG9tLSRkZW1fY2xvbmVfY3VzdG9tX2Zp
ZWxkJykudmFsKG9yaWdpbl9pZCk7CgkJCQl9KTsKCQkJfSk7CgkJRU9KUwoJCSk7CgoJCSRj
bG9uZV9saW5rID0gbi5ocmVmKCc8c3BhbiBjbGFzcz0idWktaWNvbiB1aS1pY29uLWNvcHki
Pjwvc3Bhbj4gJy5nVHh0KCdkZW1fY2xvbmVfc2ltcGxlJyksICcjJywgYXJyYXkoCgkgICAg
ICAgICdjbGFzcycgPT4gJ3R4cC1jbG9uZScsCgkgICAgICAgICdpZCcgICAgPT4gJ2RlbV9j
bG9uZScsCgkgICAgKSk7CgoJCSR0b2dnbGVfc2VjdGlvbnMgPSAnJzsKCgl9CgoKCWlmICgh
ZW1wdHkoJElEKSkgewogICAgCXJldHVybiAkY2xvbmVfbGluay4kdG9nZ2xlX3NlY3Rpb25z
LiRkYXRhOwoJfQp9IjtzOjM6Im1kNSI7czozMjoiYzU2NmQ2NWQ5ZmY2NjIyNGY3MjEwMDQ5
YmEzMzZmYWYiO30=

Hopefully I´ll find the time to make dem_clone grow and make it work in a more stand-alone and universal way to help with multi-lingual setups.
Any suggestions on how to improve it are welcome.

EDIT: Christian’s site has since been renewed. Plugin txt installer and a PDF archive of the original instructions page added to this post (jakob).

Last edited by demoncleaner (2021-05-12 10:48:06)

Offline

#2 2021-05-12 08:24:14

Pat64
Plugin Author
From: France
Registered: 2005-12-12
Posts: 1,659
GitHub Twitter

Re: dem_clone: Duplicating articles with a reference to their origin

Thank you.
It seems interesting and useful. I’ll make a test.


Patrick.

Github | CodePen | Codier | Simplr theme | Wait Me: a maintenance theme | [\a mi.ni.ma]: a “Low Tech” simple Blog theme.

Offline

#3 2021-05-12 08:49:27

phiw13
Plugin Author
From: South-Western Japan
Registered: 2004-02-27
Posts: 3,487
Website

Re: dem_clone: Duplicating articles with a reference to their origin

demoncleaner wrote #330080:

[…] it stores the ID of the original article in custom-1 of the new article.

Is that hard coded to the custom-1 field ? On one project where this might be useful, I already have a number of custom fields defined so, this might make a mess… Custom-9 is still available though :)


Where is that emoji for a solar powered submarine when you need it ?
Sand space – admin theme for Textpattern
phiw13 on Codeberg

Offline

#4 2021-05-12 09:16:21

demoncleaner
Plugin Author
From: Germany
Registered: 2008-06-29
Posts: 225
Website

Re: dem_clone: Duplicating articles with a reference to their origin

Yes thats hardcoded.
For a quick solution you could just change “custom-1” 2 times in the code to “custom-9” and it should work fine.

I think in the next version the plugin will have some preferences where you could choose the custom_field you want to apply this to.

I also planned already to have another field in preferences where you would define your default language. Which will also help in various ways. Only from curiosity: Are you using it in a multi-language context or for something else?

Offline

#5 2021-05-12 10:43:36

demoncleaner
Plugin Author
From: Germany
Registered: 2008-06-29
Posts: 225
Website

Re: dem_clone: Duplicating articles with a reference to their origin

I updated the plugin in my first post. It has preferences now where you can define the custom-field of your choice.

If nothing is chosen it will have take custom-field 1.

Last edited by demoncleaner (2021-05-12 10:49:49)

Offline

#6 2021-05-13 05:35:58

Pat64
Plugin Author
From: France
Registered: 2005-12-12
Posts: 1,659
GitHub Twitter

Re: dem_clone: Duplicating articles with a reference to their origin

demoncleaner wrote #330115:

I updated the plugin in my first post. It has preferences now where you can define the custom-field of your choice.

If nothing is chosen it will have take custom-field 1.

Perfect!

Unfortunately, the link provided above returns a 404 error page…


Patrick.

Github | CodePen | Codier | Simplr theme | Wait Me: a maintenance theme | [\a mi.ni.ma]: a “Low Tech” simple Blog theme.

Offline

#7 2021-05-13 06:52:19

demoncleaner
Plugin Author
From: Germany
Registered: 2008-06-29
Posts: 225
Website

Re: dem_clone: Duplicating articles with a reference to their origin

Sorry. It is fixed.

Offline

Board footer

Powered by FluxBB