Bright Citadel

Knowledge. Power. Immortality.

Previous Entry Share Next Entry
ICED Replacer. MediaWiki-плагин для химической разметки
alexeybright
Года три назад я написал PHP-скрипт для отображения линейных химических формул в HTML, который использовал главным образом для себя самого. А недавно решил все же оформить его в виде расширения для MediaWiki-движка. После установки пользоваться им предельно просто. Блок химических уравнений записывается между тегами <iced> и </iced>. Сами уравнения записываются безо всякого форматирования, "как есть" за редкими исключениями (см. ниже), а при рендеринге плагин выполняет необходимые замены.

Вот примеры:

Исходный текст

Результат
[Fe6C(CO)16]2- + RhCl3*H2O => [Fe5RhC(CO)16]- [Fe6C(CO)16]2- + RhCl3·H2O  →  [Fe5RhC(CO)16]-
NH4[PF6] + 2H2O(гор.) => NH4[PO2F2] + 4HF NH4[PF6] + 2H2O(гор.)  →  NH4[PO2F2] + 4HF
2NH4[PF6] + 5H2O + 2HNO3(конц.) => H[PO2F2] + H2[PO3F] + 9HF + 2NH4NO3 2NH4[PF6] + 5H2O + 2HNO3(конц.)  →  H[PO2F2] + H2[PO3F] + 9HF + 2NH4NO3
NH4\+ + 2H2O <=> NH3*H2O + H3O+ NH4+ + 2H2O  ⇌  NH3·H2O + H3O+
HNO2 + HCl(разб.) + 6H0(Zn) = NH4Cl + 2H2O HNO2 + HCl(разб.) + 6H0(Zn)  =  NH4Cl + 2H2O
2HNO2 + 2HI => I2! + 2NO^ + 2H2O 2HNO2 + 2HI  →  I2↓ + 2NO↑ + 2H2O
HNO2 + H2O2(конц.) <=> HNO(O2\2-) + H2O HNO2 + H2O2(конц.)  ⇌  HNO(O22-) + H2O
LiNO2(разб.) + 4H2O => [Li(H2O)4]+ + NO2\- LiNO2(разб.) + 4H2O  →  [Li(H2O)4]+ + NO2-

Все обрабатываемые элементы разметки приведены в примерах. Пожалуй, пояснения здесь требует только случай наличия верхнего и нижнего индексов одновременно: они разделяются символом \, причем нижний индекс указывается первым.

Вот собственно текст плагина:



# Replaces simple ICED expressions with related HTML markup
# Created by Alexey Bright (cyborgizator@gmail.com)

if (!defined('MEDIAWIKI')) {
    die('This file is a MediaWiki extension, it is not a valid entry point');
}

global $wgHooks;
global $wgExtensionCredits;

$wgExtensionCredits['icedreplacerhook'][] = array(
    'name' => 'ICED Replacer',
    'type' => 'hook',
    'author' => 'Alexey Bright (cyborgizator@gmail.com)',
    'version' => '1.0',
    'update' => '10-05-2013',
    'url' => 'http://alexeybright.livejournal.com',
    'description' => 'Replaces simple ICED expressions with related HTML markup',
);

$wgHooks['ParserFirstCallInit'][] = 'wfIcedParserInit';

function wfIcedParserInit(Parser $parser) {
    $parser->setHook( 'iced', 'wfIcedRender' );
    return true;
}

function wfIcedRender( $input, array $args, Parser $parser, PPFrame $frame ) {
    $text = str_replace('^', '↑', $input);
    $text = str_replace('*', '·', $text);
    $text = str_replace('!', '↓', $text);
    $text = str_replace('<=>', ' ⇌ ', $text);
    $text = str_replace('=>', ' → ', $text);
    $text = str_replace('=', ' = ', $text);
    $text = preg_replace('/(\D)0/', '\10', $text);
    $text = preg_replace(
       '/([a-zA-Z\)\]])(\d*[+-])([^\w\(\[]|$)/',
       '\1\2\3',
       $text);
    $text = preg_replace(
       '/([a-zA-Z\)\]])(\d+)/',
       '\1\2',
       $text);
    $text = preg_replace('/\\\\(\d*[+-])/', '\1', $text);
    return $text;
}



Скачать же архив с исходником можно отсюда.

?

Log in

No account? Create an account