Интернет, компьютеры, софт и прочий Hi-Tech

Подписаться через RSS2Email.ru

BBCode для шахматистов

Увидел на одном из шахматных форумов тег [chess], выводящий шахматную доску с расставленными фигурами. Захотел реализовать этот тег в xBB. Оказалось несложно.
 
Самая большая сложность - найти хорошую шахматную ходилку на JavaScript. Нашел ее на rsdn.ru. Лицензия не указана. От автора: "Написал alpha-версию перемещалки шахматных фигур на JavaScript. Может кому сгодится". Очень сгодилась. Большое спасибо автору. Правда, найденный скрипт пришлось самую малость изменить под мою задачу. Надеюсь, что и мой труд кому-нибудь сгодится.
 
Раз есть ходилка, то дальше все просто.
 
Во-первых. Заливаем шахматную ходилку куда-нибудь на свой сайт. (Должна появиться папка chessJs)
 
Во-вторых. Пишем PHP-класс, ответственный за тег [chess]. Вот вариант для PHP 5:
 
PHP
  1. <?php
  2. // Класс для тега [chess]
  3. class Xbb_My_Chess extends bbcode
  4. {
  5.     public $behaviour = 'div';
  6.  
  7.     private $_defaultFen = 'rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1';
  8.  
  9.     private static $_jsIsLoad = false;
  10.  
  11.     private $_pathToJs = '/путь/от/главной/сайта/до/chessJs/';
  12.  
  13.     function get_html($tree = null)
  14.     {
  15.         $fen = htmlspecialchars(trim(parent::get_html($tree)));
  16.         if (! $fen) {
  17.             $fen = $this->_defaultFen;
  18.         }
  19.         $html = '';
  20.         if (! self::$_jsIsLoad) {
  21.             self::$_jsIsLoad = true;
  22.             $html = '<script language="javascript" type="text/javascript" src="'
  23.                   . $this->_pathToJs . 'chess.js"></script>'
  24.                   . '<script language="javascript" type="text/javascript" src="'
  25.                   . $this->_pathToJs . 'chessGui.js"></script>'
  26.                   . '<script language="javascript" type="text/javascript">'
  27.                   . 'config.pieceDir = "' . $this->_pathToJs . '" + config.pieceDir;'
  28.                   . '</script>';
  29.         }
  30.         $rand = rand();
  31.         $formId = 'chessFormId' . $rand;
  32.         $divId = 'chessDivId' . $rand;
  33.         $undoId = 'chessUndoId' . $rand;
  34.         $html .= '<form name="' . $formId . '" id="' . $formId . '">'
  35.                . '<div align="center">'
  36.                . '<div id="' . $divId . '" style="width:328px"></div>'
  37.                . '<p><strong>BBCode:</strong> <font color="red">[chess]'
  38.                . '<span id="' . $divId . 'Span" style="color:green"></span>'
  39.                . '[/chess]</font></p>'
  40.                . '<input id="' . $undoId . '" type="button" value="Отменить ход"/>'
  41.                . '<input name="btnSetFen" type="button" value="Задать FEN" '
  42.                . 'onclick="SetFen(\'' . $divId . '\', \'' . $undoId . '\')" />'
  43.                . '</div>'
  44.                . '</form>'
  45.                . '<script language="javascript" type="text/javascript">'
  46.                . 'SetDiagram("' . $divId . '", "' . $fen . '", "' . $undoId . '");'
  47.                . '</script>';
  48.         return $html;
  49.     }
  50. }

Вот вариант для PHP 4 (для несчастных, вынужденных с ним работать):
 
PHP
  1. <?php
  2. // Класс для тега [chess]
  3. class Xbb_My_Chess extends bbcode
  4. {
  5.     var $behaviour = 'div';
  6.  
  7.     var $_defaultFen = 'rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1';
  8.  
  9.     var $_pathToJs = '/путь/от/главной/сайта/до/chessJs/';
  10.  
  11.     function get_html($tree = null)
  12.     {
  13.         $fen = htmlspecialchars(trim(parent::get_html($tree)));
  14.         if (! $fen) {
  15.             $fen = $this->_defaultFen;
  16.         }
  17.         $html = '';
  18.         if (! isset($_GLOBALS['_XbbMyChessJsIsLoad']) || ! $_GLOBALS['_XbbMyChessJsIsLoad']) {
  19.             $_GLOBALS['_XbbMyChessJsIsLoad'] = true;
  20.             $html = '<script language="javascript" type="text/javascript" src="'
  21.                   . $this->_pathToJs . 'chess.js"></script>'
  22.                   . '<script language="javascript" type="text/javascript" src="'
  23.                   . $this->_pathToJs . 'chessGui.js"></script>'
  24.                   . '<script language="javascript" type="text/javascript">'
  25.                   . 'config.pieceDir = "' . $this->_pathToJs . '" + config.pieceDir;'
  26.                   . '</script>';
  27.         }
  28.         $rand = rand();
  29.         $formId = 'chessFormId' . $rand;
  30.         $divId = 'chessDivId' . $rand;
  31.         $undoId = 'chessUndoId' . $rand;
  32.         $html .= '<form name="' . $formId . '" id="' . $formId . '">'
  33.                . '<div align="center">'
  34.                . '<div id="' . $divId . '" style="width:328px"></div>'
  35.                . '<p><strong>BBCode:</strong> <font color="red">[chess]'
  36.                . '<span id="' . $divId . 'Span" style="color:green"></span>'
  37.                . '[/chess]</font></p>'
  38.                . '<input id="' . $undoId . '" type="button" value="Отменить ход"/>'
  39.                . '<input name="btnSetFen" type="button" value="Задать FEN" '
  40.                . 'onclick="SetFen(\'' . $divId . '\', \'' . $undoId . '\')" />'
  41.                . '</div>'
  42.                . '</form>'
  43.                . '<script language="javascript" type="text/javascript">'
  44.                . 'SetDiagram("' . $divId . '", "' . $fen . '", "' . $undoId . '");'
  45.                . '</script>';
  46.         return $html;
  47.     }
  48. }

Не забудьте исправить строчку
 
PHP
  1. $_pathToJs = '/путь/от/главной/сайта/до/chessJs/';

на реальный путь к chessJs.
 
В-третьих. Нужно сохранить этот класс в bbcode/Xbb/My/Chess.php с точностью до регистра.
 
В-четвертых. Откройте файл bbcode/config/tags.php. Найдите в нем строки
 
PHP
  1.     'center'       => 'Xbb_Tags_Align'  ,
  2.     'cite'         => 'Xbb_Tags_Simple' ,

и замените их на
 
PHP
  1.     'center'       => 'Xbb_Tags_Align'  ,
  2.     'chess'        => 'Xbb_My_Chess'    ,
  3.     'cite'         => 'Xbb_Tags_Simple' ,

Теперь все должно работать.

Как должно работать

Код [chess][/chess] выводит шахматную доску с расставленными фигурами:
 

BBCode: [chess][/chess]


 
Фигуры можно таскать по доске мышкой. Сходить неправильно - невозможно Well. Между тегами [chess][/chess] можно указать позиции шахматных фигур в нотации FEN. Пример:
[chess]rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq e3 0 1[/chess].
Этот код покажет такой расклад:
 

BBCode: [chess][/chess]


 
Очень удобно для шахматных турниров и их обсуждений на любом форуме.
 


Если хотите реализовать BBCode с тегом [chess] на своем сайте, то
  1. Скачайте с SF библиотеку xBB v0.29 для PHP 5 или для PHP 4.
     
  2. Скачайте архив со скриптами для создания тега [chess]. Для PHP 5 или для PHP 4.
     
  3. Еще раз прочитайте эту статью и сделайте, как в ней написано. Удачи!

Дмитрий Скоробогатов
Биржа долевых инвестиций SIMEX.

Последнее редактирование: 2010-03-10 11:27:10

Метки материала: примеры bbcode, bbcode, bbcodes, бб-коды, bb-code, bb-код, bb-коды, тег, теги, tag, tags, теги bbcode, скрипт, php, php4, php5, компьютерные игры, js, javascript, скрипт bbcode, скрипт php, форум, script, xbb, класс, программирование


10 комментариев

08.01.2010 21:51:38 #
Mozilla Firefox dima
Вам тоже спасибо за тестирование и сообщение о найденной ошибке Well
08.01.2010 19:31:33 #
Internet Explorer Гость ПерС
Большое спасибо
А я уже после того, как написал Вам, постваил перед "критической" строкой тупо
if (div==null) { return; }
- тоже вроде помогло Well
08.01.2010 11:42:33 #
Mozilla Firefox dima
Найдите файл chessGui.js и откройте его для редактирования. Замените в нем 131-134 строки на следующее:
 
Javascript
//    var position = div.position;
//    if (div.isPromotion) {
//        return;
//    }
    if (! div || div.isPromotion) {
        return;
    }
    var position = div.position;

Ошибка должна исчезнуть.
07.01.2010 23:08:56 #
Internet Explorer Гость ПерС
Спасибо за интересный скрипт.
Ошибка JS возникает только после превращения фигуры (появления окна "Select piece")
"Требуется объект", код, похоже, этот:
 var position = div.position;
в chessGUI.js
Сам навскидку поправить не смог, написал сюда, вдруг подскажете? Well
01.09.2009 18:25:28 #
Iceweasel dima
Фрилансер (от freelancer) — человек, выполняющий работу без заключения долговременного договора с работодателем, нанимаемый только для выполнения определённого перечня работ (внештатный работник).
 
Его можно найти на любом из следующих сайтов:
 
http://www.free-lance.ru/
http://www.free-lancers.net/
http://www.weblancer.net/
и т.п.
01.09.2009 11:58:43 #
Internet Explorer Гость kosmodrom
Я не знаю, кто такой "фрилансер", и где его найти. Not so
24.08.2009 12:55:49 #
Iceweasel dima
Я не фрилансер. Заказов со стороны не беру. Советом помогу бесплатно.
 
У Вас форум на PHP-Fusion. Там свой парсер BBCode, к xBB отношения не имеющий. Там надо либо парсер целиком менять, либо к родному шахматы по мотивам этих прикручивать.
 
Первое трудоемко и нежелательно, - может осложнить вам обновление движка в будущем.
 
Второе - довольно несложная задача. Даете фрилансеру ссылку на эту страницу и говорите, что хотите видеть такое на своем форуме. За день сделает.
23.08.2009 12:53:45 #
Internet Explorer Гость kosmodrom
Привет! Есть шахматный сайт- http://www.gladiators-chess.ru/forum/index.php Сможешь прикрутить к нему шахматную доску? Об условиях договоримся. Пиши- gudzowatiy@mail.ru
27.07.2009 12:12:00 #
Iceweasel dima
Предыдущий текст по идее в оффтопе (когда такой тег реализуешь?)
Будет скоро. Но не люблю я его - читать мешает.
 
А про "шахматную приблуду" я и сам много думал, где заюзать. Может быть шахматный форум замутить? Well Но это надо к шахматам интерес иметь, а меня мало прикалывает.
27.07.2009 11:35:32 #
Mozilla Firefox Vitus
dima
Вот вариант для PHP 4 (для несчастных, вынужденных с ним работать):
Ы! Well
 
Предыдущий текст по идее в оффтопе (когда такой тег реализуешь?) Well
 
А так... Что-то я по-моему пропустил сию шахматную приблуду. Щас сяду, буду смотреть и много думать I roll!

Оставьте, пожалуйста, свой комментарий к публикации

Представиться как     Антибот:
   

Просьба не постить мусор. Если вы хотите потестить xBB, воспользуйтесь кнопкой предварительного просмотра на панели инструментов xBBEditor-а.


© 2007-2017, Дмитрий Скоробогатов.
Разрешается воспроизводить, распространять и/или изменять материалы сайта
в соответствии с условиями GNU Free Documentation License,
версии 1.2 или любой более поздней версии, опубликованной FSF,
если только иное не указано в самих материалах.