From 153e09eba419418238eb24e179fe82815cbaa24f Mon Sep 17 00:00:00 2001 From: "aleksey.koryakin" Date: Thu, 14 Nov 2019 14:26:34 +0300 Subject: [PATCH] =?UTF-8?q?#ONECICD-211=20=D0=9E=D1=88=D0=B8=D0=B1=D0=BA?= =?UTF-8?q?=D0=B0=20=D1=81=D1=80=D0=B0=D0=B2=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F?= =?UTF-8?q?=20=D1=81=D0=BE=D0=B4=D0=B5=D1=80=D0=B6=D0=B8=D0=BC=D0=BE=D0=B3?= =?UTF-8?q?=D0=BE=20=D0=B2=20=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=82=D0=B5=20?= =?UTF-8?q?Markdown?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/сonfluence.os | 107 +++++++++++++++++++++++++++++++++------------- 1 file changed, 78 insertions(+), 29 deletions(-) diff --git a/src/сonfluence.os b/src/сonfluence.os index bc49835..8358a38 100644 --- a/src/сonfluence.os +++ b/src/сonfluence.os @@ -10,6 +10,8 @@ /////////////////////////////////////////////////////////////////// +Перем ФорматыСодержимого Экспорт; + // ОписаниеПодключения // Создает структуру с набором параметров подключения. // Созданная структура в дальнейшем используется для всех операций @@ -505,7 +507,8 @@ HTTPМетод = "POST"; - ПараметрыКоманды = ПараметрыСозданияОбновления(ПараметрыПодключения, АдресСтраницы, Содержимое); + ОписаниеСодержимого = ПодготовитьСодержимое(ПараметрыПодключения, Содержимое); + ПараметрыКоманды = ПараметрыСозданияОбновления(АдресСтраницы, ОписаниеСодержимого); URL = ПолучитьURLОперации(); @@ -550,14 +553,27 @@ КонецЕсли; + ОписаниеСодержимого = ПодготовитьСодержимое(ПараметрыПодключения, Содержимое); + Если ОбновитьПриИзмененииСодержимого Тогда СодержимоеConfluence = СодержимоеСтраницыПоИдентификатору(ПараметрыПодключения, АдресСтраницы.Идентификатор); Регексп = Новый РегулярноеВыражение("ac\:macro-id=""[a-z0-9-]{36}"""); // идентификаторы плагинов меняются Регексп.Многострочный = Истина; СодержимоеConfluence = Регексп.Заменить(СодержимоеConfluence, "NONE"); - ВрСодержимое = Регексп.Заменить(Содержимое, "NONE"); + ВрСодержимое = Регексп.Заменить(ОписаниеСодержимого.Значение, "NONE"); + Если ОписаниеСодержимого.Формат = ФорматыСодержимого.MarkDown Тогда + + // TODO: Известные проблемы при сравнении MarkDown + // 1. Если в исходном файле есть "/", то для публикации его необходимо экранировать + // но до сравнения, тк от confluence он приходит в норм виде + // 2. Картинки (img) при конвертации тэк не закрытый, в confluence - закрытый + СодержимоеConfluence = СтрЗаменить(СодержимоеConfluence, "", ""); // Особенность конвертера Markdown → Confluence + + КонецЕсли; + + Если СтрСравнить(СокрЛП(СодержимоеConfluence), СокрЛП(ВрСодержимое)) = 0 Тогда Возврат Неопределено; @@ -572,7 +588,7 @@ HTTPМетод = "PUT"; - ПараметрыКоманды = ПараметрыСозданияОбновления(ПараметрыПодключения, АдресСтраницы, Содержимое, Версия); + ПараметрыКоманды = ПараметрыСозданияОбновления(АдресСтраницы, ОписаниеСодержимого, Версия); ТелоЗапроса = СтрокаJSON(ПараметрыКоманды); @@ -588,7 +604,7 @@ КонецФункции // ОбновитьСтраницу() -Функция ПараметрыСозданияОбновления(ПараметрыПодключения, Адрес, Содержимое, Версия = Неопределено) +Функция ПараметрыСозданияОбновления(Адрес, ОписаниеСодержимого, Версия = Неопределено) ПараметрыКоманды = Новый Структура(); ПараметрыКоманды.Вставить("type", "page"); @@ -607,6 +623,46 @@ ПараметрыКоманды.Вставить("ancestors", Родители); КонецЕсли; + ФорматПоУмолчанию = confluence.ФорматыСодержимого.Confluence; + Значение = ""; + Формат = ФорматПоУмолчанию; + + Если ТипЗнч(ОписаниеСодержимого) <> Тип("Структура") + ИЛИ НЕ ОписаниеСодержимого.Свойство("Формат") + ИЛИ НЕ ОписаниеСодержимого.Свойство("Значение") Тогда + + ВызватьИсключение "Передано не корректное описание содержимого"; + + КонецЕсли; + + Если ЗначениеЗаполнено(ОписаниеСодержимого.Значение) Тогда + + Если ОписаниеСодержимого.Формат = ФорматыСодержимого.MarkDown Тогда + + Значение = СтрЗаменить(ОписаниеСодержимого.Значение, "\", "\\"); + + Хранение = Новый Структура("value, representation", Значение, "editor"); + ТелоСтраницы = Новый Структура("editor", Хранение); + + Иначе + + Хранение = Новый Структура("value, representation", ОписаниеСодержимого.Значение, "storage"); + ТелоСтраницы = Новый Структура("storage", Хранение); + + КонецЕсли; + + ПараметрыКоманды.Вставить("body", ТелоСтраницы); + + КонецЕсли; + + Возврат ПараметрыКоманды; + +КонецФункции + +Функция ПодготовитьСодержимое(ПараметрыПодключения, Содержимое) + + ОписаниеСодержимого = Новый Структура("Значение, Формат"); + ФорматПоУмолчанию = "confluence"; Значение = ""; Формат = ФорматПоУмолчанию; @@ -634,35 +690,23 @@ Значение = Содержимое; КонецЕсли; - + Если ПустаяСтрока(Формат) Тогда + Формат = ФорматПоУмолчанию; - КонецЕсли; - - - Если ЗначениеЗаполнено(Значение) Тогда - - Если Формат = "markdown" Тогда - - Значение = СтрЗаменить(Значение, "\", "\\"); - - Значение = ПреобразоватьMarkdownToConfluence(ПараметрыПодключения, Значение); - - Хранение = Новый Структура("value, representation", Значение, "editor"); - ТелоСтраницы = Новый Структура("editor", Хранение); - - Иначе - - Хранение = Новый Структура("value, representation", Значение, "storage"); - ТелоСтраницы = Новый Структура("storage", Хранение); - - КонецЕсли; - - ПараметрыКоманды.Вставить("body", ТелоСтраницы); КонецЕсли; - Возврат ПараметрыКоманды; + Если ЗначениеЗаполнено(Значение) И Формат = ФорматыСодержимого.MarkDown Тогда + + Значение = ПреобразоватьMarkdownToConfluence(ПараметрыПодключения, Значение); + + КонецЕсли; + + ОписаниеСодержимого.Формат = Формат; + ОписаниеСодержимого.Значение = Значение; + + Возврат ОписаниеСодержимого; КонецФункции @@ -824,4 +868,9 @@ Возврат Содержимое; -КонецФункции \ No newline at end of file +КонецФункции + +ФорматыСодержимого = Новый Структура(); +ФорматыСодержимого.Вставить("Markdown", "markdown"); +ФорматыСодержимого.Вставить("Confluence", "confluence"); +ФорматыСодержимого.Вставить("HTML", "html"); \ No newline at end of file