<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title>Parser 3 forum</title>
<link>http://www.parser.ru/forum/</link>
<description>Parser 3. Обсуждение.</description>
<generator>Parser 3.5.0 (compiled on amd64-unknown-freebsd13.4) (http://www.parser.ru/)</generator>
<webMaster>mailbox@parser.ru</webMaster>
<lastBuildDate>Tue, 24 Mar 2026 07:26:50 GMT</lastBuildDate>
<docs>http://blogs.law.harvard.edu/tech/rss</docs>
<item>
<title>CMS</title>
<description><![CDATA[Здравствуйте! Whatsapp отъехал Телега на подходе, с 31.03.2026 отъедет из РФ cPanel так глядишь и CMSки полетят. Parser3 не планирует свою CMS для сайтов?]]></description>
<author>[Серж]</author>
<pubDate>Tue, 24 Mar 2026 07:26:50 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87116</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87116</guid>
</item>
<item>
<title>Месенджер, email-клиент, crm на парсер. Возможно?</title>
<description><![CDATA[Уважаемые гуру и монстры парсера! Подскажите куда копать, на что обратить внимание и какие инструменты использовать. 
Существует написанная на парсере система куда входит товароучетная система типа 1с для работы офиса, терминал для работы менеджеров в магазине, b2b-портал для оптовиков и сайт для розничных покупателей. 
Есть необходимость прикрутить туда же внутренний мессенджер, он же тикет-система с задачами внутри компании, он же простейшая crm система для работы с клиентами. 
Из вопросов: как организовать получение и отправку почты (что-то типа простого email клиента), как организовать работу месенджера. Если кто-то решал подобные задачи буду признателен за любую информацию.]]></description>
<author>[Андрей]</author>
<pubDate>Wed, 11 Mar 2026 10:33:35 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87103</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87103</guid>
</item>
<item>
<title>Свежее прочтение документации Parser 3</title>
<description><![CDATA[Предыдущий пост был не просто так, он был и остается обособленной частью проекта о котором речь пойдет ниже.

Я решил переосмыслить документацию Parser и написать свой вариант, основываясь на формате Markdown. Ссылка на <a href="https://meenga.ru/doc/">документацию</a> (временная).

Что изменилось в документации по Parser?

<b>1. Структура</b>

Классы вынесены на первое место, потому что являются более актуальными в поиске.

Некоторые разделы переставлены, например, «Комментарии к частям выражения» переехал в ветку «Условных операторов».

Упрощено обращение через адресную строку браузера. Ссылки теперь выглядят так <i>/class/имя_класса/[method|field|option]/имя_метода_поля_или_опции/</i>, например:
<i>URL/class/table/method/count/</i>.

Единая структура для всех страниц с описанием.

Внутри страниц описания код с примерами подсвечивается и получил возможность копирования. Из-за этого пришлось отказаться от прямых ссылок из кода на перекрестные страницы, по крайней мере пока.

Все параметры внутри кода описаны через snake_case. Это сделано для удобства дальнейшего исправления после копирования в свой код.

<b>2. Поиск</b>

Вынесен на все страницы. В целом поиск теперь более практичное решение чем искать по структуре разделов.

Два поиска:
- по заголовкам
- по ключевым словам

<b>3. Горячие клавиши</b>

Поиск активируется горячей клавишей /. Стрелки вверх/вниз перемещения по результатам поиска, отмена поиска (ESC) и подтверждение (Enter).
Клавиша возврата к оглавлению раздела Alt + ← (Win) или ⌘ + ← (Мас) из страницы с описанием.

<b>4. Оформление</b>

Добавлена тёмная тема.
Птиц немного анимирован и добавлен в сноски.

<b>5. Версия для печати</b>

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

<b>Версия для смартфонов.</b>

<b>6. Прочее</b>

Улучшены семантика и типографика.

В примерах символы табуляции, например в таблицах, стоят правильными знаками и не требуют замены при копировании.

Добавлены аббревиатуры.

---

Сразу скажу что не стоит задача переплюнуть старую версию документации, они немного разные в силу излишней простоты Markdown, но эта же простота, с другой стороны, позволяет легко добавлять новые главы или создавать новые разделы, что может пригодиться в будущем.

Если этот формат приживется, готов предложить его для замены текущей документации на сайте <b>parser.ru</b>, но это должно решить сообщество.]]></description>
<author>Spearance</author>
<pubDate>Tue, 10 Mar 2026 16:05:20 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87102</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87102</guid>
</item>
<item>
<title>Документация Parser 3 в Markdown на GitHub</title>
<description><![CDATA[В продолжении тестирования класса <a href="https://github.com/Spearance/markdown-p3">makdown.p</a> решил замахнуться на святое и переверстал всю документацию Parser 3 в Markdown.

На сегодня — это практически копия исходной документации, лишь в некоторых местах совсем чуть-чуть подправлены описания, примеры, добавлены картинки в класс <b>image</b> и прочие мелочи.

Вся структура приведена к единому стилю, но со своими особенностями.

Маркдаун моего класса работает более логично (правильно, если хотите), поэтому некоторые конструкции не очень хорошо читаются в GitHub. Например ссылки внутри бэктиков GitHub обрабатывать не умеет, или не позволяет эскейпить сами бэктики.

Структура разделов документации изменилась, теперь классы вынесены на первое место, а всё остальное, наоборот, убрано подальше. Почему так случилось — напишу чуть позже, а сейчас, у всех есть возможность использовать документацию как опенсорс.

Ссылка на <a href="https://github.com/Spearance/Parser-3-Documentation/">документацию</a>.

Как всегда приветствуются ишьи, советы, комментарии.]]></description>
<author>Spearance</author>
<pubDate>Tue, 10 Mar 2026 05:02:15 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87101</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87101</guid>
</item>
<item>
<title>Разделение переменных и методов класса на public/protected/private</title>
<description><![CDATA[Добрый день.
Как я понял, сейчас все переменные и методы класса по умолчанию <b>public</b>.

Есть ли стандартный способ сделать переменную/метод <b>protected/private</b>?]]></description>
<author>virusav</author>
<pubDate>Wed, 04 Mar 2026 18:05:16 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87096</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87096</guid>
</item>
<item>
<title>mail:send + msmtp + $MAIL.SMTP -- может нужна доработка метода ?</title>
<description><![CDATA[На линуксе стоит msmtp, профили все настроены через внешний релей с авторизацией.
Сделан ln -s /bin/msmtp /usr/sbin/sendmail
 
echo &quot;Test message.&quot; | /usr/sbin/sendmail -t -i -f website@fromdomain.ru  vasya@mail.ru
или
echo &quot;Test message.&quot; | /usr/sbin/sendmail -t -i -f website@fromdomain.ru -a local_smtp_x vasya@mail.ru


из консоли всё четко шлется и доставляется!

Пишем код на пареcре, и он настойчиво лезет в $MAIL.SMTP и как от него избавиться непонятно. А в этой связке это по-моему 5-е колесо. msmtp сам может куда надо законнетиться, авторизоваться и поддерживает кучу профилей через ключ -a
$MAIL.SMTP[]
^MAIL.delete[SMTP]
Вопрос не решают :(

<pre>
@main[]

^mail:send[
      $.from[САЙТ &lt;website@fromdomain.ru&gt;]
      $.to[Вася &lt;vasya@mail.ru&gt;]
      $.subject[как дела]
      $.text[Как у тебя дела? У меня - изумительно!]
]
</pre>

Может как-то доработать ^mail:send[] для работы через msmtp ?

Если удалить ключ SMTP получаем ошибку
Parser was configured with --with-sendmail=/usr/sbin/sendmail -i -t -f postmaster key, to change sendmail you should reconfigure and recompie it]]></description>
<author>sergei v.2</author>
<pubDate>Wed, 25 Feb 2026 09:02:28 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87067</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87067</guid>
</item>
<item>
<title>Получить название класса из подключаемого файла</title>
<description><![CDATA[Добрый день.
Есть какие-то базовые классы, которые могут наследоваться другими.
Есть конфиг, в котором прописывается путь к конечному файлу.

Задача - получить название класса при подключении файла.
Простой пример - юзер, который при необходимости переопределяется и используется для авторизации.

<pre>@CLASS
test

@create[]
...</pre>

Метода создания может и не быть.
Нужно после ^use[путь к файлу] точно знать, какое название у класса, чтобы создать объект или вызвать метод.

^reflection:classes[] выдает список классов не в том порядке, в каком они подключались.
Класс с названием test уже мог определяться ранее, но нужно точно знать, что это test именно из данного файла.

В какую сторону копать?]]></description>
<author>virusav</author>
<pubDate>Tue, 24 Feb 2026 19:18:29 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87060</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87060</guid>
</item>
<item>
<title>switch и потребление памяти</title>
<description><![CDATA[<pre>@main[][result]
^for[y](0;9){
  ^for[y](0;9999){
    ^if( true ){}
#   ^switch[]{^case[DEFAULT]{}}
  }
  ^memory:compact[]
  $u[$status:memory]
  $console:line[$u.used]
}</pre>

<pre>$ ./parser3 test.p 
168
168
168
168
168
168
168
168
168
168</pre>

<pre>@main[][result]
^for[y](0;9){
  ^for[y](0;9999){
#   ^if( true ){}
    ^switch[]{^case[DEFAULT]{}}
  }
  ^memory:compact[]
  $u[$status:memory]
  $console:line[$u.used]
}</pre>

<pre>$ ./parser3 test.p 
1212
2184
3308
4216
5696
6480
7268
8332
9116
10928</pre>

Почему так? В принципе, if&apos;ами можно обойтись, но найти где течет было как минимум интересно...

<pre>$ ./parser3 
./parser3: file not specified
Parser/3.5.0 (compiled on x86_64-unknown-linux-gnu)</pre>]]></description>
<author>rodobra</author>
<pubDate>Fri, 30 Jan 2026 06:15:56 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87057</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87057</guid>
</item>
<item>
<title>amqp.declare_queue: возврат параметров</title>
<description><![CDATA[Добрый день.
Сейчас <b>amqp.declare_queue</b> возвращает только название очереди, если оно не было передано.

В структуре ответа есть еще параметры:
<pre>typedef struct amqp_queue_declare_ok_t_ {
  amqp_bytes_t queue;      /**&lt; queue */
  uint32_t message_count;  /**&lt; message-count */
  uint32_t consumer_count; /**&lt; consumer-count */
} amqp_queue_declare_ok_t;</pre>

Может, стоить сделать возврат всех параметров в виде хеша
<pre>{
	&quot;queue&quot;:&quot;test&quot;,
	&quot;consumer_count&quot;:0,
	&quot;message_count&quot;:3
}</pre>
раз уж они все равно приходят?]]></description>
<author>virusav</author>
<pubDate>Mon, 29 Dec 2025 12:06:23 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87049</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87049</guid>
</item>
<item>
<title>Как будто просится конструктор для класса JSON</title>
<description><![CDATA[По аналогии с xdoc:

<pre>^xdoc::create[файл]</pre>

Сделать для JSON:

<pre>^json::create[файл][опции]</pre>

еще лучше:

<pre>^json::load[путь_к_файлу][опции]</pre>

и тогда уже и в xdoc тоже прямой load добавить не через file]]></description>
<author>Spearance</author>
<pubDate>Thu, 27 Nov 2025 17:15:43 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87025</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87025</guid>
</item>
<item>
<title>Claude Sonnet 4.5 — первая LLM-ка которая нормально понимает и пишет скрипты на Parser 3</title>
<description><![CDATA[Я обычно в начале диалога пишу что имею ввиду &quot;Parser 3, язык программирования от Студии Артемия Лебедева&quot;.

Кто-то еще использовал Sonnet 4.5 для парсера? Как опыт? 

Opus 4.1 тоже норм, но Sonnet 4.5 лучше. А модели от OpenAI делают вид что пишут, но на деле ерунда.]]></description>
<author>[N]</author>
<pubDate>Sun, 02 Nov 2025 14:23:25 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87003</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87003</guid>
</item>
<item>
<title>Есть ли переиспользование auto.p при use с $.main(true)?</title>
<description><![CDATA[Добрый день.
Есть структура:
<pre>1 - папка
	auto.p
	index.html
2 - папка
	index.html
auto.p
index.html</pre>

Код файлов:
1/auto.p:
<pre>@auto[]
	$sParam[folder 1]</pre>

1/index.html:
<pre>@main[]
	$result[$sParam]</pre>

2/index.html:
<pre>@main[]
	$result[$sParam]</pre>

auto.p:
<pre>@auto[]
	$sParam[AUTO]</pre>

index.html:
<pre>@main[]
	sParam=$sParam&lt;br /&gt;
	^for<i>(1;2){
		$sParam[]
		^use[$i/index.html;
			$.main(true)
		]
		sParam=$sParam
	}[&lt;br /&gt;]</pre>

Результат выполнения:
<pre>sParam=AUTO
sParam=folder 1
sParam=</pre>

Ожидания:
<pre>sParam=AUTO
sParam=folder 1
sParam=AUTO - т.к. мы делаем подключение с $.main(true), то параметр должен быть получен из корневого auto.p</pre>

Такое ощущение, что при использовании <b>$.main(true)</b> не происходит повторное использование файлов, которые уже были подключены ранее.

Так ли это?
Если да, то какие есть варианты, чтобы это побороть?]]></description>
<author>virusav</author>
<pubDate>Thu, 30 Oct 2025 13:12:38 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=86991</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=86991</guid>
</item>
<item>
<title>Путь к текущему файлу из него</title>
<description><![CDATA[Добрый день.
Есть файлы без классов, которые подключаются через <b>use</b> в цикле.
Требуется найти путь к этому файлу.

<b>^reflection:filename[$self]</b> пустой.
В файле могут быть любые методы, поэтому <b>^reflection:filename[$auto]</b> и т.д. не годятся.

<b>1. Как узнать путь текущего файла из него?</b>

Вообще проблема такая при подключении файлов один за другим:
В <b>auto.p</b> определяется метод, который может переопределиться в каком-нибудь <b>auto.p</b> ниже.
Нужно, чтобы для всех файлов, которые лежат на уровне и ниже последнего <b>auto.p</b> брался метод из него, а для остальных - из верхнего, как при классовой структуре, если наследоваться от более верхнего по цепочке.

Когда происходит подключение файлов один за другим, то после первого же переопределения метода его результат автоматически перекочевывает в другие файлы, т.к. метод переопределился для всего класса <b>MAIN</b>.

Нашел работающее сомнительное решение через определение путей и проверку, что подключаемый файл лежит ниже или на уровне файла с нужным методом:
<pre>^reflection:filename[$auto] - тут нужно получение пути к текущему файлу, т.к. метод @auto может отсутствовать
^reflection:filename[$метод] - путь к последнему файлу, в котором был переопределен метод</pre>

Обычно использовал классы, поэтому не было проблем с переопределением методов.
В данном случае классов нет и не предвидится.

<b>2. Есть ли нормальный способ вызова метода только из подключаемого файла с наследованием из разных auto.p, как это происходит при открытии страницы, но при подключении файла через use? И чтобы при этом в других файлах выше этот метод не использовался?</b>]]></description>
<author>virusav</author>
<pubDate>Thu, 30 Oct 2025 10:56:13 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=86989</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=86989</guid>
</item>
<item>
<title>PostgreSql: переключение схем в двух коннектах</title>
<description><![CDATA[Добрый день.
Использую 2 коннекта к одной базе через
<pre>^PgSql::create[$sConnectString]</pre>
В PgSql (из библиотек с форума) добавляю метод изменения схемы через запрос
<pre>^self.sql[void;SET search_path TO &quot;$sName&quot;]</pre>

В итоге
<pre>^oSql_1.setSchema[schema_1]
^oSql_2.setSchema[schema_2]
</pre>
обрабатывается так
<pre>oSql_1: переключаемся в schema_1
oSql_2: переключаемся в schema_2

oSql_1: оказываемся не в schema_1, а в schema_2</pre>

Можно ли в парсере создать объект коннект и вызывать из него запросы, чтобы 2 коннекта к одной базе не пересекались при переключении схем и прочих операций?

Класс <b>Sql</b> делает коннект при каждом запросе, а не хранит объект и вызывает его.]]></description>
<author>virusav</author>
<pubDate>Tue, 28 Oct 2025 08:32:48 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=86966</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=86966</guid>
</item>
<item>
<title>Сохранение файла при запуске Parser3 как интерпретатора скриптов</title>
<description><![CDATA[Всех приветствую! Запускаю парсер терминалом 
<pre>~/myserv.beget.tech/public_html/cgi-bin/parser3.cgi ~/myserv.beget.tech/public_html/cgi-bin/download_jpg.rp</pre> 
 внутри помимо прочего команда получить файл и сохранить его на диск
<pre>
$file[^curl:load[ 
   $.url[https://server$jpg_table.small_jpg] 
   $.useragent[Parser3] 
   $.timeout(10) 
   $.ssl_verifypeer(0) 
]]

^file.save[binary;/myserv.beget.tech/public_html$jpg_table.small_jpg] 
</pre>

где $jpg_table.small_jpg - путь к картинке на сервере с которого надо забрать и так же на новом положить например /images/model/brand/images1.jpg

как бы я не извращался с путями в ^file.save, сохраняет всегда ~/myserv.beget.tech/public_html/cgi-bin/и_далее_путь_который_указан_в_file.save

Ткните носом что делаю не так пожалуйста.]]></description>
<author>[Андрей]</author>
<pubDate>Mon, 27 Oct 2025 16:30:52 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=86962</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=86962</guid>
</item>
<item>
<title>Reflection:mixin</title>
<description><![CDATA[Может я не до конца понимаю логику, но хотелось бы иметь такую возможность.

Создаю отдельный класс:

<pre>@CLASS
TextMixin

@method1[]
$result[result]

@method[]
^BASE:method[]
</pre>

При попытке сделать mixin из другого класса 

<pre>^reflection:mixin[...]</pre>


Получаю ошибку компиляции: <b>no base class declared</b>

Ожидал, что смогу использовать вызов родительского метода.

Есть ли возможность вызвать родительский метод их mixin метода?

Варианты ^reflection:base не помогают, т.к. можно вызвать только статически]]></description>
<author>nkostya</author>
<pubDate>Thu, 16 Oct 2025 11:29:41 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=86950</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=86950</guid>
</item>
<item>
<title>Класс FioMorph для Parser 3</title>
<description><![CDATA[Склонение русских ФИО по падежам

<pre>
@USE
FioMorph.p

$fio[^FioMorph::create[
	$.surname[Иванов]
	$.first[Иван]
	$.middle[Иванович]
	$.gender(1)
]]

^fio.fullName[падеж]
</pre>


Давняя история, понадобилось делать это без ИИ малой кровью. Меня устраивает если попадание будет 95-97% идеальную точность не жду.

Класс в стадии пре-бета, так что замечания приветствуются. Обязательно проведу тесты на хорошей базе из 170 тыс. ФИО.

Подробности на <a href="https://github.com/Spearance/fio-morph-p3">GitHub</a>, туда же пишите ишьи и примеры неправильно обработанных фамилий]]></description>
<author>Spearance</author>
<pubDate>Tue, 07 Oct 2025 12:26:40 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=86946</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=86946</guid>
</item>
<item>
<title>а как в $mail:received перебрать &quot;текстьі&quot; ?</title>
<description><![CDATA[я правильно понимаю для включения сего достаточно:

exim4 в алиасах прописать:
<pre>
test: &quot;|/srv/myProj/handler.sh&quot;</pre>


в handler.sh:
<pre>#!/bin/sh

cd /srv/myProj/
/srv/parser/parser3.cgi -m handler.p
</pre>

<pre>handler.p
@main[]
^show[$mail:received]

@show[m]
from: $m.from
subject: $m.subject

$m.text.value
^if(def $m.file){
+file $m.file.value.name
}
^if(def $m.message){
+message from $m.message.from
}</pre>
<blockquote>могут присутствовать элементы file2, message2, </blockquote>

т.е. тут ^m.file.foreach - не проканает
надо делать чтото типа:

<pre>^m.foreach[key;data]{
 ^if(^key.left(4) eq &quot;file&quot;){ ^parseAttach[$data] }
 ^if(^key.left(7) eq &quot;message&quot;){ ^parseMessage[$data] }
}</pre>

я правильно понял ?]]></description>
<author>AK666</author>
<pubDate>Sat, 27 Sep 2025 22:06:45 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=86932</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=86932</guid>
</item>
<item>
<title>Таблицы преобразований для mysql</title>
<description><![CDATA[документация:

<blockquote>в зависимости от SQL-сервера 
для Oracle, ODBC и SQLite меняется &apos; на &apos;&apos; 
для PgSQL символы &apos; и \ предваряются символом \ 
для MySQL символы &apos; &quot; и \ предваряются символом \, символы с кодами 0x00 0x0A 0x0D преобразуются соответственно в \0 \n \r 
</blockquote>

постоянно встречается ошибка:
<blockquote>&quot;comment&quot;:&quot;You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near &apos;s name &apos; at line 3&quot;</blockquote>

исходник содержит в тексте <b>&quot;option&apos;s name&quot;</b>


<pre>      UPDATE TaskList
      SET 
        TaskResult  = _utf8mb4&apos;^apply-taint[sql][^json:string[$result;$.indent(false)$.one-line(true)$.file[stat]]]&apos;
      WHERE
        task = _utf8mb4&apos;$TaskID&apos;
</pre>


точно-ли одинарная кавьічка [&apos;] єкранируется?]]></description>
<author>AK666</author>
<pubDate>Thu, 25 Sep 2025 23:01:18 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=86920</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=86920</guid>
</item>
<item>
<title>подскажите по curl</title>
<description><![CDATA[ДД!

подскажите, плиз как данную хрень 

<blockquote>curl https://api.openai.com/v1/responses \
  -H &quot;Authorization: Bearer $OPENAI_API_KEY&quot; \
  -H &quot;Content-Type: multipart/form-data&quot; \
  -F &apos;model=gpt-5&apos; \
  -F &apos;input[0][role]=user&apos; \
  -F &apos;input[0][content][0][type]=input_text&apos; \
  -F &apos;input[0][content][0][text]=BlaBlaBla&apos; \
  -F &apos;input[0][content][1][type]=input_file&apos; \
  -F &apos;input[0][content][1][file][]=@/path/email.eml;type=message/rfc822&apos;
</blockquote>

реализовать через curl:session ?

без необходимоти загонять фалйьі я делал вот так:

<pre>  ^curl:session{
    $curlResult[^curl:load[
      $.url[^taint[as-is][$oGPT.URI]]
      $.ssl_verifypeer(false)
      $.connecttimeout(3000)
      $.timeout(3000)
      $.fresh_connect(true)
      $.mode[text]

      $.post(1)
      $.httpheader[
        $.Authorization[Bearer ^taint[as-is][$oGPT.KEY]]
        $.content-type[application/json]
        $.charset[UTF-8]
      ]
      $.postfields[^array2json[$options][$.one-line(true)]]
    ]]

    ^if(^curlResult.status.int(0) != 200){
      ^try{
        $hRes[^json:parse[^taint[as-is][$curlResult.text]]]
      }{
        $exception.handled(1)
        ^throw[${taskPID}/gpt;curl;respond status $curlResult.status]
      }
      ^throw[${taskPID}/gpt;curl;^if(def $hRes.error&amp;&amp;def $hRes.error.message){$hRes.error.message}{error}]
    }{
      ^try{
        $hRes[^json:parse[^taint[as-is][$curlResult.text]]]
        $gptData[^json:parse[^taint[as-is][$hRes.choices.0.message.content]]]
      }{
        $exception.handled(1)
        ^throw[${taskPID}/gpt;curl;${taskPID} Wrong respond: $curlResult.text]
      }
    }
  }
</pre>

а вот чтото -F меня загнало в ступор ...

особенно &quot;@/path/email.eml;type=message/rfc822&quot;
насколько я помню - curl чтото делает с файлом перед тем как отправить....
а как єто реализовать в парсере ?]]></description>
<author>AK666</author>
<pubDate>Mon, 22 Sep 2025 11:19:04 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=86913</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=86913</guid>
</item>
<item>
<title>AMQP - для обсуждения</title>
<description><![CDATA[<pre>amqp
    $oAmqp[^amqp::create[
        $.host[localhost]                хост
        $.port(5672)                     порт
        $.user[user]                     username
        $.password[pass]                 пароль
        $.vhost[/]                       vhost
        $.login_method[AMQPLAIN|PLAIN|EXTERNAL] AMQPLAIN - поумолчанию
        $.login_response[]
        $.locale[en_US]                  локаль
        $.read_timeout(3000)             таймаут для записи (ms)
        $.write_timeout(3000)            таймаут для записи (ms)
        $.keepalive(false)
        $.insist(false)
        $.channel_rpc_timeout(0.0)
        $.tls[
            $.ca[/etc/ssl/ca.crt]
            $.cert[/etc/ssl/app.crt]
            $.key[/etc/ssl/app.key]
        ]
        $.heartbeat(0)
        $.retry[
            $.min_ms(500)
            $.max_ms(15000)
            $.factor(2.0)
            $.jitter(true)
        ]
    ]]
        Конструктор класса

    ^oAmqp.declare_exchange[
        $.name[main],
        $.type[direct|topic|headers|fanout] тип биржи
        $.passive(false)                    если true, не объявляет очередь, а проверяет ее существование и выдает исключение если ее не существует,
                                            если false и очередь существует, ничего не делает
        $.durable(false)                    гарантирует сохранность определения биржи после перезапуска брокера
        $.auto_delete(true)                 автоудаление биржи
        $.nowait(false)                     если установлено true, сервер не будет отвечать на метод. Клиенту не следует ожидать ответа метода.
    ]
        Объявить биржу 
        (Если серверу не удалось выполнить метод, он вызовет исключение канала или соединения)

    ^oAmqp.delete_exchange[
         $.exchange[]                        название биржи
         $.if_unused(false)                  если true, то очередь удалится только если не используется
         $.nowait(false)                     если установлено true, сервер не будет отвечать на метод. Клиенту не следует ожидать ответа метода.
    ]
        Удалить биржу
        (Если серверу не удалось выполнить метод, он вызовет исключение канала или соединения)

    ^oAmqp.declare_queue[
        $.queue[]                            если отставить пустой должно вернуть имя очереди
        $.exchange[]                         название биржи
        $.passive(false)                     если true не объявляет очередь, а проверяет ее существование и выдает исключение если ее не существует,
                                             если false и очередь существует, ничего не делает
        $.durable(false)                     гарантирует сохранность определения очереди после перезапуска брокера
        $.auto_delete(true)                  автоудаление очереди
        $.nowait(false)                      если установлено true, сервер не будет отвечать на метод. Клиенту не следует ожидать ответа метода.
    ]
        Объявить очередь
        (Если серверу не удалось выполнить метод, он вызовет исключение канала или соединения)

    ^oAmqp.delete_queue[
        $.queue[]                            если отставить пустой должно вернуть имя очереди
        $.if_unused(false)                   если true, то очередь удалится только если не используется
        $.if_empty(false)                    если установлено true, очередь удалиться только если пуста
        $.nowait(false)                      если установлено true, сервер не будет отвечать на метод. Клиенту не следует ожидать ответа метода.
    ]
        Удалить очередь
        (Если серверу не удалось выполнить метод, он вызовет исключение канала или соединения)

    ^oAmqp.publish[
           $.msg[msg]                         строка сообщения (возможно json-строка)
           $.properties[]                     hash - доп свойства для сообщения например можно установить заголовки или отложить выполнение сообщения
           $.exchange[]                       название биржи, если не указать, то надо указать queue, которая создастся для биржи по умолчанию 
           $.queue[]                          название очереди, если отставить пустым должно опубликоваться на биржу
           $.mandatory(false)                 если true и сообщение никуда не попало, сообщение будет возвращено отправителю
           $.create_queue(true)               если true, то объявит очередь, если ее нет
           $.create_exchange(true)            если true, то объявит биржу, если ее нет
    ]
        Опубликовать сообщение

    ^oAmqp.publish[^array::create[
           $.msg[msg]                         строка сообщения (возможно json-строка)
           $.properties[]                     hash - доп свойства для сообщения например можно установить заголовки или отложить выполнение сообщения
           $.exchange[]                       название биржи, если не указать, то надо указать queue, которая создастся для биржи по умолчанию 
           $.queue[]                          название очереди, если отставить пустым должно опубликоваться на биржу
           $.mandatory(false)                 если true и сообщение никуда не попало, сообщение будет возвращено отправителю
           $.create_queue(true)               если true, то объявит очередь, если ее нет
           $.create_exchange(true)            если true, то объявит биржу, если ее нет
        ;...;...
    ]]
        Опубликовать несколько сообщений


    ^oAmqp.consume[
        $.queue[]                             имя очереди
        $.consumer_tag[]                      идентификатор слушателя, если оставить пустым будет сгенерирован автоматический
        $.no_ack(false)                       если false, то при получении сообщение, оно будет сразу подвержено,
                                              если true, то сообщение будет считаться обработанным после явного подтверждения методом ack
        $.nowait(false)                       если установлено true, сервер не будет отвечать на метод. Клиенту не следует ожидать ответа метода
        $.callback[$my_callback_method]       функция для обработки сообщений
    ]
        Слушать сообщение из очереди
        (Если серверу не удалось выполнить метод, он вызовет исключение канала или соединения)

    @my_callback_method[$h]
        $h.msg                                string - сообщение
        $h.delivery_tag                       string - тег доставки(используется для подтверждения сообщения)
        $h.consumer_tag                       string - идентификатор слушателя
        $h.exchange                           string - название биржи
        $h.queue                              string - название очереди
        $h.properties                         hash - доп свойства для сообщения например можно установить заголовки
        
        Пример функции, которая будет обрабатывать сообщения

    ^oAmqp.stop_consume[]
        Остановить прослушивание очереди


    ^oAmqp.ack[delivery_tag]
        Подтвердить обработку сообщение

    ^oAmqp.reject[delivery_tag]
        Отклонить обработку сообщение и вернуть его обратно в очередь
</pre>]]></description>
<author>sergei v.2</author>
<pubDate>Thu, 11 Sep 2025 17:18:20 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=86910</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=86910</guid>
</item>
<item>
<title>Альтернативный драйвер для постгреса</title>
<description><![CDATA[Четыре года назад сделал форк Постгресовского драйвера, но забыл написать в форум. :)

https://github.com/unhandled-exception/parser3postgresql

Форк драйвера Постгреса из Парсера для современных версий Постгреса (9.6 и выше). Строка подключения не Парсеровская, а стандартная <a href="https://postgrespro.ru/docs/postgresql/17/libpq-connect#LIBPQ-CONNSTRING">Постгресовская в uri-формате</a>. Альтернативный драйвер не делает никаких конвертаций кодировок и автоматических транзакций. Если у вас не весь код в utf-8, то посмотрите на параметр client_encoding в описании к libpq.

Это может быть нужно, если требутеся тонко настраивать libpq, например для выбора пишущей или читающей реплики в кластерной топологии Постгреса.

Драйвер в исходниках, бинарных версий не планируется.]]></description>
<author>Sumo</author>
<pubDate>Fri, 29 Aug 2025 08:31:05 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=86874</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=86874</guid>
</item>
<item>
<title>Вариант сборки двоичного файла из частей</title>
<description><![CDATA[Добрый день.
Когда нужно иметь возможность заливать большие файлы и не нарваться на лимиты по таймауту и размеру, можно загружать файлы частями, а потом их собирать.

В доке сказано, что:
<blockquote>^файл.save[формат;имя файла;опции]   [3.4.0]
Формат - формат сохранения файла (text или binary);
$.append(false|true) - если файл существует, то дописать файл в конец существующего файла; по умолчанию, если файл с указанным именем существует, то он будет перезаписан.   [3.4.6] </blockquote>

Где-то на форуме писали, что парсер работает с бинарниками в ограниченном режиме, но для текстовых файлов параметр <b>append</b> тоже не работает:
<pre>	$fFile[^file::load[text;data.txt]]
	^fFile.save[text;data1.txt;
		$.append(true)
	]</pre>
Получаем:
<pre>save
called with invalid option</pre>

Написал метод сборки любых файлов:
<pre>########################################
# sPartsPath - путь к папке с частями файла
# sSavePath - путь для сохранения собранного файла
@assembleFile[sPartsPath;sSavePath][locals]
	$tParts[^file:list[$sPartsPath]]
	^tParts.menu{
		$fFile[^file::load[binary;$sPartsPath/$tParts.name]]
		$sFileBase64[${sFileBase64}^fFile.base64[]]
	}
	$fFile[^file::base64[binary;1.bin;$sFileBase64]]
	^fFile.save[binary;$sSavePath]
	$result[]</pre>

Метод работает, но смущает необходимость перегонять данные в BASE64 туда-обратно вместо использования опции <b>append</b> при сохранении файла.
На текущий момент других вариантов я не знаю.

Может, стоить починить <b>append</b> при сохранении файлов и добавить туда возможность дописывать в бинарники?
Или уже есть аналогичный функционал без танцев с бубном?)]]></description>
<author>virusav</author>
<pubDate>Thu, 28 Aug 2025 18:40:28 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=86857</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=86857</guid>
</item>
<item>
<title>Можно ли реализовать, чтобы mail:send возвращал ответ smtp сервера?</title>
<description><![CDATA[Если отправлять почту например telnet-ом через exim:

telnet my-exim-test 25
Trying 172.18.0.106...
Connected to my-exim-test.
Escape character is &apos;^]&apos;.
220 mydomain.ru ESMTP Exim 4.96 Wed, 27 Aug 2025 17:59:02 +0000

helo mydomain.ru
250 mydomain.ru Hello my-ssh.my-net [172.18.0.55]
mail from:info@mydomain.ru
250 OK
rcpt to:ivanov@mail.ru
250 Accepted
data
354 Enter message, ending with &quot;.&quot; on a line by itself
subject:QQQQQ
WWW DDDD
.
250 OK id=1urKT0-00001D-0Z

Мы получаем в ответ идентификатор письма, которое мы запихнули в exim (id=1urKT0-00001D-0Z)
Было бы здорово, если бы можно было сделать $sMsgId[^mail:send[....]]]]></description>
<author>sergei v.2</author>
<pubDate>Wed, 27 Aug 2025 18:15:53 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=86856</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=86856</guid>
</item>
<item>
<title>^table.menu{} - поведение ?</title>
<description><![CDATA[<blockquote>^таблица.menu{код}  

Метод menu выполняет код для каждой строки таблицы, последовательно перебирая все строки.
</blockquote>

а если курсор у table стоял условно по центру - ^.menu{} ВСЕГДА начнет с нулевой (сначала) позиции?

а после окончания ^.menu{} - курсор вернется на нулевую позицию, на там где бьіл до меню или останется в конце ?]]></description>
<author>AK666</author>
<pubDate>Fri, 22 Aug 2025 20:28:07 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=86851</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=86851</guid>
</item>
<item>
<title>decimal: планируется ли?</title>
<description><![CDATA[Добрый день.
Уже известная проблема с double:
<pre>$i1(0.7)
$i2(0.1)
$i3($i1+$i2)
$i4($i3*10)
$i5(0.8)
i1: $i1=&gt;^i1.format[%0.20f]
# 0.7=&gt;0.69999999999999995559
i2: $i2=&gt;^i2.format[%0.20f]
# 0.1=&gt;0.10000000000000000555
i3: $i3=&gt;^i3.format[%0.20f]
# 0.8=&gt;0.79999999999999993339
i4: $i4=&gt;^i4.format[%03d]
# 8=&gt;007

1. ^if($i1+$i2==$i5){TRUE}{FALSE}
# FALSE
2. ^if($i3==$i5){TRUE}{FALSE}
# FALSE
3. ^if(^i1.format[%0.1f]+^i2.format[%0.1f]==$i5){TRUE}{FALSE}
# FALSE
4. ^if($i3 eq $i5){TRUE}{FALSE}
# TRUE</pre>

Если $i1(0.5), а $i5(0.6), то все 4 условия выдадут TRUE.
Т.е. если попал не на те числа, то сам дурак.)

Планируется ли добавление типа decimal (или изменение double), чтобы можно было работать с точными данными из коробки?]]></description>
<author>virusav</author>
<pubDate>Fri, 22 Aug 2025 08:19:39 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=86850</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=86850</guid>
</item>
<item>
<title>Debian 13</title>
<description><![CDATA[Справочно: 9 августа вышел Debian 13, в нем parser 3.5.1 (по сути это 3.5.0 с добавленным оператором ^syslog[]). Так что в стабильном Debian теперь актуальная версия парсера, что бывает упрощает настройку серверов (и контейнеров).]]></description>
<author>moko</author>
<pubDate>Sun, 10 Aug 2025 22:44:51 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=86847</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=86847</guid>
</item>
<item>
<title>Периодически (раз в год) заходу посмотреть чем дышит Парсер сверяя его с этим &quot;эпичным тредом&quot;. Вот и array из 2016 года проклюнулся. https://www.parser.ru/forum/?id=83142 (-)</title>
<author>[Alex]</author>
<pubDate>Sun, 27 Jul 2025 14:59:15 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=86844</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=86844</guid>
</item>
<item>
<title>mysql и кавьічки в кавьічках в кавьічках</title>
<description><![CDATA[<pre>      UPDATE Task
      SET 
        final       = _utf8mb4&apos;^now.sql-string[]&apos;
      , result  = _utf8mb4&apos;^untaint[sql]{^json:string[$hashData;$.one-line(false)$.indent(true)]}&apos;
      WHERE 
        task = _utf8mb4&apos;^taskID.sql-string[]&apos;
</pre>

постоянно вьілетает по

<blockquote>You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near &apos;2 X  (1. Grade 2-10 mm sf 49’    2.GRADES 0-10mm sf 43’ )  AS PER ATTACHED C&apos; at line 4
</blockquote>

внутри hashData есть $.description
<blockquote>&quot;description&quot;:&quot;  PUMICE BUT MAX 13,500 SF ABOUT 43&apos;  2 X  (1. Grade 2-10 mm sf 49’    2.GRADES 0-10mm sf 43’ )  AS PER ATTACHED CARGO PLAN&quot;,</blockquote>]]></description>
<author>AK666</author>
<pubDate>Thu, 17 Jul 2025 23:42:57 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=86838</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=86838</guid>
</item>
<item>
<title>есть ли аналог mysqli::affected_rows для ^void:sql{UPDATE} ? (-)</title>
<author>AK666</author>
<pubDate>Tue, 15 Jul 2025 15:40:09 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=86835</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=86835</guid>
</item>
</channel>
</rss>