Программка Russian Text Convertor

2004-12-09 at 04:37 | Posted in uncategorized | Leave a comment

Сегодня мне не спится. Решил начать читать книжку Станислава Лема «Фиаско». А после этого попил чайка с лимоном и написал утилитку.

Вот небольшая программка, полезная при скачивании и чтении книжек с Lib.ru и других похожих сайтов. Она заменяет компьютерные символы на принятые в типографской традиции. Остальные пояснения — в подробных комментариях. Пользуйтесь на здоровье, пишите отзывы :)

Файл RussianTextConvertor.js

/*
 * Russian Text Convertor v.0.1
 * Copyright (С) 2004 Anrie Nord <http://www.livejournal.com/users/anrienord/>
 * 2004-12-09
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 */

/**
 * Конвертор символов в строке в соответствии с русскими типографскими
 * традициями. Переводит используемые при наборе на компе символы и
 * последовательности в традиционные.
 *
 * Набор поддерживаемых правил:
 *
 * - замена кавычек в виде знаков дюйма (") на «ёлочки» (как в этом слове);
 * - замена знака минуса-дефиса (-) на длинное тире (—);
 * - замена трёх точек (...) многоточием (…).
 *
 * Вариант запуска под Microsoft Windows Script Host:
 *
 * $ cscript //nologo RussianTextConvertor.js < RussianTextConvertor.js
 *
 * Тест возможностей:
 *
 * Запустите программу, передав ей на вход собсвенный исходник и посмотрите на
 * вывод следующего фрагмента:
 *
 * ...
 * А после
 * ходит тревожный,
 * но спокойный наружно.
 * Говорит кому-то:
 * "Ведь теперь тебе ничего?
 * Не страшно?
 * Да?!"
 * Послушайте!
 * Ведь если звёзды
 * зажигают -
 * значит - это кому-нибудь нужно?
 * Значит - это необходимо,
 * чтобы каждый вечер
 * над крышами
 * загоралось хот одна звезда?!
 *
 * /Вл. Маяковский, "Послушайте!", 1914/
 */
var convertor = {
    str : null,

    /**
     * Заменяет дюймовые кавычки на ёлочки.
     */
    replaceBrackets : function() {
        this.str = this.str.replace( /"([,. \?;\)!:])/g, "»$1" );
        this.str = this.str.replace( /"$/g, "»" );
        this.str = this.str.replace( /^"/g, "«" );
        this.str = this.str.replace( /([\( ])"/g, "$1«" );
    },

    /**
     * Заменяет минус-дефис на длинное тире.
     */
    replaceEmDash : function() {
        this.str = this.str.replace( / - /g, " — " );
        this.str = this.str.replace( / -$/g, " —" );
    },

    /**
     * Заменяет три точки многоточием.
     */
    replaceHorizontalEllipsis : function() {
        this.str = this.str.replace( /\.\.\./g, "…" );
    },

    /**
     * Преобразует строку, заканчивающуюся символом '\n', в вид,
     * соответствующий русским типографским традициям.
     *
     * @param str строка для преобразования.
     * @return преобразованная строка.
     */
    convert : function( str ) {
        this.str = str;
        this.replaceBrackets();
        this.replaceEmDash();
        this.replaceHorizontalEllipsis();
        return this.str;
    }
};

/**
 * Отвечает за консольный ввод-вывод. Использует особенности Microsoft Windows
 * Script Host. Переопределите его методы, чтобы перенести сценарий под ваш
 * интерпретатор.
 */
var io = {
    /** Стандартный поток ввода Microsoft Windows Script Host. */
    stdin : WScript.StdIn,

    /** Поток поток вывода Microsoft Windows Script Host. */
    stdout : WScript.StdOut,

    /**
     * Читает строку со стандартного ввода.
     *
     * @return прочитанная строка.
     */
    readln : function() {
        return this.stdin.ReadLine();
    },

    /**
     * Записывает строку в стандартный вывод.
     *
     * @param str строка для записи.
     */
    writeln : function( str ) {
        this.stdout.WriteLine( str );
    },

    /**
     * Проверяет, обнаружен ли конец стандартного ввода.
     *
     * @return true, если обнаружен конец стандартного ввода.
     */
    eof : function() {
        return this.stdin.AtEndOfStream;
    }
};

/**
 * Точка входа в программу, почти :)
 */

while ( !io.eof() ) {
    var str = io.readln();
    str = convertor.convert( str );
    io.writeln( str );
}

Кстати, сейчас слушаю классный фанк конца 70-х — начала 80-х годов :) Запись радиопередачи. Не осталось среди нас любителей фанка?

Leave a Comment »

RSS feed for comments on this post. TrackBack URI

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Blog at WordPress.com.
Entries and comments feeds.

%d bloggers like this: