diff --git a/Redaction/Clean.xba b/Redaction/Clean.xba index 71865b4..cff21ec 100644 --- a/Redaction/Clean.xba +++ b/Redaction/Clean.xba @@ -1,6 +1,6 @@ -Sub mark87 +Sub mark96 End Sub @@ -50,6 +50,7 @@ Private Sub makerUpMenu advancedCleaningDialog.getControl("convertFontsToCharStyles").Label = getTranslation("advancedMenuconvertFontsToCharStyles") advancedCleaningDialog.getControl("fixBrokenCharBackTransparent").Label = getTranslation("fixBrokenCharBackTransparentMenuItem") advancedCleaningDialog.getControl("removeNotTransparentBackgrounds").Label = getTranslation("removeNotTransparentBackgrounds") + advancedCleaningDialog.getControl("fixDiacriticKerning").Label = getTranslation("fixDiacriticKerning") advancedCleaningDialog.getControl("Cancel").Label = getTranslation("buttonCancel") advancedCleaningDialog.getControl("OK").Label = getTranslation("buttonOK") advancedCleaningDialog.getControl("buttonLoad").Label = getTranslation("buttonLoad") @@ -58,7 +59,7 @@ Private Sub makerUpMenu advancedCleaningDialog.setVisible(true) Select Case advancedCleaningDialog.Execute() Case 1 - cleanAccordingTo(dialog) + cleanAccordingTo(advancedCleaningDialog) Case 0 End Select advancedCleaningDialog.dispose() @@ -164,7 +165,9 @@ Private Sub cleanAccordingTo(dialog As Object) If dialog.getControl("removeNotTransparentBackgrounds").state = 1 Then fixColoredBackgroundInDoc() EndIf - + If dialog.getControl("fixDiacriticKerning").state = 1 Then + fixDiacriticKerning() + EndIf statusIndicator.end() saveAndreload() @@ -203,6 +206,8 @@ Private Sub quietCleaning saveAndreload() statusIndicator = ThisComponent.getCurrentController.statusIndicator unicodeSymbolsConversion + statusIndicator.Start(getTranslation("statusFixingDiacriticCharactersKerning"),100) + fixDiacriticKerning statusIndicator.Start(getTranslation("statusCleaningManualFormatting"),100) cleanFormatting statusIndicator.Start(getTranslation("statusReplaceWhiteBackground"),100) @@ -329,12 +334,18 @@ Private Sub unicodeSymbolsConversion 'Extended latin-1 0080—00FF 'Cyrillic unicode block range \u0400-\u04FF 'Basic Latin \u0020-\u007E - 'Combining diacritical marks 0301 0304 0323 032e 0331 035f + 'Combining diacritical marks 0301 0304 0303 0323 032e 0331 035f + combiningDiacritic_Astra = "\u0301\u0303\u0304\u0308\u0323\u032e\u0331\u0341\u035f" + Dim extendedLatinA_Astra As String + extendedLatinA_Astra = "\u1e15\u1e17\u1e53\u0129\u0169" + ' + ' + ' 'General Punctuation \u2000-\u206f 'Latin Extended A \u0100-\u017f '\u02bb Modifier Letter Turned Comma is in IPH Astra ' unicodeConversionEverywhere("[\u0020-\u007F]+",RAtts) - unicodeConversionEverywhere("[\u0020-\u007f\u0080-\u00ff\u0400-\u04ff\u2000-\u206f\u2100-\u214f\u0301\u0304\u0323\u032e\u0331\u0341\u035f\u02bb\u0100-\u017f]+",RAtts) + unicodeConversionEverywhere("[\u0020-\u007f\u0080-\u00ff\u0400-\u04ff\u2000-\u206f\u2100-\u214f\u02bb\u0100-\u017f" & combiningDiacritic_Astra & extendedLatinA_Astra &"]+",RAtts) 'Arabic Scheherazade 'Arabic Presentation Forms-A fb50-fdff 'Arabic Presentation Forms-B fe70-feff @@ -459,15 +470,24 @@ Sub removeAllFields() field = fieldEnum.nextElement() field.dispose() Wend -End sub +End Sub + +Public Const RX_Greek_letters = "\u0388-\u03ce" +Public Const RX_Latin_up_alphabet = "\u0041-\u005a" +Public Const RX_Latin_low_alphabet = "\u0061-\u007a" +Public Const RX_Cyrillic_alphabet = "\u0410-\u044f" +Public Const RX_Comma = "\u002c" +Public Const RX_Digits = "\u0030-\u0039" +Public Const RX_Roman_numbers = "MDCLXVI" +Public Const RX_Letters_Dash = "[" & RX_Latin_up_alphabet & RX_Latin_low_alphabet & RX_Cyrillic_alphabet & RX_Greek_letters & "]" +Public Const RX_Letters = "[" & RX_Latin_up_alphabet & RX_Latin_low_alphabet & RX_Cyrillic_alphabet & RX_Greek_letters & "]" Private Sub fixFrequentMistakes Dim config As Object config = initRedactionConfiguration() Dim NBSP As String Dim space As String - Dim latinPlusCyrillicLettersRegExp As String - latinPlusCyrillicLettersRegExp = "[\u0041-\u005a\u0061-\u007a\u0410-\u044f]" + NBSP = " " space = " " 'Не должно быть символов табуляции @@ -484,19 +504,21 @@ Private Sub fixFrequentMistakes AskAndReplace("[:space:]+(?=[\.,;:?!\)\]\}»¡¿”’])","") 'Не должно быть пробелов после скобок [({ и кавычек «„ AskAndReplace("(?<=[\(\[\{«„])[:space:]","") - 'Между буквами среднее тире должно обрамляться пробелами - AskAndReplace("(?<=" & latinPlusCyrillicLettersRegExp & ")–(?=" & latinPlusCyrillicLettersRegExp & ")",NBSP & "–" & NBSP) - 'Между буквами дефис-минус, цифровое тире и длинное тире заменяется на среднее тире - AskAndReplace("(?<=" & latinPlusCyrillicLettersRegExp & "[:space:])[-‒—−](?=[:space:]" & latinPlusCyrillicLettersRegExp & ")","–") + 'Между буквами среднее или длинное тире должно быть замененено на среднее и обрамлено пробелами + AskAndReplace("(?<=" & RX_Letters_Dash & ")[—–]+(?=.)",NBSP & "–" & NBSP) + AskAndReplace("(?<=.)[—–]+(?=" & RX_Letters_Dash & ")",NBSP & "–" & NBSP) + 'Между буквами дефисы-минусы, цифровые тире, средние тире и длинные тире заменяются на одно среднее тире + AskAndReplace("(?<=" & RX_Letters_Dash & "[:space:])[-‒—−–]+(?=[:space:].)","–") + AskAndReplace("(?<=.[:space:])[-‒—−–]+(?=[:space:]" & RX_Letters_Dash & ")","–") 'Между двумя цифрами и тире не долнжо быть пробелов. А также тире должно быть цифровым. 'Также проверяем, что перед искомым тире нет DOI '''''AskAndReplace("(?<!DOI[0-9. /XVI:-‒–—−-]{1,50})(?<=[:digit:])(?:[:space:])?[-‒–—−](?:[:space:])?(?=[:digit:])","‒") 'Между двумя римскими цифрами и тире между ними не долнжо быть пробелов. А также тире должно быть средним - AskAndReplace("(?<=[MDCLXVI])(?:[:space:])?[-‒–—−](?:[:space:])?(?=[MDCLXVI])","–") + AskAndReplace("(?<=[" & RX_Roman_numbers & "])(?:[:space:])?[-‒–—−]+(?:[:space:])?(?=[" & RX_Roman_numbers & "])","–") 'Между буквой и угловой открывающейся скобкой должен быть пробел - AskAndReplace("(?<=" & latinPlusCyrillicLettersRegExp & ")<(?=…>)",space & "<") + AskAndReplace("(?<=" & RX_Letters & ")<(?=…>)",space & "<") 'Между угловой закрывающейся скобкой и буквой должен быть пробел - AskAndReplace("(?<=<…)>(?=" & latinPlusCyrillicLettersRegExp & ")",">" & space) + AskAndReplace("(?<=<…)>(?=" & RX_Letters & ")",">" & space) If config.getPropertyValue("fixes_russian_iph") = "true" Then 'между N. Y. не должно быть пробела @@ -2101,4 +2123,67 @@ Function fixColoredBackgroundInDoc() As Boolean EndIf End Function + + +Sub fixDiacriticKerning + Dim oSearch As Object + Dim oFound As Object + Dim oPara As Object + oSearch = ThisComponent.createSearchDescriptor() + oSearch.SearchString = "[\u0300-\u036F]" + oSearch.SearchRegularExpression=True + oSearch.searchAll=True + oFound = ThisComponent.findFirst(oSearch) + Do While Not IsNull(oFound) + oPara = oFound.TextParagraph + fixDiacriticKerningInPara(oPara) + oFound = ThisComponent.findNext(oFound.End, oSearch) + Loop +End Sub + +Sub fixDiacriticKerningInPara(oPara As Object) + Dim paraEnum As Object + Dim portion As Object + Dim prevPortion As Object + paraEnum = oPara.createEnumeration + If paraEnum.hasMoreElements Then + prevPortion = paraEnum.nextElement + While paraEnum.hasMoreElements + portion = paraEnum.nextElement + While isFirstCharDiacritic(portion) + moveFirstCharacter(portion, prevPortion) + Wend + prevPortion = portion + Wend + EndIf +End Sub + +Function isFirstCharDiacritic(portion As Object) As Boolean + isFirstCharDiacritic = false + Dim portionText As String + Dim diaLowBound As Long + Dim diaHighBound As Long + Dim charNum As Long + diaLowBound = 768 + diaHighBound = 879 + portionText = portion.String + If Len(portionText) = 0 Then + Exit Function + EndIf + charNum = Asc(portionText) + If charNum >= diaLowBound And charNum <= diaHighBound Then + isFirstCharDiacritic = true + EndIf +End Function + +Sub moveFirstCharacter(portion As Object, prevPortion As Object) + Dim prevEnd As Object + Dim nextStart As Object + prevEnd = prevPortion.getEnd() + prevEnd.String = Left(portion.String,1) + nextStart = portion.Text.createTextCursorByRange(portion.Start) + nextStart.goRight(1,true) + nextStart.setString("") +End Sub + \ No newline at end of file diff --git a/Redaction/CleaningDialog.xdl b/Redaction/CleaningDialog.xdl index 317b762..af7ce20 100644 --- a/Redaction/CleaningDialog.xdl +++ b/Redaction/CleaningDialog.xdl @@ -1,10 +1,10 @@ - + - + - + @@ -20,7 +20,7 @@ - + @@ -30,6 +30,7 @@ - + + \ No newline at end of file diff --git a/Redaction/Configuration.xba b/Redaction/Configuration.xba index d913b2b..9e4a190 100644 --- a/Redaction/Configuration.xba +++ b/Redaction/Configuration.xba @@ -1,7 +1,7 @@ Public Const redactionExtensionName = "cleanAndValidate" -Public Const redactionExtensionVersion = "0.10.0" +Public Const redactionExtensionVersion = "0.10.11" Public Const template_name_monography = "Монография" Public Const template_name_pj = "Философский журнал" Public Const template_name_pq = "Вопросы философии" @@ -10,10 +10,13 @@ Public Const template_name_hpe = "Историко-философский Public Const template_name_pr = "Философия религии" Public Const template_name_fnit = "Философия науки и техники" Public Const template_name_pa = "Философская антропология" -Public Const template_name_pcr = "Путь цивилизационного развития" +Public Const template_name_pcr = "Проблемы цивилизационного развития" Public Const template_name_eifn = "Эпистемология и философия науки" Public Const template_name_et = "Этическая мысль" +Public Const template_name_ephe = "Электронная философская энциклопедия" +Public Const template_name_iph_big = "Большой формат издания" Public Const template_manual = "custom_selected_template" +Public Const articles_path = "/templates/articles/" Function initRedactionConfiguration() On Error Goto exceptionHandler @@ -323,16 +326,19 @@ End Function Function getTemplateNames() As Variant Dim names() As String - AddToArray(names, template_name_monography) +' AddToArray(names, template_name_monography) AddToArray(names, template_name_pq) AddToArray(names, template_name_hp) AddToArray(names, template_name_hpe) AddToArray(names, template_name_pr) AddToArray(names, template_name_fnit) AddToArray(names, template_name_pa) + AddToArray(names, template_name_pj) AddToArray(names, template_name_pcr) AddToArray(names, template_name_eifn) AddToArray(names, template_name_et) + AddToArray(names, template_name_ephe) + AddToArray(names, template_name_iph_big) getTemplateNames = names End Function @@ -351,14 +357,44 @@ Function getTemplateFile(templateName As String) As String fileName = config.getPropertyValue("defaultTemplate") getTemplateFile = getTemplatePath() & "/" & fileName Exit Function - Case template_name_pj - getTemplateFile = extensionPath() & "/templates/articles/default_article_template_ru.ott" - Exit Function Case template_name_eifn - getTemplateFile = extensionPath() & "/templates/articles/статья_журнала_ЭиФН.ott" + getTemplateFile = extensionPath() & articles_path & "статья_эифн.ott" + Exit Function + Case template_name_fnit + getTemplateFile = extensionPath() & articles_path & "статья_фнит.ott" + Exit Function + Case template_name_pa + getTemplateFile = extensionPath() & articles_path & "статья_фа.ott" + Exit Function + Case template_name_pj + getTemplateFile = extensionPath() & articles_path & "статья_фж.ott" + Exit Function + Case template_name_et + getTemplateFile = extensionPath() & articles_path & "статья_эм.ott" + Exit Function + Case template_name_pq + getTemplateFile = extensionPath() & articles_path & "статья_вф.ott" + Exit Function + Case template_name_pr + getTemplateFile = extensionPath() & articles_path & "статья_фр.ott" + Exit Function + Case template_name_pcr + getTemplateFile = extensionPath() & articles_path & "статья_пцр.ott" + Exit Function + Case template_name_hp + getTemplateFile = extensionPath() & articles_path & "статья_иф.ott" + Exit Function + Case template_name_hpe + getTemplateFile = extensionPath() & articles_path & "статья_ифе.ott" + Exit Function + Case template_name_ephe + getTemplateFile = extensionPath() & articles_path & "статья_эфэ.ott" + Exit Function + Case template_name_iph_big + getTemplateFile = extensionPath() & "/templates/books/большой_формат_для_архива.ott" Exit Function Case Else - getTemplateFile = extensionPath() & "/templates/articles/default_article_template_ru.ott" + getTemplateFile = extensionPath() & articles_path & "статья.ott" Exit Function End Select End Function diff --git a/Redaction/Translations.xba b/Redaction/Translations.xba index 538d13e..51dd9dd 100644 --- a/Redaction/Translations.xba +++ b/Redaction/Translations.xba @@ -344,6 +344,12 @@ Function getRussian(identifier As String) As String Case "templateChosen" getRussian = "Выбран шаблон" Exit Function + Case "statusFixingDiacriticCharactersKerning" + getRussian = "Исправляем комбинирование с диакритическими символами" + Exit Function + Case "fixDiacriticKerning" + getRussian = "Исправить комбинирование с диакритическими символами" + Exit Function Case Else getRussian = "Перевод не найден" End Select @@ -670,6 +676,12 @@ Function getEnglish(identifier As String) As String Case "templateChosen" getEnglish = "Selected template" Exit Function + Case "statusFixingDiacriticCharactersKerning" + getEnglish = "Fixing the combination with diacritics " + Exit Function + Case "fixDiacriticKerning" + getEnglish = "Fix combining with diacritic characters" + Exit Function Case Else getEnglish = "No translation" End Select @@ -995,6 +1007,12 @@ Function getCroatian(identifier As String) As String Case "templateChosen" getCroatian = "Izabrani šablon" Exit Function + Case "statusFixingDiacriticCharactersKerning" + getCroatian = "Popravljanje kombinacije s dijakritičkim znakovima" + Exit Function + Case "fixDiacriticKerning" + getCroatian = "Ispravite kombiniranje s naglašenim likovima" + Exit Function Case Else getCroatian = "No translation" End Select @@ -1320,6 +1338,12 @@ Function getSerbian(identifier As String) As String Case "templateChosen" getSerbian = "Изабрани шаблон" Exit Function + Case "statusFixingDiacriticCharactersKerning" + getSerbian = "Ispravljanje kombinacije sa dijakritičkim znacima " + Exit Function + Case "fixDiacriticKerning" + getSerbian = "Ispravite kombiniranje s naglašenim likovima" + Exit Function Case Else getSerbian = "No translation" End Select @@ -1645,6 +1669,12 @@ Function getBosnian(identifier As String) As String Case "templateChosen" getBosnian = "Izabrani šablon" Exit Function + Case "statusFixingDiacriticCharactersKerning" + getBosnian = "Popravljanje kombinacije s dijakritičkim znakovima" + Exit Function + Case "fixDiacriticKerning" + getBosnian = "Ispravite kombiniranje s naglašenim likovima" + Exit Function Case Else getBosnian = "No translation" End Select diff --git a/Redaction/Validation.xba b/Redaction/Validation.xba index 2f3d98c..74b0974 100644 --- a/Redaction/Validation.xba +++ b/Redaction/Validation.xba @@ -1,7 +1,6 @@ -Sub markval30 - +Sub markval31 End Sub @@ -770,11 +769,9 @@ Sub fontReportButton Exit sub EndIf Dim FileName As String - FileName = getCharsInFont(targetFontName) + getCharsInFont(targetFontName) statusIndicator.end() - If FileName <> "" Then - openReport(FileName) - EndIf + End Sub Sub onSelectFont(oEvent) @@ -914,7 +911,7 @@ Sub addToArray(xArray(),vNextElement) xArray(iUB) = vNextElement End Sub -Function getCharsInFont(fontName As String) As String +Sub getCharsInFont(fontName As String) Dim resultArray() As String Dim pageNums() As Long Dim firstPages() As Long @@ -1000,43 +997,30 @@ Function getCharsInFont(fontName As String) As String EndIf Next j Next i - resultString = "" - For i = LBound(resultArray) To UBound(resultArray) - resultString = resultString & "<a href='https://unicode-table.com/ru/" & resultArray(i) & "'" & ">https://unicode-table.com/ru/" & resultArray(i) & "</a> " & getTranslation("charFirstPage") & " " & pageNums(i) & "<br>" & Chr(10) - Next i - If resultString <> "" Then - 'MsgBox "Символы в шрифте "& fontName &Chr(10)&resultString - Dim FileName As String 'Holds the file name - Dim n As Integer 'Holds the file number - Dim f As Integer 'Index variable - Dim s As String 'Temporary string for input - Dim fileaccess As Object - Dim outtextstream As Object - Dim out As Object - - Dim sTemp$ - GlobalScope.BasicLibraries.loadLibrary("Tools") - path=DirectoryNameoutofPath(ThisComponent.getURL(),"/") - FileName = path & "/symbolsInFont" & fontName & ".html" - 'n = FreeFile() 'Next free file number - 'Open FileName For Output Access Read Write As #n 'Open for read/write - fileaccess = createUnoService ("com.sun.star.ucb.SimpleFileAccess") - outtextstream = createUnoService ("com.sun.star.io.TextOutputStream") - outtextstream.setEncoding( "UTF-8" ) - out = fileaccess.openFileWrite( FileName ) - outtextstream.setOutputStream( out ) - outtextstream.writeString( "<html><head><title>" & getTranslation("symbolsInFontHeading") & " "& fontName & "</title></head><body><h2>" & getTranslation("symbolsInFontHeading") & " "& fontName &":</h2>"&resultString &"</body></html>" ) - outtextstream.closeOutput() - getCharsInFont = FileName - Exit Function + Dim newDocCursor As Object + Dim newDoc As Object + newDoc = starDesktop.loadComponentFromURL("private:factory/swriter", "_blank", 0, Array()) + newDocCursor = newDoc.getCurrentController().getViewCursor() + newDocCursor.String = getTranslation("symbolsInFontHeading") & " " & fontName + newDocCursor.ParaStyleName = "Heading 1" + newDocCursor.collapseToEnd() + newDocCursor.Text.insertControlCharacter(newDocCursor.End,com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK,False) + For i = LBound(resultArray) To UBound(resultArray) + newDocCursor.ParaStyleName = "Text body" + newDocCursor.String = "https://unicode-table.com/ru/" & resultArray(i) + newDocCursor.HyperLinkURL = "https://unicode-table.com/ru/" & resultArray(i) + newDocCursor.collapseToEnd() + newDocCursor.String = " " & getTranslation("charFirstPage") & " " & pageNums(i) + newDocCursor.collapseToEnd() + newDocCursor.Text.insertControlCharacter(newDocCursor.End,com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK,False) + Next i + Exit Sub Else MsgBox getTranslation("symbolsInFontNotFound1") & " " & fontName & " " & getTranslation("symbolsInFontNotFound2") - getCharsInFont = "" - Exit Function EndIf -End Function +End Sub Function findBadCharacters() As Boolean diff --git a/build.gradle b/build.gradle index 5f92339..d98dfa4 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,8 @@ +apply plugin: 'java' task oxt(type: Zip) { dependsOn = [ 'setVersion','setVersionInBasicCode' ] - archiveName 'cleanAndValidate.oxt' + archiveFileName = 'cleanAndValidate.oxt' + destinationDirectory = file("./") from './' include '*' include '*/*' diff --git a/cleanandvalidate.update.xml b/cleanandvalidate.update.xml index 80f002c..19726d1 100644 --- a/cleanandvalidate.update.xml +++ b/cleanandvalidate.update.xml @@ -2,9 +2,9 @@ - + - + diff --git a/description.xml b/description.xml index 177e347..be730b9 100644 --- a/description.xml +++ b/description.xml @@ -1,205 +1,375 @@ - + + + + + + - + + + + + + + + + + + + + - - - + + + + + + - + + + + + + Cleaning and validation documents for publishing in html and epub with pagination - + + + + + + Чистка и проверка документов для издания в html и epub с сохранением пагинации - + + + + + + - + + + + + + - + + + + + + - + + + + + + - + + + + + + - + + + + + + - + + + + + + - + + + + + + - + + + + + + - + + + + + + - + + + + + + - + + + + + + - + + + + + + - + + + + + + - + + + + + + Georgy Litvinov - + + + + + + - + + + + + + - + + + + + + - + + + + + + - + + + + + + - + + + + + + - + + + + + + - + + + + + + - + + + + + + - + + + + + + - + + + + + + - + + + + + + - + + + + + + diff --git a/gradle.properties b/gradle.properties index 825e6cf..8e6f42e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1 +1 @@ -version=0.10.0 +version=0.10.11 diff --git a/license_en.txt b/license_en.txt index e7a4150..382c1d8 100644 --- a/license_en.txt +++ b/license_en.txt @@ -1,6 +1,6 @@ The author of this extension is: Georgy Litvinov (public@litvinovg.pro) -Copyright 20212121212121212121212121212121212121212121n redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, version 3 of the License. +Copyright 2021 redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, version 3 of the License. This library 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 Lesser General Public License for more details. diff --git a/templates/articles/default article template_ru.ott b/templates/articles/default article template_ru.ott deleted file mode 100644 index 6fbbd62..0000000 Binary files a/templates/articles/default article template_ru.ott and /dev/null differ diff --git a/templates/articles/default_article_template_ru.ott b/templates/articles/default_article_template_ru.ott deleted file mode 100644 index 6fbbd62..0000000 Binary files a/templates/articles/default_article_template_ru.ott and /dev/null differ diff --git a/templates/articles/статья.ott b/templates/articles/статья.ott new file mode 100644 index 0000000..ecf42ce Binary files /dev/null and b/templates/articles/статья.ott differ diff --git a/templates/articles/статья_вф.ott b/templates/articles/статья_вф.ott new file mode 100644 index 0000000..4e95ee4 Binary files /dev/null and b/templates/articles/статья_вф.ott differ diff --git a/templates/articles/статья_журнала_ЭиФН.ott b/templates/articles/статья_журнала_ЭиФН.ott deleted file mode 100644 index f5d7384..0000000 Binary files a/templates/articles/статья_журнала_ЭиФН.ott and /dev/null differ diff --git a/templates/articles/статья_иф.ott b/templates/articles/статья_иф.ott new file mode 100644 index 0000000..e1f8d8d Binary files /dev/null and b/templates/articles/статья_иф.ott differ diff --git a/templates/articles/статья_ифе.ott b/templates/articles/статья_ифе.ott new file mode 100644 index 0000000..f9c3425 Binary files /dev/null and b/templates/articles/статья_ифе.ott differ diff --git a/templates/articles/статья_пцр.ott b/templates/articles/статья_пцр.ott new file mode 100644 index 0000000..409063a Binary files /dev/null and b/templates/articles/статья_пцр.ott differ diff --git a/templates/articles/статья_фа.ott b/templates/articles/статья_фа.ott new file mode 100644 index 0000000..ab2571b Binary files /dev/null and b/templates/articles/статья_фа.ott differ diff --git a/templates/articles/статья_фж.ott b/templates/articles/статья_фж.ott new file mode 100644 index 0000000..02e22b0 Binary files /dev/null and b/templates/articles/статья_фж.ott differ diff --git a/templates/articles/статья_фнит.ott b/templates/articles/статья_фнит.ott new file mode 100644 index 0000000..9fbacfd Binary files /dev/null and b/templates/articles/статья_фнит.ott differ diff --git a/templates/articles/статья_фр.ott b/templates/articles/статья_фр.ott new file mode 100644 index 0000000..7823637 Binary files /dev/null and b/templates/articles/статья_фр.ott differ diff --git a/templates/articles/статья_эифн.ott b/templates/articles/статья_эифн.ott new file mode 100644 index 0000000..bbfec52 Binary files /dev/null and b/templates/articles/статья_эифн.ott differ diff --git a/templates/articles/статья_эм.ott b/templates/articles/статья_эм.ott new file mode 100644 index 0000000..69cef11 Binary files /dev/null and b/templates/articles/статья_эм.ott differ diff --git a/templates/articles/статья_эфэ.ott b/templates/articles/статья_эфэ.ott new file mode 100644 index 0000000..cf7c755 Binary files /dev/null and b/templates/articles/статья_эфэ.ott differ diff --git a/templates/books/большой_формат_для_архива.ott b/templates/books/большой_формат_для_архива.ott new file mode 100644 index 0000000..73b55f7 Binary files /dev/null and b/templates/books/большой_формат_для_архива.ott differ diff --git a/translations.ods b/translations.ods index ac58eef..d685210 100644 Binary files a/translations.ods and b/translations.ods differ