Вступление
Опубликовать некоторый код в красивом и форматированном виде можно несколькими способами. Я остановился на 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; }
Скачать код и исполнительный файл можно отсюда.
Комментариев нет:
Отправить комментарий