Здесь описывается структура файлов, с которой работает MyTetra. При разработке MyTetra используется два понятия:
- Рабочая директория
- Директория хранения данных
Рабоча директория служит для хранения конфигов программы. Директория хранения данных используется для создания в ней необходимых файлов и подкаталогов, в которых хранится база пользовательских данных.
Директория хранения данных может быть создана как поддиректория в рабочей директории. А может находиться в любом другом месте диска.
Данные в рабочей директории
MyTetra способна работать в режиме установленной программы, и в режиме переносимого приложения. Для того, чтобы обеспечить такую работу, MyTetra последовательно ищет основной файл конфигурации conf.ini в следующих директориях:
- Сначала просматривается директория, в которой запущен бинарник программы;
- Затем просматривается директория ~/.mytetra;
- Затем просматривается директория ~/.config/mytetra.
Как только файл conf.ini найден, директория с эти файлом объявляется рабочей директорией. Рабочую директорию не следует путать с директорией хранения данных - это разные вещи (см. далее).
Если файл conf.ini нигде не обнаружен, например при первом старте программы, MyTetra выведет диалог настройки. В нем нужно указать, в каком режиме следует использовать MyTetra. В режиме Standart MyTetra создаст каталог ~/.config/mytetra, и разместит в нем все нужные для работы файлы и подкаталоги. В режиме Portable MyTetra создаст нужные файлы и подкаталоги в текущей директории запуска.
В рабочей директории могут находиться следующие файлы и каталоги:
- data (директория хранения данных)
- trash (директория корзины)
- conf.ini (файл настроек MyTetra)
- editorconf.ini (файл настроек встроенного редактора WyEdit)
В conf.ini прописаны пути к директории хранения данных (опция tetradir) и к директории корзины (опция trashdir). В них прописываются пути к каталогам data и trash. Таким образом, каталог данных data и каталог корзины trash могут располагаться не в рабочей директории, а где-то в другом месте.
Директория хранения данных
Как написано выше, директория хранения данных называется data. В ней должны находиться следующие файлы и каталоги:
- base (директория хранения записей MyTetra)
- database.ini (файл настроек)
- mytetra.xml (файл дерева данных)
Каждая запись имеет свой каталог в каталоге base. Название каталога с записью должно быть уникально. Чтобы обеспечить уникальность имени, оно составляется из двух частей. Первая часть - метка времени UNIX, вторая часть - строка из 10 случайных символов [a-z][0-9]. Пример названий каталогов с записями:
13162072315qhj03np5x
1316292619wem18cgx16
1316296905kgzm28pkg6
Такой принцип именования позволяет с одной стороны видеть, в какой последовательности создавались директории записей, а с другой стороны гарантирует вероятность коллизий не более 10-15 в секунду.
Директория хранения записи
Каждая запись MyTetra хранится в отдельном каталоге. Эти каталоги расположены в директории хранения данных base.
В директории хранения записи обязательно располагается как минимум один html-файл. По-умолчанию он называется index.html. В нем хранится текст записи в формате HTML.
Помимо html-файла, в каталоге хранения записи лежат файлы картинок, используемые в тексте записи. Все файлы картинок хранятся в формате *.png. Это обеспечивает хранение изображений без потери качества и лицензионную чистоту.
Внимание! MyTetra всегда следит, чтобы в директории хранения записи был порядок. А это значит, что любые файлы, не принадлежащие в данный момент к записи, будут удалены в корзину.
Файл дерева mytetra.xml
В директории хранения данных data расположен самый главный файл mytetra.xml. Он отвечает за древовидное представление накопленной информации, в нем хранятся названия записей и веток, текстовые метки и прочая информация.
Основной корневой элемент - элемент <root>. В нем раположены два элемента: <format> и <content>.
Элемент <format> имеет следующие атрибуты:
<format version="1" subversion="1"/>
Атрибут version - основной номер версии формата хранения, атрибут subversion - минорный номер версии.
Формат хранения v.1.1
Элемент <content> содержит в себе элементы <node>, организованные в древовидную структуру. Это и есть дерево веток, которое присутствует в интерфейсе MyTetra.
Элемент <node> содержит два атрибута:
- id - униканый идентификатор ветки;
- name - имя ветки.
Внутри элемента <node> может быть расположен элемент <recordtable>. Это таблица конечных записей. В интерфейсе MyTetra она расположена справа вверху.
Таблица конечных записей <recordtable> содержит в себе список элементов <record>. Каждый элемент <record> - это отдельная запись в MyTetra. Элемент <record> имеет следующие атрибуты:
- id - униканый идентификатор ветки;
- dir - имя каталога, в котором хранится запись. Имя задается отностельно директории хранения данных data;
- file - имя файла с текстом записи, обычно index.html;
- name - название записи;
- author - имя автора;
- url - интернет-ссылка, сопровождающая запись;
- tags - текстовые метки записи (теги);
- ctime - время создания записи в формате ГГГГММДДЧЧММСС;
- crypt - наличие шифрования в записи. 0 - шифрования нет, 1 - запись зашифрована.
Пример узла <node>:
<node id="4" name="Язык C">
<recordtable>
<record id="1310729762n6n3rd7o9v"
dir="1310729762ner9v1twxy"
name="Определение разрядности платформы 32 или 64 бит"
file="text.html"
crypt="0"
url=""
tags="c, c++"
author=""
ctime="20110715153602"/>
<record id="1315337597vhtll8dj9f"
dir="1315337597bz9a5a2f3e"
name="Функции getuid() и geteuid()"
file="text.html"
crypt="0"
url=""
tags="linux, SUID"
author=""
ctime="20110906233317"/>
</recordtable>
</node>
Формат хранения v.1.2
Формат хранения данных версии 1.2 содержит в себе все элементы версии 1.1, но в нем так же добавлена возможность хранения прикрепленных к записи файлов.
Для хранения таблицы прикрепленных файлов, внутри тега <record> добавляется тег <files>:
<record id="1625161331h9eqae5uzq"
name="Математика" ... >
<files>
<file id="1625169549qpp29u71rj"
fileName="sincos.gif"
type="file"/>
<file id="1625172135ejxsvy7lhq"
fileName="Графики функций.jpg"
type="file"/>
</files>
</record>
Внутри тега <files> размещаются теги <file>, которые описывают прикрепляемые файлы. Сами файлы хранятся в директории записи, и имеют уникальные имена. Имя файла на диске (так называемое техническое имя файла) состоит из значения атрибута id и расширения, взятого из атрибута fileName. Таким образом достигается платформонезависимость имени файла на диске (если расширение не написано национальными символами). Если расширения в строке fileName нет, то и имя файла на диске будет состоять только из id, без расширения. В интерфейсе MyTetra файл отображается под именем, указанным в атрибуте fileName.
Техническое имя файла, состоящее из id+расширение, необходимо во-первых, для обеспечения кросс-платформенности и независимости от национальной кодировки в файловой системе, и во-второых для возможности быстрого открытия файла средствами операционной системы прямо в директории записи без дополнительного копирования под именем fileName, так как операционная система автоматически выберет нужную программу просмотра по расширению.
При сохранении прикрепленного файла через пункт "Сохранить как..." в контекстном меню, MyTetra предложит сохранение под именем из атрибута fileName. Таким образом, для пользователя, файл в интерфейсе MyTetra всегда выглядит как файл с именем fileName.
Атрибут type может принимать два значения: file и link. Если type="file", то тег <file> описывает прикрепленный файл. Если type="link", то тег <file> описывает ссылку на файл. В этом случе в теге <file> должен дополнительно присутствовать атрибут link, в котором прописывается полная ссылка на файл:
<file id="1625169549qpp29u71rj"
fileName="actualDocumentation.pdf"
type="link"
link="http://site.org/docs/actualDocumentation.pdf" />
Если тип файла выставлен как link, то файл нигде в каталоге данных MyTetra не хранится. Хранится только тег <file> с описанием местонахождения файла в атрибуте link.
Смена версий формата данных
Формат хранения данных может претерпевать изменения, и каждый новый релиз MyTetra имеет встроенные средства по конвертированию данных из предыдущего формата в более новый. Данное конвертирование происходит после уведомления пользователя, без потерь информации.