You've already forked OpenIntegrations
mirror of
https://github.com/Bayselonarrend/OpenIntegrations.git
synced 2026-06-12 00:34:16 +02:00
Фикс документации
This commit is contained in:
Vendored
+45
-43
@@ -6,7 +6,7 @@ keywords: [1C, 1С, 1С:Предприятие, 1С:Предприятие 8.3,
|
||||
|
||||
<img src={require('../../static/img/APIs/RSS.png').default} width='64px' />
|
||||
|
||||
# RSS
|
||||
# RSS/Atom
|
||||
|
||||
import LibraryIntro from '@site/src/components/LibraryIntro';
|
||||
|
||||
@@ -26,29 +26,32 @@ RSS (Really Simple Syndication) is a format for distributing news and other webs
|
||||
|
||||
### Creating an RSS feed
|
||||
|
||||
To create an RSS feed, use the `СоздатьФидRSS` function:
|
||||
To create an RSS feed, use the `CreateFeedRSS` function:
|
||||
|
||||
```bsl
|
||||
НазваниеКанала = "Мой блог";
|
||||
ОписаниеКанала = "Последние новости и статьи";
|
||||
СсылкаКанала = "https://example.com";
|
||||
ChannelName = "My Blog";
|
||||
ChannelDescription = "Latest news and articles";
|
||||
ChannelLink = "https://example.com";
|
||||
|
||||
Элементы = Новый Массив;
|
||||
Элемент = OPI_RSS.ПолучитьСтруктуруЭлементаФидаRSS(Истина);
|
||||
Элемент.title = "Первая статья";
|
||||
Элемент.description = "Описание первой статьи";
|
||||
Элемент.link = "https://example.com/article1";
|
||||
Элемент.pubDate = ТекущаяДата();
|
||||
Элемент.author = "author@example.com";
|
||||
Элемент.guid = "article1";
|
||||
Элементы.Добавить(Элемент);
|
||||
Items = New Array;
|
||||
|
||||
ФидRSS = OPI_RSS.СоздатьФидRSS(НазваниеКанала, ОписаниеКанала, СсылкаКанала, Элементы);
|
||||
Item = OPI_RSS.GetFeedItemStructureRSS(True);
|
||||
|
||||
Item.title = "First article";
|
||||
Item.description = "First article description";
|
||||
Item.link = "https://example.com/article1";
|
||||
Item.pubDate = CurrentDate();
|
||||
Item.author = "author@example.com";
|
||||
Item.guid = "article1";
|
||||
|
||||
Items.Add(Item);
|
||||
|
||||
RSSFeed = OPI_RSS.CreateFeedRSS(ChannelName, ChannelDescription, ChannelLink, Items);
|
||||
```
|
||||
|
||||
### RSS element structure
|
||||
|
||||
The `ПолучитьСтруктуруЭлементаФидаRSS` function returns a structure with the following fields:
|
||||
The `GetFeedItemStructureRSS` function returns a structure with the following fields:
|
||||
|
||||
- **title** — element title
|
||||
- **description** — element description/content
|
||||
@@ -59,13 +62,11 @@ The `ПолучитьСтруктуруЭлементаФидаRSS` function ret
|
||||
|
||||
### Parsing an RSS feed
|
||||
|
||||
To parse an existing RSS feed, use the `РазобратьФидRSS` function:
|
||||
To parse an existing RSS feed, use the `ParseFeedRSS` function:
|
||||
|
||||
```bsl
|
||||
XMLТекст = "<?xml version=""1.0""?>..."; // XML содержимое фида
|
||||
Канал = OPI_RSS.РазобратьФидRSS(XMLТекст);
|
||||
|
||||
// Канал содержит данные канала и массив элементов в поле "items"
|
||||
XMLText = "<?xml version=""1.0""?>..."; // XML feed content
|
||||
Channel = OPI_RSS.ParseFeedRSS(XMLText);
|
||||
```
|
||||
|
||||
## Working with Atom
|
||||
@@ -74,31 +75,34 @@ Atom is an alternative content syndication format, more modern and flexible than
|
||||
|
||||
### Creating an Atom feed
|
||||
|
||||
To create an Atom feed, use the `СоздатьФидAtom` function:
|
||||
To create an Atom feed, use the `CreateFeedAtom` function:
|
||||
|
||||
```bsl
|
||||
НазваниеФида = "Мой блог";
|
||||
СсылкаФида = "https://example.com";
|
||||
IDФида = "https://example.com/feed";
|
||||
FeedTitle = "My Blog";
|
||||
FeedLink = "https://example.com";
|
||||
FeedID = "https://example.com/feed";
|
||||
|
||||
Элементы = Новый Массив;
|
||||
Элемент = OPI_RSS.ПолучитьСтруктуруЭлементаФидаAtom(Истина);
|
||||
Элемент.title = "Первая статья";
|
||||
Элемент.id = "article1";
|
||||
Элемент.link = "https://example.com/article1";
|
||||
Элемент.updated = ТекущаяДата();
|
||||
Элемент.summary = "Краткое описание";
|
||||
Элемент.content = "Полное содержимое статьи";
|
||||
Элемент.author = "Иван Иванов";
|
||||
Элемент.published = ТекущаяДата();
|
||||
Элементы.Добавить(Элемент);
|
||||
Items = New Array;
|
||||
|
||||
ФидAtom = OPI_RSS.СоздатьФидAtom(НазваниеФида, СсылкаФида, IDФида, Элементы);
|
||||
Item = OPI_RSS.GetFeedItemStructureAtom(True);
|
||||
|
||||
Item.title = "First article";
|
||||
Item.id = "article1";
|
||||
Item.link = "https://example.com/article1";
|
||||
Item.updated = CurrentDate();
|
||||
Item.summary = "Brief description";
|
||||
Item.content = "Full article content";
|
||||
Item.author = "Ivan Ivanov";
|
||||
Item.published = CurrentDate();
|
||||
|
||||
Items.Add(Item);
|
||||
|
||||
AtomFeed = OPI_RSS.CreateFeedAtom(FeedTitle, FeedLink, FeedID, Items);
|
||||
```
|
||||
|
||||
### Atom element structure
|
||||
|
||||
The `ПолучитьСтруктуруЭлементаФидаAtom` function returns a structure with the following fields:
|
||||
The `GetFeedItemStructureAtom` function returns a structure with the following fields:
|
||||
|
||||
- **title** — element title
|
||||
- **id** — unique element identifier
|
||||
@@ -111,13 +115,11 @@ The `ПолучитьСтруктуруЭлементаФидаAtom` function re
|
||||
|
||||
### Parsing an Atom feed
|
||||
|
||||
To parse an existing Atom feed, use the `РазобратьФидAtom` function:
|
||||
To parse an existing Atom feed, use the `ParseFeedAtom` function:
|
||||
|
||||
```bsl
|
||||
XMLТекст = "<?xml version=""1.0""?>..."; // XML содержимое фида
|
||||
Фид = OPI_RSS.РазобратьФидAtom(XMLТекст);
|
||||
|
||||
// Фид содержит данные фида и массив элементов в поле "entries"
|
||||
XMLText = "<?xml version=""1.0""?>..."; // XML feed content
|
||||
Feed = OPI_RSS.ParseFeedAtom(XMLText);
|
||||
```
|
||||
|
||||
## Usage features
|
||||
|
||||
+4
-4
@@ -27,12 +27,12 @@ To work with ReportPortal API, you need to obtain an authorization token. There
|
||||
Obtained based on user login and password and has a limited validity period:
|
||||
|
||||
```bsl
|
||||
URL = "https://your-reportportal-instance.com";
|
||||
Login = "your_username";
|
||||
URL = "https://your-reportportal-instance.com";
|
||||
Login = "your_username";
|
||||
Password = "your_password";
|
||||
|
||||
Response = OPI_ReportPortal.GetTemporaryToken(URL, Login, Password);
|
||||
Token = Response["access_token"];
|
||||
Token = Response["access_token"];
|
||||
```
|
||||
|
||||
#### Permanent token
|
||||
@@ -44,7 +44,7 @@ For long-term use, it is recommended to create a permanent token:
|
||||
3. Create a permanent token:
|
||||
|
||||
```bsl
|
||||
UserID = "your_user_id";
|
||||
UserID = "your_user_id";
|
||||
KeyName = "API Key for Integration";
|
||||
|
||||
Response = OPI_ReportPortal.GetPermanentToken(URL, Token, UserID, KeyName);
|
||||
|
||||
Vendored
+23
-20
@@ -6,7 +6,7 @@ keywords: [1C, 1С, 1С:Предприятие, 1С:Предприятие 8.3,
|
||||
|
||||
<img src={require('../../static/img/APIs/RSS.png').default} width='64px' />
|
||||
|
||||
# RSS
|
||||
# RSS/Atom
|
||||
|
||||
import LibraryIntro from '@site/src/components/LibraryIntro';
|
||||
|
||||
@@ -31,16 +31,19 @@ RSS (Really Simple Syndication) — это формат для распрост
|
||||
```bsl
|
||||
НазваниеКанала = "Мой блог";
|
||||
ОписаниеКанала = "Последние новости и статьи";
|
||||
СсылкаКанала = "https://example.com";
|
||||
СсылкаКанала = "https://example.com";
|
||||
|
||||
Элементы = Новый Массив;
|
||||
|
||||
Элемент = OPI_RSS.ПолучитьСтруктуруЭлементаФидаRSS(Истина);
|
||||
Элемент.title = "Первая статья";
|
||||
|
||||
Элемент.title = "Первая статья";
|
||||
Элемент.description = "Описание первой статьи";
|
||||
Элемент.link = "https://example.com/article1";
|
||||
Элемент.pubDate = ТекущаяДата();
|
||||
Элемент.author = "author@example.com";
|
||||
Элемент.guid = "article1";
|
||||
Элемент.link = "https://example.com/article1";
|
||||
Элемент.pubDate = ТекущаяДата();
|
||||
Элемент.author = "author@example.com";
|
||||
Элемент.guid = "article1";
|
||||
|
||||
Элементы.Добавить(Элемент);
|
||||
|
||||
ФидRSS = OPI_RSS.СоздатьФидRSS(НазваниеКанала, ОписаниеКанала, СсылкаКанала, Элементы);
|
||||
@@ -63,9 +66,7 @@ RSS (Really Simple Syndication) — это формат для распрост
|
||||
|
||||
```bsl
|
||||
XMLТекст = "<?xml version=""1.0""?>..."; // XML содержимое фида
|
||||
Канал = OPI_RSS.РазобратьФидRSS(XMLТекст);
|
||||
|
||||
// Канал содержит данные канала и массив элементов в поле "items"
|
||||
Канал = OPI_RSS.РазобратьФидRSS(XMLТекст);
|
||||
```
|
||||
|
||||
## Работа с Atom
|
||||
@@ -78,19 +79,22 @@ Atom — это альтернативный формат синдикации
|
||||
|
||||
```bsl
|
||||
НазваниеФида = "Мой блог";
|
||||
СсылкаФида = "https://example.com";
|
||||
IDФида = "https://example.com/feed";
|
||||
СсылкаФида = "https://example.com";
|
||||
IDФида = "https://example.com/feed";
|
||||
|
||||
Элементы = Новый Массив;
|
||||
|
||||
Элемент = OPI_RSS.ПолучитьСтруктуруЭлементаФидаAtom(Истина);
|
||||
Элемент.title = "Первая статья";
|
||||
Элемент.id = "article1";
|
||||
Элемент.link = "https://example.com/article1";
|
||||
Элемент.updated = ТекущаяДата();
|
||||
Элемент.summary = "Краткое описание";
|
||||
Элемент.content = "Полное содержимое статьи";
|
||||
Элемент.author = "Иван Иванов";
|
||||
|
||||
Элемент.title = "Первая статья";
|
||||
Элемент.id = "article1";
|
||||
Элемент.link = "https://example.com/article1";
|
||||
Элемент.updated = ТекущаяДата();
|
||||
Элемент.summary = "Краткое описание";
|
||||
Элемент.content = "Полное содержимое статьи";
|
||||
Элемент.author = "Иван Иванов";
|
||||
Элемент.published = ТекущаяДата();
|
||||
|
||||
Элементы.Добавить(Элемент);
|
||||
|
||||
ФидAtom = OPI_RSS.СоздатьФидAtom(НазваниеФида, СсылкаФида, IDФида, Элементы);
|
||||
@@ -124,5 +128,4 @@ XMLТекст = "<?xml version=""1.0""?>..."; // XML содержимое фид
|
||||
|
||||
- При создании фидов даты автоматически преобразуются в соответствующие форматы (RFC822 для RSS, ISO8601 для Atom)
|
||||
- Если дата обновления не указана, используется текущая дата
|
||||
- Структуры элементов можно получать как пустыми, так и с описаниями полей для удобства заполнения
|
||||
- Разбор фидов возвращает структуры с данными канала/фида и массивом элементов
|
||||
+3
-3
@@ -27,8 +27,8 @@ ReportPortal — это система управления результата
|
||||
Получается на основе логина и пароля пользователя и имеет ограниченный срок действия:
|
||||
|
||||
```bsl
|
||||
URL = "https://your-reportportal-instance.com";
|
||||
Логин = "your_username";
|
||||
URL = "https://your-reportportal-instance.com";
|
||||
Логин = "your_username";
|
||||
Пароль = "your_password";
|
||||
|
||||
Ответ = OPI_ReportPortal.ПолучитьВременныйТокен(URL, Логин, Пароль);
|
||||
@@ -45,7 +45,7 @@ URL = "https://your-reportportal-instance.com";
|
||||
|
||||
```bsl
|
||||
IDПользователя = "your_user_id";
|
||||
ИмяКлюча = "API Key for Integration";
|
||||
ИмяКлюча = "API Key for Integration";
|
||||
|
||||
Ответ = OPI_ReportPortal.ПолучитьПостоянныйТокен(URL, Токен, IDПользователя, ИмяКлюча);
|
||||
ПостоянныйТокен = Ответ["apiKey"];
|
||||
|
||||
-581
@@ -1,581 +0,0 @@
|
||||
// OneScript: ./OInt/api/metrika/Modules/OPI_RSS.os
|
||||
// Lib: RSS
|
||||
// CLI: rss
|
||||
// Keywords: rss, atom, feed
|
||||
|
||||
// DocsCategory: Other
|
||||
// DocsNameRU: RSS/Atom
|
||||
// DocsNameEN: RSS/Atom
|
||||
|
||||
// MIT License
|
||||
|
||||
// Copyright (c) 2023-2026 Anton Tsitavets
|
||||
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to deal
|
||||
// in the Software without restriction, including without limitation the rights
|
||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
|
||||
// The above copyright notice and this permission notice shall be included in all
|
||||
// copies or substantial portions of the Software.
|
||||
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
// SOFTWARE.
|
||||
|
||||
// https://github.com/Bayselonarrend/OpenIntegrations
|
||||
|
||||
// BSLLS:Typo-off
|
||||
// BSLLS:LatinAndCyrillicSymbolInWord-off
|
||||
// BSLLS:IncorrectLineBreak-off
|
||||
// BSLLS:NumberOfOptionalParams-off
|
||||
// BSLLS:UsingServiceTag-off
|
||||
// BSLLS:LineLength-off
|
||||
// BSLLS:UsingSynchronousCalls-off
|
||||
|
||||
//@skip-check module-structure-top-region
|
||||
//@skip-check module-structure-method-in-regions
|
||||
//@skip-check wrong-string-literal-content
|
||||
//@skip-check method-too-many-params
|
||||
|
||||
#Use "../../../tools/main"
|
||||
#Use "../../../tools/http"
|
||||
|
||||
#Region Public
|
||||
|
||||
#Region RSSMethods
|
||||
|
||||
// Create feed (RSS)
|
||||
// Creates RSS feed text
|
||||
//
|
||||
// Parameters:
|
||||
// ChannelTitle - String - Channel title - name
|
||||
// ChannelDescription - String - Channel description - descr
|
||||
// ChannelLink - String - Channel link - link
|
||||
// Items - Array of Structure - Feed items. See GetFeedItemStructureRSS - items
|
||||
// UpdateDate - Date, Undefined - Update date. Current if not filled - date
|
||||
//
|
||||
// Returns:
|
||||
// String - Channel XML feed
|
||||
Function CreateFeedRSS(Val ChannelTitle
|
||||
, Val ChannelDescription
|
||||
, Val ChannelLink
|
||||
, Val Items
|
||||
, Val UpdateDate = Undefined) Export
|
||||
|
||||
UpdateDate = ?(UpdateDate = Undefined
|
||||
, OPI_Tools.GetCurrentDate()
|
||||
, UpdateDate);
|
||||
|
||||
OPI_TypeConversion.GetLine(ChannelTitle);
|
||||
OPI_TypeConversion.GetLine(ChannelDescription);
|
||||
OPI_TypeConversion.GetLine(ChannelLink);
|
||||
OPI_TypeConversion.GetArray(Items);
|
||||
OPI_TypeConversion.GetDate(UpdateDate);
|
||||
|
||||
XMLWriter = New XMLWriter;
|
||||
XMLWriter.SetString("UTF-8");
|
||||
|
||||
XMLWriter.WriteXMLDeclaration();
|
||||
XMLWriter.WriteStartElement("rss");
|
||||
XMLWriter.WriteAttribute("version", "2.0");
|
||||
|
||||
XMLWriter.WriteStartElement("channel");
|
||||
WriteXMLItem(XMLWriter, "title" , ChannelTitle);
|
||||
WriteXMLItem(XMLWriter, "link" , ChannelLink);
|
||||
WriteXMLItem(XMLWriter, "description", ChannelDescription);
|
||||
|
||||
DateRFC822 = OPI_Tools.DateRFC822(UpdateDate);
|
||||
WriteXMLItem(XMLWriter, "lastBuildDate", DateRFC822);
|
||||
|
||||
For Each Element In Items Do
|
||||
WriteFeedItem(XMLWriter, Element);
|
||||
EndDo;
|
||||
|
||||
XMLWriter.WriteEndElement();
|
||||
XMLWriter.WriteEndElement();
|
||||
|
||||
Feed = XMLWriter.Close();
|
||||
|
||||
Return Feed;
|
||||
|
||||
EndFunction
|
||||
|
||||
// Get feed item structure (RSS)
|
||||
// Gets the structure of parameters for an RSS feed item
|
||||
//
|
||||
// Parameters:
|
||||
// Clear - Boolean - True > structure with empty valuse, False > field descriptions at values - empty
|
||||
// AsMap - Boolean - True > returns fields as map - map
|
||||
//
|
||||
// Returns:
|
||||
// Structure Of KeyAndValue - Feed item fields structure
|
||||
Function GetFeedItemStructureRSS(Val Clear = False, Val AsMap = False) Export
|
||||
|
||||
OPI_TypeConversion.GetBoolean(Clear);
|
||||
OPI_TypeConversion.GetBoolean(AsMap);
|
||||
|
||||
If AsMap Then
|
||||
ElementStructure = New Map;
|
||||
Else
|
||||
ElementStructure = New Structure;
|
||||
EndIf;
|
||||
|
||||
ElementStructure.Insert("title" , "<item title>");
|
||||
ElementStructure.Insert("description" , "<item description/content>");
|
||||
ElementStructure.Insert("link" , "<item URL>");
|
||||
ElementStructure.Insert("pubDate" , "<publication date>");
|
||||
ElementStructure.Insert("author" , "<authors email>");
|
||||
ElementStructure.Insert("guid" , "<unique identifier of the item>");
|
||||
|
||||
If Clear Then
|
||||
ElementStructure = OPI_Tools.ClearCollectionRecursively(ElementStructure);
|
||||
EndIf;
|
||||
|
||||
//@skip-check constructor-function-return-section
|
||||
Return ElementStructure;
|
||||
|
||||
EndFunction
|
||||
|
||||
// Parse feed (RSS)
|
||||
// Parses the XML of an RSS feed and returns a structure with channel data and items
|
||||
//
|
||||
// Parameters:
|
||||
// XMLText - String - XML content of RSS feed - xml
|
||||
//
|
||||
// Returns:
|
||||
// Structure Of KeyAndValue - Channel structure
|
||||
Function ParseFeedRSS(Val XMLText) Export
|
||||
|
||||
OPI_TypeConversion.GetLine(XMLText);
|
||||
|
||||
Channel = New Structure;
|
||||
|
||||
XMLReader = New XMLReader;
|
||||
XMLReader.SetString(XMLText);
|
||||
|
||||
While XMLReader.Read() Do
|
||||
|
||||
If XMLReader.NodeType = XMLNodeType.StartElement Then
|
||||
|
||||
If XMLReader.Name = "channel" Then
|
||||
Channel = ReadChannelRSS(XMLReader);
|
||||
Break;
|
||||
EndIf;
|
||||
|
||||
EndIf;
|
||||
|
||||
EndDo;
|
||||
|
||||
XMLReader.Close();
|
||||
|
||||
Return Channel;
|
||||
|
||||
EndFunction
|
||||
|
||||
#EndRegion
|
||||
|
||||
#Region AtomMethods
|
||||
|
||||
// Create feed (Atom)
|
||||
// Creates the text of an Atom feed
|
||||
//
|
||||
// Parameters:
|
||||
// FeedTitle - String - Feed title - name
|
||||
// FeedLink - String - Feed URL - link
|
||||
// FeedID - String - Feed unique identifier (usually a URL) - id
|
||||
// Items - Array of Structure - Feed items. See GetFeedItemStructureAtom - items
|
||||
// UpdateDate - Date, Undefined - Update date. Current if not filled - date
|
||||
//
|
||||
// Returns:
|
||||
// String - Atom XML feed
|
||||
Function CreateFeedAtom(Val FeedTitle
|
||||
, Val FeedLink
|
||||
, Val FeedID
|
||||
, Val Items
|
||||
, Val UpdateDate = Undefined) Export
|
||||
|
||||
UpdateDate = ?(UpdateDate = Undefined
|
||||
, OPI_Tools.GetCurrentDate()
|
||||
, UpdateDate);
|
||||
|
||||
OPI_TypeConversion.GetLine(FeedTitle);
|
||||
OPI_TypeConversion.GetLine(FeedLink);
|
||||
OPI_TypeConversion.GetLine(FeedID);
|
||||
OPI_TypeConversion.GetArray(Items);
|
||||
OPI_TypeConversion.GetDate(UpdateDate);
|
||||
|
||||
XMLWriter = New XMLWriter;
|
||||
XMLWriter.SetString("UTF-8");
|
||||
|
||||
XMLWriter.WriteXMLDeclaration();
|
||||
XMLWriter.WriteStartElement("feed");
|
||||
XMLWriter.WriteAttribute("xmlns", "http://www.w3.org/2005/Atom");
|
||||
|
||||
WriteXMLItem(XMLWriter, "title", FeedTitle);
|
||||
WriteXMLItem(XMLWriter, "id" , FeedID);
|
||||
|
||||
XMLWriter.WriteStartElement("link");
|
||||
XMLWriter.WriteAttribute("href", FeedLink);
|
||||
XMLWriter.WriteAttribute("rel" , "alternate");
|
||||
XMLWriter.WriteEndElement();
|
||||
|
||||
DateISO8601 = OPI_Tools.DateISO8601(UpdateDate);
|
||||
WriteXMLItem(XMLWriter, "updated", DateISO8601);
|
||||
|
||||
For Each Element In Items Do
|
||||
WriteFeedItemAtom(XMLWriter, Element);
|
||||
EndDo;
|
||||
|
||||
XMLWriter.WriteEndElement(); // feed
|
||||
|
||||
Feed = XMLWriter.Close();
|
||||
|
||||
Return Feed;
|
||||
|
||||
EndFunction
|
||||
|
||||
// Get feed item structure (Atom)
|
||||
// Gets the structure of parameters of an Atom feed item
|
||||
//
|
||||
// Parameters:
|
||||
// Clear - Boolean - True > structure with empty valuse, False > field descriptions at values - empty
|
||||
// AsMap - Boolean - True > returns fields as map - map
|
||||
//
|
||||
// Returns:
|
||||
// Structure Of KeyAndValue - Feed item fields structure
|
||||
Function GetFeedItemStructureAtom(Val Clear = False, Val AsMap = False) Export
|
||||
|
||||
OPI_TypeConversion.GetBoolean(Clear);
|
||||
OPI_TypeConversion.GetBoolean(AsMap);
|
||||
|
||||
If AsMap Then
|
||||
ElementStructure = New Map;
|
||||
Else
|
||||
ElementStructure = New Structure;
|
||||
EndIf;
|
||||
|
||||
ElementStructure.Insert("title" , "<item title>");
|
||||
ElementStructure.Insert("id" , "<unique identifier of the item>");
|
||||
ElementStructure.Insert("link" , "<item URL>");
|
||||
ElementStructure.Insert("updated" , "<update date>");
|
||||
ElementStructure.Insert("summary" , "<short description>");
|
||||
ElementStructure.Insert("content" , "<full content>");
|
||||
ElementStructure.Insert("author" , "<author's name>");
|
||||
ElementStructure.Insert("published" , "<publication date>");
|
||||
|
||||
If Clear Then
|
||||
ElementStructure = OPI_Tools.ClearCollectionRecursively(ElementStructure);
|
||||
EndIf;
|
||||
|
||||
//@skip-check constructor-function-return-section
|
||||
Return ElementStructure;
|
||||
|
||||
EndFunction
|
||||
|
||||
// Parse feed (Atom)
|
||||
// Parses the XML of an Atom feed and returns a structure with feed data and items
|
||||
//
|
||||
// Parameters:
|
||||
// XMLText - String - XML content of Atom feed - xml
|
||||
//
|
||||
// Returns:
|
||||
// Structure Of KeyAndValue - Feed structure
|
||||
Function ParseFeedAtom(Val XMLText) Export
|
||||
|
||||
OPI_TypeConversion.GetLine(XMLText);
|
||||
|
||||
Feed = New Structure;
|
||||
|
||||
XMLReader = New XMLReader;
|
||||
XMLReader.SetString(XMLText);
|
||||
|
||||
While XMLReader.Read() Do
|
||||
|
||||
If XMLReader.NodeType = XMLNodeType.StartElement Then
|
||||
|
||||
If XMLReader.Name = "feed" Then
|
||||
Feed = ReadFeedAtom(XMLReader);
|
||||
Break;
|
||||
EndIf;
|
||||
|
||||
EndIf;
|
||||
|
||||
EndDo;
|
||||
|
||||
XMLReader.Close();
|
||||
|
||||
Return Feed;
|
||||
|
||||
EndFunction
|
||||
|
||||
#EndRegion
|
||||
|
||||
#EndRegion
|
||||
|
||||
#Region Private
|
||||
|
||||
Procedure WriteXMLItem(XMLWriter, ElementName, Value)
|
||||
|
||||
If ValueIsFilled(Value) Then
|
||||
XMLWriter.WriteStartElement(ElementName);
|
||||
XMLWriter.WriteText(Value);
|
||||
XMLWriter.WriteEndElement();
|
||||
EndIf;
|
||||
|
||||
EndProcedure
|
||||
|
||||
Procedure WriteFeedItem(XMLWriter, Element)
|
||||
|
||||
OPI_TypeConversion.GetKeyValueCollection(Element);
|
||||
|
||||
XMLWriter.WriteStartElement("item");
|
||||
|
||||
For Each DataField In Element Do
|
||||
|
||||
CurrentKey = DataField.Key;
|
||||
CurrentValue = DataField.Value;
|
||||
|
||||
If TypeOf(CurrentValue) = Type("Date") Then
|
||||
CurrentValue = OPI_Tools.DateRFC822(CurrentValue);
|
||||
Else
|
||||
OPI_TypeConversion.GetLine(CurrentValue, False);
|
||||
EndIf;
|
||||
|
||||
If CurrentKey = "guid" Then
|
||||
XMLWriter.WriteStartElement("guid");
|
||||
XMLWriter.WriteAttribute("isPermaLink", "false");
|
||||
XMLWriter.WriteText(CurrentValue);
|
||||
XMLWriter.WriteEndElement();
|
||||
Else
|
||||
WriteXMLItem(XMLWriter, CurrentKey, CurrentValue);
|
||||
EndIf;
|
||||
|
||||
EndDo;
|
||||
|
||||
XMLWriter.WriteEndElement();
|
||||
|
||||
EndProcedure
|
||||
|
||||
Function ReadChannelRSS(XMLReader)
|
||||
|
||||
Channel = New Structure;
|
||||
Items = New Array;
|
||||
|
||||
While XMLReader.Read() Do
|
||||
|
||||
If XMLReader.NodeType = XMLNodeType.StartElement Then
|
||||
|
||||
ElementName = XMLReader.Name;
|
||||
|
||||
If ElementName = "item" Then
|
||||
Element = ReadItemRSS(XMLReader);
|
||||
Items.Add(Element);
|
||||
Else
|
||||
XMLReader.Read();
|
||||
If XMLReader.NodeType = XMLNodeType.Text Then
|
||||
Channel.Insert(ElementName, XMLReader.Value);
|
||||
EndIf;
|
||||
EndIf;
|
||||
|
||||
ElsIf XMLReader.NodeType = XMLNodeType.EndElement And XMLReader.Name = "channel" Then
|
||||
Break;
|
||||
EndIf;
|
||||
|
||||
EndDo;
|
||||
|
||||
Channel.Insert("items", Items);
|
||||
|
||||
Return Channel;
|
||||
|
||||
EndFunction
|
||||
|
||||
Function ReadItemRSS(XMLReader)
|
||||
|
||||
Element = New Structure;
|
||||
|
||||
While XMLReader.Read() Do
|
||||
|
||||
If XMLReader.NodeType = XMLNodeType.StartElement Then
|
||||
|
||||
ElementName = XMLReader.Name;
|
||||
XMLReader.Read();
|
||||
|
||||
If XMLReader.NodeType = XMLNodeType.Text Then
|
||||
Element.Insert(ElementName, XMLReader.Value);
|
||||
EndIf;
|
||||
|
||||
ElsIf XMLReader.NodeType = XMLNodeType.EndElement And XMLReader.Name = "item" Then
|
||||
Break;
|
||||
EndIf;
|
||||
|
||||
EndDo;
|
||||
|
||||
Return Element;
|
||||
|
||||
EndFunction
|
||||
|
||||
Procedure WriteFeedItemAtom(XMLWriter, Element)
|
||||
|
||||
OPI_TypeConversion.GetKeyValueCollection(Element);
|
||||
|
||||
XMLWriter.WriteStartElement("entry");
|
||||
|
||||
For Each DataField In Element Do
|
||||
|
||||
CurrentKey = DataField.Key;
|
||||
CurrentValue = DataField.Value;
|
||||
|
||||
If TypeOf(CurrentValue) = Type("Date") Then
|
||||
CurrentValue = OPI_Tools.DateISO8601(CurrentValue);
|
||||
Else
|
||||
OPI_TypeConversion.GetLine(CurrentValue, False);
|
||||
EndIf;
|
||||
|
||||
If CurrentKey = "link" Then
|
||||
XMLWriter.WriteStartElement("link");
|
||||
XMLWriter.WriteAttribute("href", CurrentValue);
|
||||
XMLWriter.WriteAttribute("rel" , "alternate");
|
||||
XMLWriter.WriteEndElement();
|
||||
ElsIf CurrentKey = "author" Then
|
||||
XMLWriter.WriteStartElement("author");
|
||||
WriteXMLItem(XMLWriter, "name" , CurrentValue);
|
||||
XMLWriter.WriteEndElement();
|
||||
ElsIf CurrentKey = "content" Then
|
||||
XMLWriter.WriteStartElement("content");
|
||||
XMLWriter.WriteAttribute("type", "html");
|
||||
XMLWriter.WriteText(CurrentValue);
|
||||
XMLWriter.WriteEndElement();
|
||||
Else
|
||||
WriteXMLItem(XMLWriter, CurrentKey, CurrentValue);
|
||||
EndIf;
|
||||
|
||||
EndDo;
|
||||
|
||||
XMLWriter.WriteEndElement(); // entry
|
||||
|
||||
EndProcedure
|
||||
|
||||
Function ReadFeedAtom(XMLReader)
|
||||
|
||||
Feed = New Structure;
|
||||
Items = New Array;
|
||||
|
||||
While XMLReader.Read() Do
|
||||
|
||||
If XMLReader.NodeType = XMLNodeType.StartElement Then
|
||||
|
||||
ElementName = XMLReader.Name;
|
||||
|
||||
If ElementName = "entry" Then
|
||||
Element = ReadItemAtom(XMLReader);
|
||||
Items.Add(Element);
|
||||
ElsIf ElementName = "link" Then
|
||||
Feed.Insert("link", XMLReader.GetAttribute("href"));
|
||||
Else
|
||||
XMLReader.Read();
|
||||
If XMLReader.NodeType = XMLNodeType.Text Then
|
||||
Feed.Insert(ElementName, XMLReader.Value);
|
||||
EndIf;
|
||||
EndIf;
|
||||
|
||||
ElsIf XMLReader.NodeType = XMLNodeType.EndElement And XMLReader.Name = "feed" Then
|
||||
Break;
|
||||
EndIf;
|
||||
|
||||
EndDo;
|
||||
|
||||
Feed.Insert("entries", Items);
|
||||
|
||||
Return Feed;
|
||||
|
||||
EndFunction
|
||||
|
||||
Function ReadItemAtom(XMLReader)
|
||||
|
||||
Element = New Structure;
|
||||
|
||||
While XMLReader.Read() Do
|
||||
|
||||
If XMLReader.NodeType = XMLNodeType.StartElement Then
|
||||
|
||||
ElementName = XMLReader.Name;
|
||||
|
||||
If ElementName = "link" Then
|
||||
Element.Insert("link" , XMLReader.GetAttribute("href"));
|
||||
ElsIf ElementName = "author" Then
|
||||
AuthorName = ReadAuthorAtom(XMLReader);
|
||||
Element.Insert("author", AuthorName);
|
||||
Else
|
||||
XMLReader.Read();
|
||||
If XMLReader.NodeType = XMLNodeType.Text Then
|
||||
Element.Insert(ElementName, XMLReader.Value);
|
||||
EndIf;
|
||||
EndIf;
|
||||
|
||||
ElsIf XMLReader.NodeType = XMLNodeType.EndElement And XMLReader.Name = "entry" Then
|
||||
Break;
|
||||
EndIf;
|
||||
|
||||
EndDo;
|
||||
|
||||
Return Element;
|
||||
|
||||
EndFunction
|
||||
|
||||
Function ReadAuthorAtom(XMLReader)
|
||||
|
||||
AuthorName = "";
|
||||
|
||||
While XMLReader.Read() Do
|
||||
|
||||
If XMLReader.NodeType = XMLNodeType.StartElement And XMLReader.Name = "name" Then
|
||||
XMLReader.Read();
|
||||
If XMLReader.NodeType = XMLNodeType.Text Then
|
||||
AuthorName = XMLReader.Value;
|
||||
EndIf;
|
||||
ElsIf XMLReader.NodeType = XMLNodeType.EndElement And XMLReader.Name = "author" Then
|
||||
Break;
|
||||
EndIf;
|
||||
|
||||
EndDo;
|
||||
|
||||
Return AuthorName;
|
||||
|
||||
EndFunction
|
||||
|
||||
#EndRegion
|
||||
|
||||
#Region Alternate
|
||||
|
||||
Function СоздатьФидRSS(Val НазваниеКанала, Val ОписаниеКанала, Val СсылкаКанала, Val Элементы, Val ДатаОбновления = Undefined) Export
|
||||
Return CreateFeedRSS(НазваниеКанала, ОписаниеКанала, СсылкаКанала, Элементы, ДатаОбновления);
|
||||
EndFunction
|
||||
|
||||
Function ПолучитьСтруктуруЭлементаФидаRSS(Val Пустая = False, Val КакСоответствие = False) Export
|
||||
Return GetFeedItemStructureRSS(Пустая, КакСоответствие);
|
||||
EndFunction
|
||||
|
||||
Function РазобратьФидRSS(Val ТекстXML) Export
|
||||
Return ParseFeedRSS(ТекстXML);
|
||||
EndFunction
|
||||
|
||||
Function СоздатьФидAtom(Val НазваниеФида, Val СсылкаФида, Val IDФида, Val Элементы, Val ДатаОбновления = Undefined) Export
|
||||
Return CreateFeedAtom(НазваниеФида, СсылкаФида, IDФида, Элементы, ДатаОбновления);
|
||||
EndFunction
|
||||
|
||||
Function ПолучитьСтруктуруЭлементаФидаAtom(Val Пустая = False, Val КакСоответствие = False) Export
|
||||
Return GetFeedItemStructureAtom(Пустая, КакСоответствие);
|
||||
EndFunction
|
||||
|
||||
Function РазобратьФидAtom(Val ТекстXML) Export
|
||||
Return ParseFeedAtom(ТекстXML);
|
||||
EndFunction
|
||||
|
||||
#EndRegion
|
||||
-581
@@ -1,581 +0,0 @@
|
||||
// OneScript: ./OInt/api/metrika/Modules/OPI_RSS.os
|
||||
// Lib: RSS
|
||||
// CLI: rss
|
||||
// Keywords: rss, atom, feed
|
||||
|
||||
// DocsCategory: Other
|
||||
// DocsNameRU: RSS/Atom
|
||||
// DocsNameEN: RSS/Atom
|
||||
|
||||
// MIT License
|
||||
|
||||
// Copyright (c) 2023-2026 Anton Tsitavets
|
||||
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to deal
|
||||
// in the Software without restriction, including without limitation the rights
|
||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
|
||||
// The above copyright notice and this permission notice shall be included in all
|
||||
// copies or substantial portions of the Software.
|
||||
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
// SOFTWARE.
|
||||
|
||||
// https://github.com/Bayselonarrend/OpenIntegrations
|
||||
|
||||
// BSLLS:Typo-off
|
||||
// BSLLS:LatinAndCyrillicSymbolInWord-off
|
||||
// BSLLS:IncorrectLineBreak-off
|
||||
// BSLLS:NumberOfOptionalParams-off
|
||||
// BSLLS:UsingServiceTag-off
|
||||
// BSLLS:LineLength-off
|
||||
// BSLLS:UsingSynchronousCalls-off
|
||||
|
||||
//@skip-check module-structure-top-region
|
||||
//@skip-check module-structure-method-in-regions
|
||||
//@skip-check wrong-string-literal-content
|
||||
//@skip-check method-too-many-params
|
||||
|
||||
#Использовать "../../../tools/main"
|
||||
#Использовать "../../../tools/http"
|
||||
|
||||
#Область ПрограммныйИнтерфейс
|
||||
|
||||
#Область МетодыRSS
|
||||
|
||||
// Создать фид (RSS)
|
||||
// Создает текст RSS фида
|
||||
//
|
||||
// Параметры:
|
||||
// НазваниеКанала - Строка - Название канала - name
|
||||
// ОписаниеКанала - Строка - Описание канала - descr
|
||||
// СсылкаКанала - Строка - Ссылка канала - link
|
||||
// Элементы - Массив Из Структура - Элементы фида. См. ПолучитьСтруктуруЭлементаФидаRSS - items
|
||||
// ДатаОбновления - Дата, Неопределено - Дата обновления. Текущая, если не заполнено - date
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Строка - XML фид канала
|
||||
Функция СоздатьФидRSS(Знач НазваниеКанала
|
||||
, Знач ОписаниеКанала
|
||||
, Знач СсылкаКанала
|
||||
, Знач Элементы
|
||||
, Знач ДатаОбновления = Неопределено) Экспорт
|
||||
|
||||
ДатаОбновления = ?(ДатаОбновления = Неопределено
|
||||
, OPI_Инструменты.ПолучитьТекущуюДату()
|
||||
, ДатаОбновления);
|
||||
|
||||
OPI_ПреобразованиеТипов.ПолучитьСтроку(НазваниеКанала);
|
||||
OPI_ПреобразованиеТипов.ПолучитьСтроку(ОписаниеКанала);
|
||||
OPI_ПреобразованиеТипов.ПолучитьСтроку(СсылкаКанала);
|
||||
OPI_ПреобразованиеТипов.ПолучитьМассив(Элементы);
|
||||
OPI_ПреобразованиеТипов.ПолучитьДату(ДатаОбновления);
|
||||
|
||||
ЗаписьXML = Новый ЗаписьXML;
|
||||
ЗаписьXML.УстановитьСтроку("UTF-8");
|
||||
|
||||
ЗаписьXML.ЗаписатьОбъявлениеXML();
|
||||
ЗаписьXML.ЗаписатьНачалоЭлемента("rss");
|
||||
ЗаписьXML.ЗаписатьАтрибут("version", "2.0");
|
||||
|
||||
ЗаписьXML.ЗаписатьНачалоЭлемента("channel");
|
||||
ЗаписатьЭлементXML(ЗаписьXML, "title" , НазваниеКанала);
|
||||
ЗаписатьЭлементXML(ЗаписьXML, "link" , СсылкаКанала);
|
||||
ЗаписатьЭлементXML(ЗаписьXML, "description", ОписаниеКанала);
|
||||
|
||||
ДатаRFC822 = OPI_Инструменты.ДатаRFC822(ДатаОбновления);
|
||||
ЗаписатьЭлементXML(ЗаписьXML, "lastBuildDate", ДатаRFC822);
|
||||
|
||||
Для Каждого Элемент Из Элементы Цикл
|
||||
ЗаписатьЭлементФида(ЗаписьXML, Элемент);
|
||||
КонецЦикла;
|
||||
|
||||
ЗаписьXML.ЗаписатьКонецЭлемента();
|
||||
ЗаписьXML.ЗаписатьКонецЭлемента();
|
||||
|
||||
Фид = ЗаписьXML.Закрыть();
|
||||
|
||||
Возврат Фид;
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Получить структуру элемента фида (RSS)
|
||||
// Получает структуру параметров элемента RSS фида
|
||||
//
|
||||
// Параметры:
|
||||
// Пустая - Булево - Истина > структура с пустыми значениями, Ложь > в значениях будут описания полей - empty
|
||||
// КакСоответствие - Булево - Истина > возвращает поля как соответствие - map
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Структура Из КлючИЗначение - Структура полей элемента фида
|
||||
Функция ПолучитьСтруктуруЭлементаФидаRSS(Знач Пустая = Ложь, Знач КакСоответствие = Ложь) Экспорт
|
||||
|
||||
OPI_ПреобразованиеТипов.ПолучитьБулево(Пустая);
|
||||
OPI_ПреобразованиеТипов.ПолучитьБулево(КакСоответствие);
|
||||
|
||||
Если КакСоответствие Тогда
|
||||
СтруктураЭлемента = Новый Соответствие;
|
||||
Иначе
|
||||
СтруктураЭлемента = Новый Структура;
|
||||
КонецЕсли;
|
||||
|
||||
СтруктураЭлемента.Вставить("title" , "<заголовок элемента>");
|
||||
СтруктураЭлемента.Вставить("description" , "<описание/содержимое элемента>");
|
||||
СтруктураЭлемента.Вставить("link" , "<URL элемента>");
|
||||
СтруктураЭлемента.Вставить("pubDate" , "<дата публикации>");
|
||||
СтруктураЭлемента.Вставить("author" , "<email автора>");
|
||||
СтруктураЭлемента.Вставить("guid" , "<уникальный идентификатор элемента>");
|
||||
|
||||
Если Пустая Тогда
|
||||
СтруктураЭлемента = OPI_Инструменты.ОчиститьКоллекциюРекурсивно(СтруктураЭлемента);
|
||||
КонецЕсли;
|
||||
|
||||
//@skip-check constructor-function-return-section
|
||||
Возврат СтруктураЭлемента;
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Разобрать фид (RSS)
|
||||
// Разбирает XML RSS фида и возвращает структуру с данными канала и элементами
|
||||
//
|
||||
// Параметры:
|
||||
// ТекстXML - Строка - XML содержимое RSS фида - xml
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Структура Из КлючИЗначение - Структура канала
|
||||
Функция РазобратьФидRSS(Знач ТекстXML) Экспорт
|
||||
|
||||
OPI_ПреобразованиеТипов.ПолучитьСтроку(ТекстXML);
|
||||
|
||||
Канал = Новый Структура;
|
||||
|
||||
ЧтениеXML = Новый ЧтениеXML;
|
||||
ЧтениеXML.УстановитьСтроку(ТекстXML);
|
||||
|
||||
Пока ЧтениеXML.Прочитать() Цикл
|
||||
|
||||
Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
|
||||
|
||||
Если ЧтениеXML.Имя = "channel" Тогда
|
||||
Канал = ПрочитатьКаналRSS(ЧтениеXML);
|
||||
Прервать;
|
||||
КонецЕсли;
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
ЧтениеXML.Закрыть();
|
||||
|
||||
Возврат Канал;
|
||||
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
#Область МетодыAtom
|
||||
|
||||
// Создать фид (Atom)
|
||||
// Создает текст Atom фида
|
||||
//
|
||||
// Параметры:
|
||||
// НазваниеФида - Строка - Название фида - name
|
||||
// СсылкаФида - Строка - URL фида - link
|
||||
// IDФида - Строка - Уникальный идентификатор фида (обычно URL) - id
|
||||
// Элементы - Массив Из Структура - Элементы фида. См. ПолучитьСтруктуруЭлементаФидаAtom - items
|
||||
// ДатаОбновления - Дата, Неопределено - Дата обновления. Текущая, если не заполнено - date
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Строка - XML фид Atom
|
||||
Функция СоздатьФидAtom(Знач НазваниеФида
|
||||
, Знач СсылкаФида
|
||||
, Знач IDФида
|
||||
, Знач Элементы
|
||||
, Знач ДатаОбновления = Неопределено) Экспорт
|
||||
|
||||
ДатаОбновления = ?(ДатаОбновления = Неопределено
|
||||
, OPI_Инструменты.ПолучитьТекущуюДату()
|
||||
, ДатаОбновления);
|
||||
|
||||
OPI_ПреобразованиеТипов.ПолучитьСтроку(НазваниеФида);
|
||||
OPI_ПреобразованиеТипов.ПолучитьСтроку(СсылкаФида);
|
||||
OPI_ПреобразованиеТипов.ПолучитьСтроку(IDФида);
|
||||
OPI_ПреобразованиеТипов.ПолучитьМассив(Элементы);
|
||||
OPI_ПреобразованиеТипов.ПолучитьДату(ДатаОбновления);
|
||||
|
||||
ЗаписьXML = Новый ЗаписьXML;
|
||||
ЗаписьXML.УстановитьСтроку("UTF-8");
|
||||
|
||||
ЗаписьXML.ЗаписатьОбъявлениеXML();
|
||||
ЗаписьXML.ЗаписатьНачалоЭлемента("feed");
|
||||
ЗаписьXML.ЗаписатьАтрибут("xmlns", "http://www.w3.org/2005/Atom");
|
||||
|
||||
ЗаписатьЭлементXML(ЗаписьXML, "title", НазваниеФида);
|
||||
ЗаписатьЭлементXML(ЗаписьXML, "id" , IDФида);
|
||||
|
||||
ЗаписьXML.ЗаписатьНачалоЭлемента("link");
|
||||
ЗаписьXML.ЗаписатьАтрибут("href", СсылкаФида);
|
||||
ЗаписьXML.ЗаписатьАтрибут("rel" , "alternate");
|
||||
ЗаписьXML.ЗаписатьКонецЭлемента();
|
||||
|
||||
ДатаISO8601 = OPI_Инструменты.ДатаISO8601(ДатаОбновления);
|
||||
ЗаписатьЭлементXML(ЗаписьXML, "updated", ДатаISO8601);
|
||||
|
||||
Для Каждого Элемент Из Элементы Цикл
|
||||
ЗаписатьЭлементФидаAtom(ЗаписьXML, Элемент);
|
||||
КонецЦикла;
|
||||
|
||||
ЗаписьXML.ЗаписатьКонецЭлемента(); // feed
|
||||
|
||||
Фид = ЗаписьXML.Закрыть();
|
||||
|
||||
Возврат Фид;
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Получить структуру элемента фида (Atom)
|
||||
// Получает структуру параметров элемента Atom фида
|
||||
//
|
||||
// Параметры:
|
||||
// Пустая - Булево - Истина > структура с пустыми значениями, Ложь > в значениях будут описания полей - empty
|
||||
// КакСоответствие - Булево - Истина > возвращает поля как соответствие - map
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Структура Из КлючИЗначение - Структура полей элемента фида
|
||||
Функция ПолучитьСтруктуруЭлементаФидаAtom(Знач Пустая = Ложь, Знач КакСоответствие = Ложь) Экспорт
|
||||
|
||||
OPI_ПреобразованиеТипов.ПолучитьБулево(Пустая);
|
||||
OPI_ПреобразованиеТипов.ПолучитьБулево(КакСоответствие);
|
||||
|
||||
Если КакСоответствие Тогда
|
||||
СтруктураЭлемента = Новый Соответствие;
|
||||
Иначе
|
||||
СтруктураЭлемента = Новый Структура;
|
||||
КонецЕсли;
|
||||
|
||||
СтруктураЭлемента.Вставить("title" , "<заголовок элемента>");
|
||||
СтруктураЭлемента.Вставить("id" , "<уникальный идентификатор элемента>");
|
||||
СтруктураЭлемента.Вставить("link" , "<URL элемента>");
|
||||
СтруктураЭлемента.Вставить("updated" , "<дата обновления>");
|
||||
СтруктураЭлемента.Вставить("summary" , "<краткое описание>");
|
||||
СтруктураЭлемента.Вставить("content" , "<полное содержимое>");
|
||||
СтруктураЭлемента.Вставить("author" , "<имя автора>");
|
||||
СтруктураЭлемента.Вставить("published" , "<дата публикации>");
|
||||
|
||||
Если Пустая Тогда
|
||||
СтруктураЭлемента = OPI_Инструменты.ОчиститьКоллекциюРекурсивно(СтруктураЭлемента);
|
||||
КонецЕсли;
|
||||
|
||||
//@skip-check constructor-function-return-section
|
||||
Возврат СтруктураЭлемента;
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Разобрать фид (Atom)
|
||||
// Разбирает XML Atom фида и возвращает структуру с данными фида и элементами
|
||||
//
|
||||
// Параметры:
|
||||
// ТекстXML - Строка - XML содержимое Atom фида - xml
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// Структура Из КлючИЗначение - Структура фида
|
||||
Функция РазобратьФидAtom(Знач ТекстXML) Экспорт
|
||||
|
||||
OPI_ПреобразованиеТипов.ПолучитьСтроку(ТекстXML);
|
||||
|
||||
Фид = Новый Структура;
|
||||
|
||||
ЧтениеXML = Новый ЧтениеXML;
|
||||
ЧтениеXML.УстановитьСтроку(ТекстXML);
|
||||
|
||||
Пока ЧтениеXML.Прочитать() Цикл
|
||||
|
||||
Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
|
||||
|
||||
Если ЧтениеXML.Имя = "feed" Тогда
|
||||
Фид = ПрочитатьФидAtom(ЧтениеXML);
|
||||
Прервать;
|
||||
КонецЕсли;
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
ЧтениеXML.Закрыть();
|
||||
|
||||
Возврат Фид;
|
||||
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
#Область СлужебныеПроцедурыИФункции
|
||||
|
||||
Процедура ЗаписатьЭлементXML(ЗаписьXML, ИмяЭлемента, Значение)
|
||||
|
||||
Если ЗначениеЗаполнено(Значение) Тогда
|
||||
ЗаписьXML.ЗаписатьНачалоЭлемента(ИмяЭлемента);
|
||||
ЗаписьXML.ЗаписатьТекст(Значение);
|
||||
ЗаписьXML.ЗаписатьКонецЭлемента();
|
||||
КонецЕсли;
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Процедура ЗаписатьЭлементФида(ЗаписьXML, Элемент)
|
||||
|
||||
OPI_ПреобразованиеТипов.ПолучитьКоллекциюКлючИЗначение(Элемент);
|
||||
|
||||
ЗаписьXML.ЗаписатьНачалоЭлемента("item");
|
||||
|
||||
Для Каждого ПолеДанных Из Элемент Цикл
|
||||
|
||||
ТекущийКлюч = ПолеДанных.Ключ;
|
||||
ТекущееЗначение = ПолеДанных.Значение;
|
||||
|
||||
Если ТипЗнч(ТекущееЗначение) = Тип("Дата") Тогда
|
||||
ТекущееЗначение = OPI_Инструменты.ДатаRFC822(ТекущееЗначение);
|
||||
Иначе
|
||||
OPI_ПреобразованиеТипов.ПолучитьСтроку(ТекущееЗначение, Ложь);
|
||||
КонецЕсли;
|
||||
|
||||
Если ТекущийКлюч = "guid" Тогда
|
||||
ЗаписьXML.ЗаписатьНачалоЭлемента("guid");
|
||||
ЗаписьXML.ЗаписатьАтрибут("isPermaLink", "false");
|
||||
ЗаписьXML.ЗаписатьТекст(ТекущееЗначение);
|
||||
ЗаписьXML.ЗаписатьКонецЭлемента();
|
||||
Иначе
|
||||
ЗаписатьЭлементXML(ЗаписьXML, ТекущийКлюч, ТекущееЗначение);
|
||||
КонецЕсли;
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
ЗаписьXML.ЗаписатьКонецЭлемента();
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Функция ПрочитатьКаналRSS(ЧтениеXML)
|
||||
|
||||
Канал = Новый Структура;
|
||||
Элементы = Новый Массив;
|
||||
|
||||
Пока ЧтениеXML.Прочитать() Цикл
|
||||
|
||||
Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
|
||||
|
||||
ИмяЭлемента = ЧтениеXML.Имя;
|
||||
|
||||
Если ИмяЭлемента = "item" Тогда
|
||||
Элемент = ПрочитатьЭлементRSS(ЧтениеXML);
|
||||
Элементы.Добавить(Элемент);
|
||||
Иначе
|
||||
ЧтениеXML.Прочитать();
|
||||
Если ЧтениеXML.ТипУзла = ТипУзлаXML.Текст Тогда
|
||||
Канал.Вставить(ИмяЭлемента, ЧтениеXML.Значение);
|
||||
КонецЕсли;
|
||||
КонецЕсли;
|
||||
|
||||
ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента И ЧтениеXML.Имя = "channel" Тогда
|
||||
Прервать;
|
||||
КонецЕсли;
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
Канал.Вставить("items", Элементы);
|
||||
|
||||
Возврат Канал;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция ПрочитатьЭлементRSS(ЧтениеXML)
|
||||
|
||||
Элемент = Новый Структура;
|
||||
|
||||
Пока ЧтениеXML.Прочитать() Цикл
|
||||
|
||||
Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
|
||||
|
||||
ИмяЭлемента = ЧтениеXML.Имя;
|
||||
ЧтениеXML.Прочитать();
|
||||
|
||||
Если ЧтениеXML.ТипУзла = ТипУзлаXML.Текст Тогда
|
||||
Элемент.Вставить(ИмяЭлемента, ЧтениеXML.Значение);
|
||||
КонецЕсли;
|
||||
|
||||
ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента И ЧтениеXML.Имя = "item" Тогда
|
||||
Прервать;
|
||||
КонецЕсли;
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
Возврат Элемент;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Процедура ЗаписатьЭлементФидаAtom(ЗаписьXML, Элемент)
|
||||
|
||||
OPI_ПреобразованиеТипов.ПолучитьКоллекциюКлючИЗначение(Элемент);
|
||||
|
||||
ЗаписьXML.ЗаписатьНачалоЭлемента("entry");
|
||||
|
||||
Для Каждого ПолеДанных Из Элемент Цикл
|
||||
|
||||
ТекущийКлюч = ПолеДанных.Ключ;
|
||||
ТекущееЗначение = ПолеДанных.Значение;
|
||||
|
||||
Если ТипЗнч(ТекущееЗначение) = Тип("Дата") Тогда
|
||||
ТекущееЗначение = OPI_Инструменты.ДатаISO8601(ТекущееЗначение);
|
||||
Иначе
|
||||
OPI_ПреобразованиеТипов.ПолучитьСтроку(ТекущееЗначение, Ложь);
|
||||
КонецЕсли;
|
||||
|
||||
Если ТекущийКлюч = "link" Тогда
|
||||
ЗаписьXML.ЗаписатьНачалоЭлемента("link");
|
||||
ЗаписьXML.ЗаписатьАтрибут("href", ТекущееЗначение);
|
||||
ЗаписьXML.ЗаписатьАтрибут("rel" , "alternate");
|
||||
ЗаписьXML.ЗаписатьКонецЭлемента();
|
||||
ИначеЕсли ТекущийКлюч = "author" Тогда
|
||||
ЗаписьXML.ЗаписатьНачалоЭлемента("author");
|
||||
ЗаписатьЭлементXML(ЗаписьXML, "name" , ТекущееЗначение);
|
||||
ЗаписьXML.ЗаписатьКонецЭлемента();
|
||||
ИначеЕсли ТекущийКлюч = "content" Тогда
|
||||
ЗаписьXML.ЗаписатьНачалоЭлемента("content");
|
||||
ЗаписьXML.ЗаписатьАтрибут("type", "html");
|
||||
ЗаписьXML.ЗаписатьТекст(ТекущееЗначение);
|
||||
ЗаписьXML.ЗаписатьКонецЭлемента();
|
||||
Иначе
|
||||
ЗаписатьЭлементXML(ЗаписьXML, ТекущийКлюч, ТекущееЗначение);
|
||||
КонецЕсли;
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
ЗаписьXML.ЗаписатьКонецЭлемента(); // entry
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Функция ПрочитатьФидAtom(ЧтениеXML)
|
||||
|
||||
Фид = Новый Структура;
|
||||
Элементы = Новый Массив;
|
||||
|
||||
Пока ЧтениеXML.Прочитать() Цикл
|
||||
|
||||
Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
|
||||
|
||||
ИмяЭлемента = ЧтениеXML.Имя;
|
||||
|
||||
Если ИмяЭлемента = "entry" Тогда
|
||||
Элемент = ПрочитатьЭлементAtom(ЧтениеXML);
|
||||
Элементы.Добавить(Элемент);
|
||||
ИначеЕсли ИмяЭлемента = "link" Тогда
|
||||
Фид.Вставить("link", ЧтениеXML.ПолучитьАтрибут("href"));
|
||||
Иначе
|
||||
ЧтениеXML.Прочитать();
|
||||
Если ЧтениеXML.ТипУзла = ТипУзлаXML.Текст Тогда
|
||||
Фид.Вставить(ИмяЭлемента, ЧтениеXML.Значение);
|
||||
КонецЕсли;
|
||||
КонецЕсли;
|
||||
|
||||
ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента И ЧтениеXML.Имя = "feed" Тогда
|
||||
Прервать;
|
||||
КонецЕсли;
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
Фид.Вставить("entries", Элементы);
|
||||
|
||||
Возврат Фид;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция ПрочитатьЭлементAtom(ЧтениеXML)
|
||||
|
||||
Элемент = Новый Структура;
|
||||
|
||||
Пока ЧтениеXML.Прочитать() Цикл
|
||||
|
||||
Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
|
||||
|
||||
ИмяЭлемента = ЧтениеXML.Имя;
|
||||
|
||||
Если ИмяЭлемента = "link" Тогда
|
||||
Элемент.Вставить("link" , ЧтениеXML.ПолучитьАтрибут("href"));
|
||||
ИначеЕсли ИмяЭлемента = "author" Тогда
|
||||
ИмяАвтора = ПрочитатьАвтораAtom(ЧтениеXML);
|
||||
Элемент.Вставить("author", ИмяАвтора);
|
||||
Иначе
|
||||
ЧтениеXML.Прочитать();
|
||||
Если ЧтениеXML.ТипУзла = ТипУзлаXML.Текст Тогда
|
||||
Элемент.Вставить(ИмяЭлемента, ЧтениеXML.Значение);
|
||||
КонецЕсли;
|
||||
КонецЕсли;
|
||||
|
||||
ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента И ЧтениеXML.Имя = "entry" Тогда
|
||||
Прервать;
|
||||
КонецЕсли;
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
Возврат Элемент;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция ПрочитатьАвтораAtom(ЧтениеXML)
|
||||
|
||||
ИмяАвтора = "";
|
||||
|
||||
Пока ЧтениеXML.Прочитать() Цикл
|
||||
|
||||
Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И ЧтениеXML.Имя = "name" Тогда
|
||||
ЧтениеXML.Прочитать();
|
||||
Если ЧтениеXML.ТипУзла = ТипУзлаXML.Текст Тогда
|
||||
ИмяАвтора = ЧтениеXML.Значение;
|
||||
КонецЕсли;
|
||||
ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента И ЧтениеXML.Имя = "author" Тогда
|
||||
Прервать;
|
||||
КонецЕсли;
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
Возврат ИмяАвтора;
|
||||
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
#Region Alternate
|
||||
|
||||
Function CreateFeedRSS(Val ChannelTitle, Val ChannelDescription, Val ChannelLink, Val Items, Val UpdateDate = Undefined) Export
|
||||
Return СоздатьФидRSS(ChannelTitle, ChannelDescription, ChannelLink, Items, UpdateDate);
|
||||
EndFunction
|
||||
|
||||
Function GetFeedItemStructureRSS(Val Clear = False, Val AsMap = False) Export
|
||||
Return ПолучитьСтруктуруЭлементаФидаRSS(Clear, AsMap);
|
||||
EndFunction
|
||||
|
||||
Function ParseFeedRSS(Val XMLText) Export
|
||||
Return РазобратьФидRSS(XMLText);
|
||||
EndFunction
|
||||
|
||||
Function CreateFeedAtom(Val FeedTitle, Val FeedLink, Val FeedID, Val Items, Val UpdateDate = Undefined) Export
|
||||
Return СоздатьФидAtom(FeedTitle, FeedLink, FeedID, Items, UpdateDate);
|
||||
EndFunction
|
||||
|
||||
Function GetFeedItemStructureAtom(Val Clear = False, Val AsMap = False) Export
|
||||
Return ПолучитьСтруктуруЭлементаФидаAtom(Clear, AsMap);
|
||||
EndFunction
|
||||
|
||||
Function ParseFeedAtom(Val XMLText) Export
|
||||
Return РазобратьФидAtom(XMLText);
|
||||
EndFunction
|
||||
|
||||
#EndRegion
|
||||
@@ -1,4 +1,4 @@
|
||||
// OneScript: ./OInt/api/metrika/Modules/OPI_RSS.os
|
||||
// OneScript: ./OInt/api/rss/Modules/OPI_RSS.os
|
||||
// Lib: RSS
|
||||
// CLI: rss
|
||||
// Keywords: rss, atom, feed
|
||||
|
||||
Reference in New Issue
Block a user