A. Fig Lee
Member
Users have asked me for a BBCode which would translate latin alphabet into russian one.
What would be the best practices? I have a code from my previous php work, but want to integrate into xenforo.
That is my second day developing with xenforo, so I'm sure there are better way.
So far I came up with the following code:
As you may see it simple copy/paste from Traverser::renderSubTree
I think I need I have to subclass AbstractController and simply override
Traverser::renderString.
But I see when I click replay to such posts, I see original
code with wrapping BBCode, like
[tr]Test[/tr]
instead of
Тест
Meanwhile, original BBCodes B, I etc works perfectly and seem they are implemented differently through filter.
So, 2 questions:
1. Is it design wise correct to subclass AbstractController and override renderString?
2. Am I going right direction or should I concentrate on filter interface and look how BBCode B, I is implemented
What would be the best practices? I have a code from my previous php work, but want to integrate into xenforo.
That is my second day developing with xenforo, so I'm sure there are better way.
So far I came up with the following code:
PHP:
<?php
namespace My;
//use XF\Pub\Controller\AbstractController;
class Translit //extends AbstractController
{
private static $arr_liter=array("^J"=>"Й", "^Y"=>"Ы", "^Z"=>"З", "^C"=>"Ц", "^S"=>"С", "^X"=>"Х",
"^j"=>"й", "^y"=>"ы", "^z"=>"з", "^c"=>"ц", "^s"=>"с", "^x"=>"х",
"Jo"=>"Ё", "JO"=>"Ё",
"YO"=>"Ё", "Yo"=>"Ё", "Ju"=>"Ю", "JU"=>"Ю", "YU"=>"Ю", "Yu"=>"Ю", "JA"=>"Я", "Ja"=>"Я", "YA"=>"Я", "Ya"=>"Я",
"Zh"=>"Ж", "ZH"=>"Ж", "Ch"=>"Ч", "CH"=>"Ч", "SHH"=>"Щ", "SHh"=>"Щ", "Shh"=>"Щ", "Sh"=>"Ш", "SH"=>"Ш",
"Xh"=>"Щ", "XH"=>"Щ", "##"=>"Ъ", "shh"=>"щ", "''"=>"Ь", "jo"=>"ё", "yo"=>"ё", "zh"=>"ж", "ch"=>"ч",
"sh"=>"ш", "xh"=>"щ", "ju"=>"ю", "ja"=>"я", "yu"=>"ю", "ya"=>"я", "j"=>"й", "W"=>"Э", "A"=>"А", "w"=>"э",
"B"=>"Б", "V"=>"В", "G"=>"Г", "D"=>"Д", "E"=>"Е", "Z"=>"З", "I"=>"И", "J"=>"Й",
"K"=>"К", "L"=>"Л", "M"=>"М", "N"=>"Н", "O"=>"О", "P"=>"П", "R"=>"Р", "S"=>"С", "T"=>"Т",
"U"=>"У", "F"=>"Ф", "H"=>"Х", "X"=>"Х", "C"=>"Ц", "Y"=>"Ы",
"a"=>"а", "b"=>"б", "v"=>"в", "g"=>"г", "d"=>"д", "e"=>"е", "z"=>"з", "i"=>"и",
"k"=>"к", "l"=>"л", "m"=>"м", "n"=>"н", "o"=>"о", "p"=>"п", "r"=>"р", "s"=>"с", "t"=>"т",
"u"=>"у", "f"=>"ф", "h"=>"х", "x"=>"х", "c"=>"ц", "#"=>"ъ", "y"=>"ы", "'"=>"ь"
);
private static function convert_liter_up($s_string){//latin to cyrillic
global $arr_liter;
$s_ret=$s_string;
foreach(self::$arr_liter as $k=>$v)
{
$s_ret=str_replace($k, $v, $s_ret);
}
return $s_ret;
}
public static function translate($tagChildren, $tagOption, $tag, array $options,
\XF\BbCode\Renderer\AbstractRenderer $renderer) {
$output = '';
foreach ($tagChildren AS $element)
{
if (is_array($element))
{
$options['stack'][] = $element;
$output .= $renderer->renderTag($element, $options);
}
else
{
$output .= self::convert_liter_up($renderer->renderString($element, $options));
}
}
return $output;
}
}
As you may see it simple copy/paste from Traverser::renderSubTree
I think I need I have to subclass AbstractController and simply override
Traverser::renderString.
But I see when I click replay to such posts, I see original
code with wrapping BBCode, like
[tr]Test[/tr]
instead of
Тест
Meanwhile, original BBCodes B, I etc works perfectly and seem they are implemented differently through filter.
So, 2 questions:
1. Is it design wise correct to subclass AbstractController and override renderString?
2. Am I going right direction or should I concentrate on filter interface and look how BBCode B, I is implemented