Ru-Board.club
← Вернуться в раздел «Программы»

» SciTE - Open Source Text Editor for Windows & Linux

Автор: brack
Дата сообщения: 23.08.2007 12:36
Всем доброго времени суток,

помогите новичку: нужена подсветка и api для typoscript пробовал те подсветки что уже в проге но ни одна не подошла, решил написать свой лексер. основная часть лексера списана с LexConf.cxx свой лексер назвал LexTS.cxx вот собственно код нового лексера:

Цитата:

#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <stdio.h>
#include <stdarg.h>

#include "Platform.h"

#include "PropSet.h"
#include "Accessor.h"
#include "KeyWords.h"
#include "Scintilla.h"
#include "SciLexer.h"

#ifdef SCI_NAMESPACE
using namespace Scintilla;
#endif

static void ColouriseTSDoc(unsigned int startPos, int length, int, WordList *keywordLists[], Accessor &styler) {
    
    int state = SCE_TS_DEFAULT;
    char chNext = styler[startPos];
    int lengthDoc = startPos+length;
    // create a buffer large enough to take the largest chunk...
    char *buffer = new char[length];
    int bufferCount = 0;

    // this assumes that we have 10 keyword list in typoscript.properties
    WordList &keywords = *keywordLists[0];
    WordList &tlo = *keywordLists[1];
    WordList &objects = *keywordLists[2];
    WordList &stdwrap = *keywordLists[3];
    WordList &imgResource = *keywordLists[4];
    WordList &imageLinkWrap = *keywordLists[5];
    WordList &textStyle = *keywordLists[6];
    WordList &encapseLines = *keywordLists[7];
    WordList &filelink = *keywordLists[8];
    WordList &conditionkeywords = *keywordLists[9];

    // go through all provided text segment
    // using the hand-written state machine shown below
    styler.StartAt(startPos);
    styler.StartSegment(startPos);
    for (int i = startPos; i < lengthDoc; i++) {
        char ch = chNext;
        chNext = styler.SafeGetCharAt(i + 1);

        switch(state) {
            case SCE_TS_DEFAULT:
                if( ch == '\n' || ch == '\r' || ch == '\t' || ch == ' ') {
                    // whitespace is simply ignored here...
                    styler.ColourTo(i,SCE_TS_DEFAULT);
                    break;
                } else if( ch == '#' || ch == '/' ) {
                    // signals the start of a comment...
                    state = SCE_TS_COMMENT;
                    styler.ColourTo(i,SCE_TS_COMMENT);
                } else if( ispunct(ch) ) {
                    // stay in TS_OPERATOR state until we find a non-alphanumeric
                    if( isalnum(ch) || (ch == '_') || (ch == '-') || (ch == '/') || (ch == '$') || (ch == '.') || (ch == '*')) {
                        buffer[bufferCount++] = static_cast<char>(tolower(ch));
                    } else {
                        state = SCE_TS_DEFAULT;
                        buffer[bufferCount] = '\0';

                        // check if the buffer contains a keyword, and highlight it if it is a keyword...
                        if(keywords.InList(buffer)) {
                            styler.ColourTo(i-1,SCE_TS_KEYWORDS );
                        } else if(tlo.InList(buffer)) {
                            styler.ColourTo(i-1,SCE_TS_TLO );
                        } else if(objects.InList(buffer)) {
                            styler.ColourTo(i-1,SCE_TS_OBJECTS );
                        } else if(stdwrap.InList(buffer)) {
                            styler.ColourTo(i-1,SCE_TS_STDWRAP );
                        } else if(imgResource.InList(buffer)) {
                            styler.ColourTo(i-1,SCE_TS_IMGRESOURCE );
                        } else if(imageLinkWrap.InList(buffer)) {
                            styler.ColourTo(i-1,SCE_TS_IMAGELINKWRAP );
                        } else if(textStyle.InList(buffer)) {
                            styler.ColourTo(i-1,SCE_TS_TEXTSTYLE );
                        } else if(encapseLines.InList(buffer)) {
                            styler.ColourTo(i-1,SCE_TS_ENCAPSELINES );
                        } else if(filelink.InList(buffer)) {
                            styler.ColourTo(i-1,SCE_TS_FILELINK );
                        } else if(conditionkeywords.InList(buffer)) {
                            styler.ColourTo(i-1,SCE_TS_CONDITIONKEYWORDS );
                        } else {
                            styler.ColourTo(i-1,SCE_TS_DEFAULT);
                        }

                        // push back the faulty character
                        chNext = styler[i--];

                    }
                } else if( isdigit(ch) ) {
                    // signals the start of a number
                    bufferCount = 0;
                    buffer[bufferCount++] = ch;
                    //styler.ColourTo(i,SCE_TS_NUMBER);
                    state = SCE_TS_NUMBER;
                } else {
                    // style it the default style..
                    styler.ColourTo(i,SCE_TS_DEFAULT);
                }
                break;

            case SCE_TS_COMMENT:
                // if we find a newline here,
                // we simply go to default state
                // else continue to work on it...
                if( ch == '\n' || ch == '\r' ) {
                    state = SCE_TS_DEFAULT;
                } else {
                    styler.ColourTo(i,SCE_TS_COMMENT);
                }
                break;

            case SCE_TS_NUMBER:
                // stay in TS_NUMBER state until we find a non-numeric
                if( isdigit(ch) || ch == '.') {
                    buffer[bufferCount++] = ch;
                } else {
                    state = SCE_TS_DEFAULT;
                    buffer[bufferCount] = '\0';

                    // Colourize here...
                    if( strchr(buffer,'.') ) {
                        // it is an IP address...
                        styler.ColourTo(i-1,SCE_TS_IP);
                    } else {
                        // normal number
                        styler.ColourTo(i-1,SCE_TS_NUMBER);
                    }

                    // push back a character
                    chNext = styler[i--];
                }
                break;
        }
    }
    delete []buffer;
}

static const char * const tsWordListDesc[] = {
    "Keywords",
    "Tlo",
    "Objects",
    "Stdwrap",
    "ImgResource",
    "ImageLinkWrap",
    "TextStyle",
    "EncapseLines",
    "Filelink",
    "Conditionkeywords",
    0
};

LexerModule lmTS(SCLEX_TS, ColouriseTSDoc, "TS", 0, tsWordListDesc);


Следуя рецомендациям здесь: http://scintilla.sourceforge.net/SciTELexer.html прописал лексер везде где надо, создал для него typoscript.properties и подключил в SciTEGlobal.properties соответсвующий фильтр, language menu и тд ... а включаешь... не работает. Бьюсь над этой темой уже больше недели, чего только не перепробовал, какие только лексеры не пробовал клонировать и корректировать...

Может кто посмотрит и посоветует где копать?
Автор: chupakabra
Дата сообщения: 23.08.2007 14:37
brack
Выложи изменения в Scintilla.iface и ts.properties, попробую помочь. И тестовый файл на typoscript.
Автор: brack
Дата сообщения: 23.08.2007 15:45
Вот мой typoscript.properties (заметьте - не ts.properties или это имеет значение?) файл:

Код:
file.patterns.TS=*.TS;*.ts
filter.TS=TypoScript|$(file.patterns.TS)|
lexer.$(file.patterns.TS)=TS
# for future implemention...
#api.$(file.patterns.TS)=TS.api

# keywords
keywords.$(file.patterns.TS)=\
typeNum \
admPanel \
index_enable \
index_externals \
doctype \
xhtml_cleaning \
inlineStyle2TempFile \
spamProtectEmailAddresses \
spamProtectEmailAddresses_atSubst \
simulateStaticDocuments \
simulateStaticDocuments_noTypeIfNoTitle \
table \
select \
pidInList \
uidInList \
userFunc \
value \
template \
file \
workOnSubpart \
marks \
subparts \
headerData

#tlo
keywords2.$(file.patterns.TS)=\
PAGE \
CONFIG \
CONSTANTS \
FE_DATA \
FE_TABLE \
FRAMESET \
FRAME \
META \
COA \
COA_INT \
COBJ_ARRAY \
CARRAY \
CONTENT \
TEXT \
HTML \
FILE \
IMAGE \
IMG_RESOURCE \
CLEARGIF \
RECORDS \
CTABLE \
OTABLE \
COLUMNS \
HRULER \
IMGTEXT \
CASE \
LOAD_REGISTER \
RESTORE_REGISTER \
FORM \
SEARCHRESULT \
USER \
USER_INT \
PHP_SCRIPT \
PHP_SCRIPT_INT \
PHP_SCRIPT_EXT \
TEMPLATE \
MULTIMEDIA \
EDITPANEL \
GIFBUILDER \
HMENU \
GMENU \
GMENU_LAYERS \
GMENU_FOLDOUT \
TMENU \
TMENU_LAYERS \
IMGMENU \
JSMENU \
_LOCAL_LANG \
_CSS_DEFAULT_STYLE \
_DEFAULT_PI_VARS

#objects
keywords3.$(file.patterns.TS)=\
lib \
config \
plugin \
styles \
content \
get \
getLeft \
getRight \
getBorder \
NO \
RO \
ACT \
NOSUB

#stdwrap
keywords4.$(file.patterns.TS)=\
setContentToCurrent \
setCurrent \
lang \
parseFunc \
data \
field \
current \
cObject \
numRows \
filelist \
preUserFunc \
override \
preIfEmptyListNum \
ifEmpty \
listNum \
trim \
required \
if \
fieldRequired \
csConf \
HTMLparser \
prioriCalc \
char \
intval \
date \
strftime \
age \
case \
bytes \
substring \
removeBadHTML \
stripHtml \
crop \
rawUrlEncode \
htmlSpecialChars \
doubleBrTag \
br \
brTag \
encapsLines \
keywords \
innerWrap \
innerWrap2 \
fontTag \
addParams \
textStyle \
filelink \
preCObject \
postCObject \
wrapAlign \
spaceBefore \
spaceAfter \
space \
noTrimWrap \
wrap2 \
dataWrap \
prepend \
append \
wrap3 \
outerWrap \
insertData \
offsetWrap \
postUserFunc \
prefixComment \
editIcons \
editPanel \
debug \
debugFunc \
debugData \
stdWrap \
allWrap \
wrap \
parseFunc \
tags \
link \
typolink \
stdheader \
target \
split \
typolist

#imgResource
keywords5.$(file.patterns.TS)=\
ext \
width \
height \
params \
sample \
alternativeTempPath \
frame \
import \
maxW \
maxH \
minW \
minH \
m.mask \
m.bgImg \
m.bottomImg \
m.bottomImg_mask

#imageLinkWrap
keywords6.$(file.patterns.TS)=\
width \
height \
effects \
sample \
alternativeTempPath \
title \
bodyTag \
wrap \
target \
JSwindow \
JSwindow.expand \
JSwindow.newWindow \
JSwindow.altUrl \
typolink \
enable

#textStyle
keywords7.$(file.patterns.TS)=\
align.field \
face.field \
face.default \
size.field \
size.default \
color.field \
color.default \
color \
properties.field \
properties.default \
altWrap

#encapseLines
keywords8.$(file.patterns.TS)=\
encapsTagList \
remap.Tag \
addAttributes \
removeWrapping \
wrapNonWrappedLines \
innerStdWrap_all \
defaultAlign \
encapsLinesStdWrap \
nonWrappedTag

#filelink
keywords9.$(file.patterns.TS)=\
path \
icon \
icon_image_ext_list \
iconCObject \
icon_link \
labelStdWrap \
wrap \
ATagBeforeWrap \
file \
size \
jumpurl \
target \
stdWrap \
ATagParams \
removePrependedNumbers \
altText \
titleText \
longdescURL

#conditionkeywords
keywords10.$(file.patterns.TS)=\
end \
else \
global \
browser \
version \
system \
device \
useragent \
language \
IP \
hostname \
hour \
minute \
dayofweek \
dayofmonth \
month \
usergroup \
loginUser \
treeLevel \
PIDinRootline \
PIDupinRootline \
globalVar \
globalString \
userFunc

# whitespace (SCE_TS_DEFAULT)
style.TS.0=fore:#808080,$(font.base)
# comments (SCE_TS_COMMENT)
style.TS.1=
# number (SCE_TS_NUMBER)
style.TS.2=
# ip number (SCE_TS_IP)
style.TS.3=
# keywords (SCE_TS_KEYWORDS)
style.TS.4=
# TLO (SCE_TS_TLO)
style.TS.5=
# objects (SCE_TS_OBJECTS)
style.TS.6=
# stdwrap (SCE_TS_STDWRAP)
style.TS.7=
# imgResors (SCE_TS_IMGRESOURCE)
style.TS.8=
# imageLinkWrap (SCE_TS_IMAGELINKWRAP)
style.TS.9=
# textStyle (SCE_TS_TEXTSTYLE)
style.TS.10=
# encapseLines (SCE_TS_ENCAPSELINES)
style.TS.11=
# fileLink (SCE_TS_FILELINK)
style.TS.12=
# conditionKeyWords (SCE_TS_CONDITIONKEYWORDS)
style.TS.13=
Автор: chupakabra
Дата сообщения: 23.08.2007 17:10

Цитата:
прога закрывается с ошибкой "Segmentation fault (core dumped)"

Это происходит из-за того, что у тебя определено (и твой лексер ожидает) 10 списков ключевых слов, тогда как максимум загружается 9 (это значение жестко ограничено константой KEYWORDSET_MAX).

P.S. Используй тег more когда постишь большие куски текста, иначе читать топик тяжело становится.

Добавлено:
brack, в общем, твой лексер подключается как надо, с этим все в порядке. Поменяй значение KEYWORDSET_MAX в Scintilla.iface на 9 чтобы использовать 10 списков ключевых слов. Правда мне так и не удалось раскрасить тестовый файл, лексер подвешивает SciTE, но это просто ошибка алгоритма в твоем коде, дело поправимое.
Автор: brack
Дата сообщения: 23.08.2007 23:59
вот и я о том же, сейчас опять бился над кодом но... файл раскрасить пока не удалось. после изменения KEYWORDSET_MAX на 9 ошибда исчезла но результат остался неизменным так что возвращаюсь к первой части моего первого послания ... включаешь не работает ... Чтото в моем коде на так, не в синтаксе а скорее в алгоритме chupakabra прав.

по поводу команды more прошу прощения не ведал.
Автор: brack
Дата сообщения: 24.08.2007 16:40
У меня тоже подвешивается, кто нидь поможет?
Автор: chupakabra
Дата сообщения: 24.08.2007 19:48
brack
Пара наблюдений: у тебя бесконечный цикл, for() увеличивает i на единицу, строчка chNext = styler[i--] - уменьшает, соответственно цикл крутится бесконечно. И еще, если ispunct(ch) вернул истину, то нет смысла вызывать isalnum(ch), который заведомо вернет ложь.
А вообще рекомендую научиться пользоваться отладчиком.
Автор: brack
Дата сообщения: 24.08.2007 23:03
По поводу isalnum(ch) согласен, но ведь chNext = styler[i--] вставлен в циклы многих лексеров (LexConf.cxx, LexInno.cxx и тд) и там этот отход на символ, работает.
Автор: Bonart
Дата сообщения: 30.08.2007 09:49
Не подскажете наиболее подходящий лексер для раскраски кода Haskell?
Хочу сделать файл для подсветки его синтаксиса.
Особенность - фолдинг как по отступам, так и по {}
Попытался взять за основу файл подсветки OCAML, но соответствующий лексер в текущую версию еще не встроен
Автор: 8AleX8
Дата сообщения: 30.08.2007 10:27
Bonart

Цитата:
Не подскажете наиболее подходящий лексер для раскраски кода Haskell?

http://www4.in.tum.de/~haftmann/resources/haskell.properties
Автор: Bonart
Дата сообщения: 30.08.2007 13:00
8AleX8
Спасибо!
Будет исходным материалом - ибо фолдинга нет.
Автор: sv75
Дата сообщения: 31.08.2007 23:43
Есть желание использовать SciTE для эпизодического набивания текстов в Latex. Хотелось бы знать, может ли работать autocompletion с русскими словами (UTF) и что для этого надо сделать. У меня штатные сборки из Убунты и Дебиана, там не пашет.
Автор: euheny
Дата сообщения: 02.09.2007 07:52
Можно ли выделять вертикальные блоки текста ?
Есть ли проблемы с русскими кодировками ?
Автор: juvaforza
Дата сообщения: 02.09.2007 12:32
euheny
Выделять можно. Проблем с русскими кодировками быть не должно.
Автор: alexeyr222
Дата сообщения: 03.09.2007 17:52
Здравствуйте!
1) Как научить Scite компилировать Erlang файлы? Есть ли какие-то скрипты, улучшающие работу с Erlang?
2) В какой директории Scite ищет SciteUser.properties -- в $HOME или в $HOMEDRIVE/$HOMEPATH?
Автор: mozers
Дата сообщения: 05.09.2007 21:54
alexeyr222
1) SciTE сам ничего не компилирует, просто на соответствующие клавиши вешается вызов внешнего компилятора (см. описание ключей command.compile, command.build, command.go)
Скрипты для такого экзотического языка надо писать самому или подстраивать существующие.
SciTE - самый настраиваемый в мире редактор, только настраивать его придется самому
2) Оригинальный SciTE - в %USERPROFILE%. SciTE-Ru - в каталоге, определенном ключом scite.userhome
Автор: alexeyr222
Дата сообщения: 05.09.2007 23:06

Цитата:
Скрипты для такого экзотического языка надо писать самому или подстраивать существующие.

Написал следующее, вроде работает:
command.compile.$(file.patterns.erlang)=erlc $(FileName)
command.compile.subsystem.$(file.patterns.erlang)=0
command.go.$(file.patterns.erlang)=erl $(FileName)
command.go.subsystem.$(file.patterns.erlang)=0
command.build.$(file.patterns.erlang)=erl -make $(FileName)
command.build.subsystem.$(file.patterns.erlang)=0

Цитата:
SciTE - самый настраиваемый в мире редактор, только настраивать его придется самому

Ну насчет самого настраиваемого не знаю. Когда на нем будет аналог AUCTeX, Gnus или ERC, можно будет поговорить.

Цитата:
Оригинальный SciTE - в %USERPROFILE%. SciTE-Ru - в каталоге, определенном ключом scite.userhome

Ясно, спасибо.
Автор: sandrey
Дата сообщения: 06.09.2007 07:14
Каждый раз когда запускаю программу выбираю меню "Вид" и убираю галочку "Поле сворачивания блоков текста". Можно ли это делать автоматом?
(Совсем фолдинг я отключать не хочу - я его использую, но мне достаточно горячих клавиш. визуализации не нужно)
Автор: SpoinT
Дата сообщения: 06.09.2007 08:04
sandrey
Что-то несовсем ясно. Если ты не хочешь, чтобы сворачивание при открытии файла было, то убери в настройках соответствующее расширение файлов.
Автор: sandrey
Дата сообщения: 06.09.2007 09:13
Да нет, же.
Вот я открываю файл SciTEGlobal.properties. Все секции ("[Main]", "[Position]" и т.д.) свернуты. Меня это устраивает. Я могу развернуть/свернуть любую секцию нажатием Ctrl+*. Это меня тоже устраивает.
А вот не устраивает меня поле сворачивания блоков текста - слева находится (прямогульнички с плюсиком, минусом там) - я не хочу что бы оно отображалось. Сделать это можно выбрав "Вид", "Поле сворачивания блоков текста". Галочка с этого пункта снимается, поле слева пропадает. Но при новом запуске программы это поле вновь отображается.
Автор: SpoinT
Дата сообщения: 06.09.2007 12:52
sandrey
Значит тебе вообще не нужно показывать это поле? Никогда? Навязывается вопрос, зачем? Хорошая наглядность, что есть текст.
Автор: sandrey
Дата сообщения: 06.09.2007 15:03
Ну раздражают меня эти линии, плюсики, минусы... Фолдингом я иногда пользуюсь. Но мне для этого достаточно горячих клавиш. А свернутые блоки итак видно (без этого поля слева) - горизонтальная линия у свернутого блока идет ведь через всю страницу.

Собственно вся проблема сводится к тому, что я хочу что бы по умолчанию в меню "Вид" галочка "Поле сворачивания блоков текста" была убрана, а программа не позволяет мне задать это умолчание - у нее жестко - если фолдинг включен, то галочка при запуске стоит.
Автор: vladvro
Дата сообщения: 06.09.2007 15:20
sandrey
пропиши в файле настроек:
fold.margin.width=0
Автор: sandrey
Дата сообщения: 06.09.2007 15:32
О! Вот оно! То что нужно.
Спасибо.
Автор: lolafromblackmesa
Дата сообщения: 09.09.2007 11:44
Сборку Mitchell's SciTE Tools пробовал кто нибуть.
Чето лексеры не пашут совсем - подсветки нет и фолдинга. И функции на луа скриптах открываются как файлы а не исполняются.
Автор: mozers
Дата сообщения: 09.09.2007 23:01
lolafromblackmesa
Пробовал. Подсветка и фолдинг пашут.
Цитата:
функции на луа скриптах открываются как файлы а не исполняются
Судя по коду, так и задумано автором. Зачем? Х.з.
Автор: HeatSink
Дата сообщения: 11.09.2007 12:12
Проблема с глобальными настройками в русской сборке.

Пользуюсь SciTE уже очень давно. И файл глобальных настроек переносил от версии к версии, так что работал всё время как в одном редакторе.

Решил попробовать русскую сборку…

Удалил старый SciTE, поставил новый. Всё вроде бы работает, но отказываются работать некоторые функции в глобальных настройках!

Например, вообще не работают user.shortcuts:

Код: user.shortcuts=\
Ctrl+PageUp|IDM_PREVFILE|\
Ctrl+PageDown|IDM_NEXTFILE|\
Ctrl+Alt+V|IDM_PASTEANDDOWN|\
Ctrl+F12|IDM_WRAP|\
Ctrl+Shift+KeypadMultiply|IDM_TOGGLE_FOLDALL|\
Alt+R|IDM_READONLY|\
Alt+X|IDM_QUIT|\
Alt+F4|IDM_QUIT|\
Ctrl+J|IDM_DUPLICATE|\
Ctrl+Shift+PageUp|IDM_MOVETABLEFT|\
Ctrl+Shift+PageDown|IDM_MOVETABRIGHT|\
$(ADDITIONAL_SHORTCUTS)
Автор: mozers
Дата сообщения: 11.09.2007 20:28
HeatSink
Цитата:
вообще не работают user.shortcuts
Такое впечатление что настройки твоего SciTEUser.properties перекрывают глобальные настройки.
Посмотри параметр user.shortcuts в пользовательском файле настроек.

Цитата:
Снимаю/ставлю галку в меню — колонка пропадает/появляется, но эта опция автоматически не сохраняется (в настройках пользователя), хотя другие опции сохраняются (положение окна, например).
Положение окна сохраняется благодаря доработке ядра программы. Все остальные параметры сохраняются с помощью скрипта save_settings.lua, который может быть запущен либо через меню Tools - "• Сохранить текущие установки SciTE" либо при выходе из SciTE через меню или по шорткату. При закрытии SciTE по крестику в углу скрипт не срабатывает!.
Автор: HeatSink
Дата сообщения: 12.09.2007 09:34
mozers

Цитата:
вообще не работают user.shortcuts
Такое впечатление что настройки твоего SciTEUser.properties перекрывают глобальные настройки.
Посмотри параметр user.shortcuts в пользовательском файле настроек.

Этот пункт я отмёл. В пользовательском файле настроек эта информация не перекрывается. Мало того, я его даже подчищал ручками, чтобы совсем ничего не перекрыть — не помогло.

Странное дело, но на домашнем компьютере alt+X работает со всеми вытекающими…
Может быть эта программа что-то сохраняет в реестре? Или ещё где-то? (Поиск в реестре по scite дал результат только для команды "редактировать" в шеле.)

Одно отличие, которое может натолкнуть знатоков на мысль. На домашнем компе я поставил русскую сборку в другую директорию (…files/SciTE), а предыдущие версии ставились (копировались) в …files/WSciTE. На рабочем же компе я установил русскую сборку в ту же самую директорию, предварительно вычистив (полностью, вручную) из неё предыдущую версию программы.

Что только не пробовал. Ну не хочет работать и всё тут!
Автор: mozers
Дата сообщения: 12.09.2007 21:18
HeatSink
Лично у меня - ни одной путной мысли.
Удали из каталога SciTE ВСЕ файлы, кроме SciTE.exe и SciLexer.dll
Запусти SciTE.exe, в меню "Options" выбери "Open Global Options file" (или User Options) и убедившись что они девственно пустые, внеси туда ключ
Код: user.shortcuts=Alt+X|IDM_QUIT|

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869

Предыдущая тема: LeechGet


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.