найти на сайте
ГлавнаяСтатьиФотографияМатериалыКарта узлаО себе(версия для печати)

PHP-сценарий для синтаксического оформления кода на языке C++

За основу данного сценария взят исходный код утилиты code2xml, текст которой можно скачать с сайта www.rsdn.ru. В настоящий момент проект заморожен, так как потерял актуальность. Для синтаксической подсветки текстов на формальных языках используйте промышленно признанный пакет GeSHi.

Загрузить

Описание

Подключите модуль «code2html.php» и вызывайте функцию CppConvert ( $Code, $Format ). С помощью значения «pre» параметра $Format, можно указать, что обрабатываемый код необходимо разместить в отдельном абзаце с применением элемента <pre>. Для синтаксического оформления функция CppConvert выделяет лексемы языка С++ и обрамляет их элементами:

В структуре $c2hConf перечислены все ключевые слова и заданы стили оформления каждого из перечисленных элементов. Поэтому необходимо вызвать метод BuildCode2htmlStyle (), который сформирует стилевое описание для ключевых слов.

Пример работы

В php-документе пишем строки:

<?php
include_once ( "code2html.php" );
 
print = BuildCode2htmlStyle () . CppConvert ( "
// Шаблонный прототип свойства с доступом чтение/запись
template
<
    class Owner,
    class T,
    T     (Owner::*Getter) (   ),
    void  (Owner::*Setter) ( T )
>
struct PropertyRW_
{
            Property ( Owner &amp; owner ): owner_ ( owner ) {}
            operator    T  ()       { return (owner_.*Getter) (); }
    T       operator    () ()       { return (owner_.*Getter) (); }
    void    operator =  ( T value ) { (owner_.*Setter) ( value ); }
    Owner & owner_;
    int     id ( 0x0 );
};
 
// Макрос свойства с доступом чтение/запись</code>
#define PropertyRW ( Name, Owner, T, Setter, Getter )
PropertyRW_&lt;Owner, T, &Owner::Setter, &amp;Owner::Getter> Name ()
{
    return PropertyRW_<Owner, T, &Owner::Setter, &Owner::Getter> (*this);
}
", "pre" );
?>

В итоге получаем на выходе следующий размеченный текст:

// Шаблонный прототип свойства с доступом чтение/запись
template
<
    class Owner,
    class T,
    T     (Owner::*Getter) (   ),
    void  (Owner::*Setter) ( T )
>
struct PropertyRW_
{
            Property ( Owner & owner ): owner_ ( owner ) {}
            operator    T  ()       { return (owner_.*Getter) (); }
    T       operator    () ()       { return (owner_.*Getter) (); }
    void    operator =  ( T value ) { (owner_.*Setter) ( value ); }
    Owner & owner_;
    int     id ( 0x0 );
};

// Макрос свойства с доступом чтение/запись
#define PropertyRW ( Name, Owner, T, Setter, Getter )
PropertyRW_<Owner, T, &Owner::Setter, &Owner::Getter> Name ()
{
    return PropertyRW_<Owner, T, &Owner::Setter, &Owner::Getter> (*this);
}

Благодаря такому небольшому сценарию, очень удобно сопровождать материалы статей в формате HTML. Поначалу все фрагменты кода на C++ на данном сайте были оформлены с помощью code2html. Но я рекомендую использовать промышленно признанный пакет GeSHi, который содержит цветовые схемы для более чем 50 формальных языков.

18 февраля 2005—24 февраля 2020
Максим Проскурня
© 1997–2020 Axofiber, axofiber.ru, axofiber.info