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