Опытным
путем
Суббота, 20.04.2024, 19:37
Приветствую Вас Гость | RSS
 
Главная Каталог статейРегистрацияВход
Меню сайта
Категории раздела
Программирование [0]
Статьи по алгоритмизации, программированию, языкам программирования
Системы разработки [2]
Статьи, посвященные различным средствам разработки.
Обработка текстов [3]
Статьи, посвященные различным текстовым редакторам и приемам обработки текстов
Обработка графики [1]
Статьи, посвященные обработке изображений в различных графических редакторах
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Главная » Статьи » Обработка текстов

Автоматизация разметки.
#!/usr/bin/env ruby
#coding:utf-8
(ARGV!=[])? fnames=ARGV : fnames=$<.readlines.map{|line| line.chomp!.split}.flatten
tag="do begin end rescue break while"
tab="&nbsp;&nbsp;&nbsp;&nbsp;"
fnames.each do |fname|
    begin
        myf = IO.read(fname)
    rescue
        puts "Плохие файлы или их нет!!!"
        break
    end
    res=myf.split("\n").map do |s|
        s.gsub!("<","&lt")
        s.gsub!(">","&gt")
        tag.split.each { |t|
            s.gsub!(t,"<b>"+t+"</b>")
        }
        i=0
        b=""
        while(s[0]=="\t")
            s[0]=""
            b+=tab
        end
        s=b+s
        s+="<br>"
    end.join("\n")
    File.open("html"+fname,"w").puts res
end
Для начала нужно получить имена файлов. Для этого используется список fnames. Именно список, потому что термин массив - на мой взгляд - неудачен, а список - интуитивно понятно что это пронумерованная последовательность данных.
Итак, имена файлов могут попасть или в список ARGV, если они переданы в командной строке. В противном случае они попадают в поток ввода, который обозначается $< в виде списка строк, который читается readlines. После этого обрабатывается каждая строка списка - итератор map.
Итератор одна из интересных особенностей языка Ruby. Он пробегает все значения пречислимого типа, и на каждый шаг выполняет определенное программистом действие. Например, map в данном случае пробегает все строки и для каждой выполняет два действия: удаляет завершающие символы перевода строки и возврата каретки - chomp! и делит строку на список строк относительно пробела - split.  В результате всего этого конвейера получается список строк и других списков. И, наконец, flatten - объединяет все строки в один список.

Переменная tag содержит нужные служебные слова, а переменная tab - размер отступа (4 пробела).

Запускается итератор each для списка файлов. Каждое имя предварительно помещается в переменную fname. Затем IO.read(fname) пытается читать все из файла. В случае исключительной ситуации: нет файла или он плох - выполняется код после rescue. Кстати, между begin и end можно поместить любой подозрительный код и с честью выйти в случае возникновения исключения.

Если все в порядке то читается файл, делится на список строк и запускается известный итератор map. На каждом шаге обрабатывается конкретная строка:
1. символы < и > заменяются на &lt и &gt так принято в html.
2.  интересно работает итератор:
 tag.split.each { |t|
            s.gsub!(t,"<b>"+t+"</b>")
        }
пробегает все термины и если встречается очередной термин в подстроке он заключается в тег <b> - жирный шрифт.
3. символы табуляции заменяются значением переменной tab.

После обработки списка строк он объединяется в одну строку и, в конце концов, записывается в файл.

Пока все. Код можно улучшить. Любые дельные предложения приветствуются.

 
Категория: Обработка текстов | Добавил: jhtulen (24.03.2015)
Просмотров: 177 | Рейтинг: 0.0/0
Всего комментариев: 0
avatar
Вход на сайт
Поиск
Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Copyright MyCorp © 2024
    Конструктор сайтов - uCoz