10 января 2014

Подготовка кода к публикации в блоге

Вступление

Опубликовать некоторый код в красивом и форматированном виде можно несколькими способами. Я остановился на SyntaxHighlighter, так как он очень легко встраивается на платформу Blogger. Но описание установки здесь приводится не будет.
При использовании SyntaxHighlighter я столкнулся с одной проблемой. При написании кода я пользуюсь символами табуляции, в то время как при переносе кода на Blogger,  ширина табуляции "уезжает". Было решено написать простенькую утилиту, которая просматривает весь код и заменяет символы '\t' на необходимое количество знаков пробела (от 1 до 4) в зависимости от текущего положения каретки. В качестве бонуса я добавил автоматическую подготовку кода для встраивания в статью. А именно замена знаков '"', '<' и '>' на соответствующие наборы строк, необходимые для корректной вставки в скрипт. Плюсом идет добавление тега <pre> вместе с параметрами. Схожую функцию выполняет простенькое веб-приложение, но я предпочел иметь "все в одном".

Код очень простой, написан на C++. Программа последовательно считывает символы из файла in.txt, обрабатывает их и записывает результат в файл out.txt.
#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;

int main() {
    int current_pos = 0;                                // Текущая позиция в строке
    int quotient = 0;                                   // Частное от деления на ширину табуляции
    char read_char;                                     // Прочитанный символ
    ofstream out_file("out.txt", ios::out);             // Файл для записи
    ifstream in_file("in.txt", ios::in);                // Файл для чтения

    if (!out_file) {
        cout << "Can't open/create file 'out.txt'";
    }
    if (!out_file) {
        cout << "Can't open file 'in.txt'";
    }

    out_file << "<pre class=\"brush: cpp\">";

    in_file.read(&read_char, sizeof(char));
    while (in_file && !in_file.eof()) {
        switch (read_char) {
        case '\t':
            quotient = current_pos % 4;
            for (int i = 0; i < 4 - quotient; ++i) {
                out_file << ' ';
                current_pos++;
            }
            break;
        case '"':
            out_file << """;
            current_pos++;
            break;
        case '<':
            out_file << "<";
            current_pos++;
            break;
        case '>':
            out_file << ">";
            current_pos++;
            break;
        case '\n':
            current_pos = 0;
            out_file << read_char;
            break;
        default:
            current_pos++;
            out_file << read_char;
            break;
        }
        in_file.read(&read_char, sizeof(char));
    }
    out_file << "</pre>";

    cout << "File 'out.txt was updeted.\n";
    system("pause");

    return 0;
}
Скачать код и исполнительный файл можно отсюда.

Комментариев нет:

Отправить комментарий