Прототип Юбера Алекса : другие произведения.

"Ускоритель" Хтмла

Самиздат: [Регистрация] [Найти] [Рейтинги] [Обсуждения] [Новинки] [Обзоры] [Помощь|Техвопросы]
Ссылки:
Школа кожевенного мастерства: сумки, ремни своими руками
 Ваша оценка:
  • Аннотация:
    В помощь наивным Сишным Хтмльщикам: "автомагические" опусы за 5 минут.


' makehtml2: Заливалка текста в ХТМЛ (с) 2004 Alex 'LabRat' Lobanov


' BEWARE! ACHTUNG! АЛАРМА! прога (далее SUBJ) не самая оптимальная и безопасная,
' но простая (делалась методами Copy-Paste & Mind Storm & Brute Force)
' в частности, исходя из принципов брутального программирования, похерены все
' проверки входных данных и действий пользователя -
' меня просто задрало в очередной раз ручками заполнять ХТМЛ-ную болванку
' и расставлять бесконечные <br>, <p>, etc


' ***************************** Раздел отмазок ***************************


' Полный "AS IS", НИКАКИЕ ПРЕТЕНЗИИ, В СЛУЧАЕ ИСПОЛЬЗОВАНИЯ SUBJ,
' (потеря данных, повреждения "железа" и нервные срывы при попытке
' самостоятельно пофиксить кривое рег. выражение) НЕ ПРИНИМАЮТСЯ!
' Со своей стороны автор не требует никаких лицензионных и иных отчислений,
' допускает "хранение в памяти ЭВМ-загрузку-исполнение-трассировку" SUBJ,
' и прочую шнягу, за которую честных хакеров и простых юзеров теперь
' преследуют, типа копирования, модификациий и расширений (последние можно
' только приветствовать). Пользовайтесь, почем зря... И не говорите потом,
' что LabRat вас не предупреждал: это кривая прога ;)


' *************************************************************************


' Известные (задуманные мной) фишки:


' - полуавтоматическая сборка опуса в публикабельный формат
' - автоматическое реферирование "больших опусов", если главы(части) в них
' соответствуют формату "##. <название главы>" (понятно, без кавычек,
' ## - двузначный номер главы. Те, кто может дописаться до трехзначных -
' см. раздел отмазок)


' Известные (мне) баги:


' - отсутствие проверок входных данных (на самом деле так и задумано,
' так что это не баг - это фишка... шутки прогр. юмора)


' Информация для добровольных камикадзе-испытателей:


' - инфу о багах можно оставлять в гостевой данного текста
' - багами считаются только сбои ДАННОЙ ВЕРСИИ скрипта, при соблюдении
' текущих правил заливки, т.е. отладка самостоятельных модификаций - проблемка
' самих... шибко самостоятельных: для меня это факультативный интерес, в части
' улучшений (улучшить можно любую прогу... только неплохо понимать, что делаешь)


' Текущие правила заливки:


' 1. Все абзацы и пустые строки должны содержать концевой символ табуляции
' 1.1 Началом абзаца считается лидирующий пробел в строке


' 2. Вызов скрипта: start makehtml2.vbs <outputname> <f_bignovel>
' 2.1 outputname - имя выходного файла (результат заливки: outputname.html)
' 2.2 f_bignovel - признак деления на главы (для рассказов обычно равен 0)
' Если больше нуля - создается список глав и вставляется,
' как "Содержание" опуса.


' 3. Входные данные:
' В текущем каталоге должны быть следующие файлы (подготавливаются ручками)
' head - файл шапки в ХТМЛе ("титул", сюда будет подставлено название
' и, возможно, инфа об авторе (на СИ не актуально, мной используется
' для ведения единого индекса опусов))
' body - файл с текстом опуса (без названия, готовится... автором опуса ;)
' rear - файл "подвала" в ХТМЛе (подставляется инфа о дате создания документа)
' spec - файл описания ("выходные данные" документа)


' head и rear можно взять готовые или создать самостоятельно,
' "распилив" выходной файл любого html-редактора между тегами
' <body></body>. "Исторически сложилось", что я использую табличную
' разметку. Так что, в качестве болванки удобно использовать
' какую-нибудь ХТМЛ-таблицу (конвертер "Самиздата" сам подставит
' всякие <head>, <title> и <body> - пользовательские он, по-моему,
' просто удаляет).
' Самостоятельным придется подумать, где разместить
' маски выходных данных opus_title, opus_index и opus_date - они
' соответствуют строкам файла spec и автоматически заменяются скриптом
' в выходном файле.


' 4. Файл spec должен содержать три строки
' Название опуса
' Автор (или индексная номенклатура в любой удобной вам нотации)
' Дата создания документа


' Читаем ввод, открываем файлы... скрестив пальцы на удачу ;)

outstr=WScript.Arguments(0)
bignovel=WScript.Arguments(1)
set fso=createobject("scripting.filesystemobject")
set txtdate = fso.opentextfile("spec",1) 
i_title=txtdate.readline
i_index=txtdate.readline
i_date=txtdate.readline
set txtFile2 = fso.opentextfile("body",1) 
set txtFilehead = fso.opentextfile("head",1) 
set txtfilerear = fso.opentextfile("rear",1) 
set txtFile1 = fso.createtextfile(outstr & ".html",1) 


'Если большой опус, реферируем части и/или главы

if bignovel = 1 then
    Dim oReg1
    Set oReg1 = New RegExp        ' Create regular expression.
    oReg1.Global = True           ' All matches
    oReg1.IgnoreCase = True       ' Make case insensitive.

'Создаем промежуточный файл: можно посмотреть, как выглядит
' содержание опуса изнутри

set txtfilecont = fso.createtextfile("contents",8) 

txtfilecont.writeline("<div align=""justify"">Содержание</div>" & cr)
txtfilecont.writeline("<ul>" & cr)
'txtfilecont.writeline("<ol>" & cr) 'Для тех, кому лень ставить номера
line_id=0

' просматриваем тело на предмет заголовков глав

do while txtfile2.atendofstream <> true

  i_line=txtfile2.readline 'читаем строку "тела"
  oReg1.Pattern = "^ [1-90-9].*	" 'Set pattern. (маска поиска)
  oReg1.Global = True          ' All matches    (поиск... по всему телу ;)

 if oreg1.test(i_line) then 'нашли заголовок главы
  line_id=Line_id+1
  i_line = oReg1.Replace(i_line, "<li><a href=""#spec" & line_id & """>" & i_line & "</a></li>")
  txtfilecont.writeline(i_line & cr) 'пишем в contents строчку в ХТМЛе
 end if
loop
' txtfilecont.writeline("</ol>") 'Для тех, кому лень ставить номера
 txtfilecont.writeline("</ul>") '
 txtfilecont.close
 set txtFilecont = fso.opentextfile("contents",1) 
 txtfile2.close
 set txtFile2 = fso.opentextfile("body",1) 
end if

'пишем "титул"

do while txtfilehead.atendofstream <> true
 i_line=txtfilehead.readline 
 MakeHtmlCode i_line,i_title,i_index,i_date,0
 txtfile1.writeline(i_line)
loop
txtfilehead.close

'вставляем оглавление

if bignovel > 0 then
 do while txtfilecont.atendofstream <> true
  i_line = txtfilecont.readline
  txtfile1.writeline(i_line)
 loop
 txtfilecont.close
end if


'пишем тело документа
 
chaps_num=Line_id
line_id =0 
'  WScript.Echo Line_id & " " & chaps_num

do while txtfile2.atendofstream <> true
 i_line=txtfile2.readline 
 MakeHtmlCode i_line,i_title,i_index,i_date,1
 if bignovel > 0 then
 if chaps_num >= Line_id then
   oReg1.Pattern = "^<DD>[1-90-9].*	"          ' Set pattern.
   oReg1.Global = True          ' All matches
 if oreg1.test(i_line) then 
  Line_id=Line_id+1
  i_line = oReg1.Replace(i_line, i_line & "<A NAME=""spec" & Line_id &"""></A>")
  WScript.Echo Line_id
 end if
 end if
 end if
 txtfile1.writeline(i_line)
loop 
txtfile2.close

' пишем "подвал"

do while txtfilerear.atendofstream <> true
 i_line=txtfilerear.readline 
 MakeHtmlCode i_line,i_title,i_index,i_date,0
 txtfile1.writeline(i_line)
loop
txtfilerear.close

txtfile1.close




Sub MakeHTMLCode(txt, op_title, op_index, op_date, flag)

' Самая важная рутинка: проставляет теги в тексте опуса
' За основу взят пример из справки по использованию рег. выражений VBS
' с помощью Windows Scripting Host (плюс страничка юнихового хелпа regex(7))

    Dim oReg
    Set oReg = New RegExp        ' Create regular expression.
    oReg.Global = True           ' All matches
    oReg.IgnoreCase = True       ' Make case insensitive.

 if flag = 1  then
    ' Replace all < with &lt;.
    oReg.Pattern = "<"           ' Set pattern.
    txt = oReg.Replace(txt, "&lt;")

    ' Replace all > with "&gt;"
    oReg.Pattern = ">"           ' Set pattern.
    txt = oReg.Replace(txt, "&gt;")
'    end if

        oReg.Pattern = "\?	" 
        oReg.Global = true          
        txt = oReg.Replace(txt, "?<br>")


        oReg.Pattern = "!	" ' Exl+Tab
        oReg.Global = True          ' All matches
        txt = oReg.Replace(txt, "!<br>")

        oReg.Pattern = "\.	" ' Dot+Tab (special symbol)
        oReg.Global = True          ' All matches
        txt = oReg.Replace(txt, ".<br>")

'        oReg.Pattern = "/" ' NOW OMITED, UNUSED (BEWARE)
'        oReg.Global = True          ' All matches
'        txt = oReg.Replace(txt, "<br>")


        oReg.Pattern = "^	"   ' EmptyLn+TAB Set pattern.
        oReg.Global = True          ' All matches
        txt = oReg.Replace(txt, "<p>" & vblf)


        oReg.Pattern = "^ " ' Paragraph FEED Set pattern.
        oReg.Global = True          ' All matches
        txt = oReg.Replace(txt, "<DD>")

 end if

' Проставляем "выходные данные"

 if flag = 0 then
        oReg.Pattern = "opus_title"          ' Set pattern.
        oReg.Global = True          ' All matches
        txt = oReg.Replace(txt, op_title)

        oReg.Pattern = "opus_index"          ' Set pattern.
        oReg.Global = True          ' All matches
        txt = oReg.Replace(txt, op_index)

        oReg.Pattern = "opus_date"          ' Set pattern.
        oReg.Global = True          ' All matches
        txt = oReg.Replace(txt, op_date)
  End If

 if flag = 2 then

' здесь могли быть и ваши расширения ;)
 end if
 
End Sub

 Ваша оценка:

Связаться с программистом сайта.

Новые книги авторов СИ, вышедшие из печати:
О.Болдырева "Крадуш. Чужие души" М.Николаев "Вторжение на Землю"

Как попасть в этoт список

Кожевенное мастерство | Сайт "Художники" | Доска об'явлений "Книги"