• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

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

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Разделение RT на 2 отдельных: текст и аттачи

  • Автор темы Omh
  • Дата начала
O

Omh

Камрады, доброе утро!

Голова ещё не работает так хорошо, что бы усиленно думать (тем более отпуск скоро), но уже достаточно для того что бы создать тему :)

Есть задачка распилить ричтекст, содержащий аттачи и текст на 2 ричтекста:
- в одном только текст
- во втором только аттачи

С первым проблем нет: сопируем RT, пробегаемся по embedded objects -> remove

А вот второе надо решить не сохраняя аттачи на диск.
Т.е. по аналогии: копируем RT, пробегаемся по параграфам -> удалаяем.
Но, насколько я помню, при удалении параграфа оставалась пустая строка, т.е. в результирующем РТ останутся не только аттачи, но и куча лишних enter'ов.

Это я пока теоретизирую, сейчас, конечно, попробую, но мне кажется что было именно так.

А, ну так вопрос:
есть идеи как ещё полочуть то, что мне надо?
у меня всплывает в голове DXL например, можно и туда ткнуться попробовать.
 
O

Omh

Morpheus
Ну я сначала попробую через NotesRichText... классы дёрнуть, если не выйдет красиво, попробую DXL.
 
O

Omh

Не, похоже нет смысла даже пытаться делать через NotesRich.
Откупориваем DXL.
 
O

Omh

Не, ещё не откупорил.
Пока играюсь с NotesRichTextRange.Remove
И даже неплохо работает, текст удаляет, аттачи оставляет.

Но проблема:
аттачи теряют Parent и отображаются внизу документа под чёрной чертой.
Что-то я не припоминаю, возможно их оттуда опять как-то вковырять обратно в нужное поле (без сохранения на диск)
 

savl

Lotus Team
28.10.2011
2 597
310
BIT
177
Можно попроще, без сохранения на диск.
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">код</div></div><div class="sp-body"><div class="sp-content">
Код:
Sub CopyAttachments (db As NotesDatabase, docSource As NotesDocument, docTarget As NotesDocument)
Dim docTemp As NotesDocument 

'Remove all attachments from existing document
Call docTarget.RemoveItem ("$FILE")

'Create a temporary document and use CopyAllItems from the current document
'because I know that will include the attachment
Set docTemp = db.CreateDocument
Call docSource.CopyAllItems (docTemp)

'Clear all items not named $File from the temp docSource, so that all that's left is the attachment
Forall item In docTemp.Items
If Not (Ucase(item.Name) = "$FILE") Then
docTemp.RemoveItem (item.Name)
End If 
End Forall

'Now, docTemp only has the attachments left on it
'CopyAllItems will copy the attachment, so use it to copy to docTarget
Call docTemp.CopyAllItems (docTarget)
Call docTarget.Save (True, False)
End Sub
 

VladSh

начинающий
Lotus Team
11.12.2009
1 783
157
BIT
55
<!--QuoteBegin-savl+-->
<table border="0" cellpadding="0" cellspacing="0" align="center" width="98%"> [tr] <td class="vbquote"> <table border="0" cellpadding="0" cellspacing="0" width="100%"> [tr] <td class="vbquote" width="75" valign="bottom"> <table border="0" cellpadding="0" cellspacing="0" width="50px"> [tr] <td class="vbquote" width="28" valign="top">
quot-top-left.gif
</td> <td class="vbquote" width="100%" style="background-image: url('style_images/ckr/quotes/quote-bg.gif'); background-position: center;" valign="middle"><span class="vbquote">Цитата:</span></td> <td class="vbquote" valign="top">
quot-top-right.gif
</td> [/tr] </table> </td> <td class="vbquote" align="left" style="background-image: url('style_images/ckr/quotes/quot-lr-bg.gif')" valign="bottom"></td><td class="vbquote" width="0" align="left" valign="bottom"> <table border="0" cellpadding="0" cellspacing="0" width="200"> [tr] <td class="vbquote" valign="top">
quot-by-left.gif
</td> <td class="vbquote" width="100%" style="background-image: url('style_images/ckr/quotes/quot-bye-bg.gif')" align="left" valign="middle" nowrap="nowrap"><span class="vbquote">(savl)</span></td> <td class="vbquote" valign="top">
quot-by-right.gif
</td> [/tr] </table> </td><td class="vbquote" width="100%" align="right" valign="bottom"> <table border="0" cellpadding="0" cellspacing="0" width="100%"> [tr] <td class="vbquote" width="100%"> <table border="0" cellpadding="0" cellspacing="0" width="100%"> [tr] <td class="vbquote" style="background-image: url('style_images/ckr/quotes/quot-top-bg.gif')" width="100%" valign="middle"></td> <td class="vbquote" align="left" valign="top">
quot-top-right-10.gif
</td> [/tr] </table> </td> [/tr] </table> </td> [/tr] </table> <table border="0" cellpadding="0" cellspacing="0" width="100%"> [tr] <td class="vbquote" width="10" style="background-image: url('style_images/ckr/quotes/quoting-left.gif')"></td> <td class="vbquotemain" width="100%" valign="top"></td> <td class="vbquote" width="10" style="background-image: url('style_images/ckr/quotes/quoting-right.gif')"></td> [/tr] [tr] <td class="vbquote" width="10" style="background-image: url('style_images/ckr/quotes/quot-left-bg.gif')"></td> <td class="vbquotemain" width="100%" valign="top"><!--QuoteEBegin-->Перенести Аттачи без сохранения на диск<!--QuoteEnd--></td> [/tr] [tr] [/tr] </table> </td> [/tr] </table>
<!--QuoteEEnd-->Стрёмный код.
1. Строка
Код:
Call docTarget.RemoveItem ("$FILE")
а если аттачи, которые уже были в документе нужны?
2. Код будет работать только для файлов, приатаченных к документу, т.к. при таком условии при удалении RT-поля, в которое вложен файл, автоматом удаляются его вложения-спутники-$FILE, т.е. информация о вложениях в RT-полях будет потеряна.

В итоге, код для каких-то очень узко специализированных случаев. Но я бы такое не рекомендовал; чего стоит хотя бы
Call docTarget.Save (True, False)
 

VladSh

начинающий
Lotus Team
11.12.2009
1 783
157
BIT
55
ToxaRat
Легче спросить "что так"? Такой ответ я бы послушал.
 

VladSh

начинающий
Lotus Team
11.12.2009
1 783
157
BIT
55
"что так" - работает, проблем не выявлено
Странно, а по моим наблюдениям это грозит конфликтами.
А если учесть то, что документ при любом изменении прекрасно сохраняется и при Save(False, то использование True становится, мягко выразиться, непонятным. Разве что из мазохизма.
 

ToxaRat

Чёрный маг
Green Team
06.11.2007
3 332
42
BIT
0
А если учесть то, что документ при любом изменении прекрасно сохраняется и при Save(False, то использование True становится, мягко выразиться, непонятным. Разве что из мазохизма.
аааа.... сохраняется, как же :rolleyes:
то ты просто не разобрался
 

VladSh

начинающий
Lotus Team
11.12.2009
1 783
157
BIT
55
Да, забыл сказать. Тохе и всем остальным, таким же разобравшимся, Save(True даже рекомендуется.
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
Всем привет!
Возникла необходимость копирования нодов из одного документа в другой.
В идеале конечно было бы не плохо получить xml-строку нода со всеми потомками и атрибутами.
Кто-то занимался таким? Какие пути решения?
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 940
609
BIT
210
КМК удобнее будет VDT (ввиду меньшего оверхеда по памяти)
DOM накладно получится
 

VladSh

начинающий
Lotus Team
11.12.2009
1 783
157
BIT
55
Если ноды item'ов, то проще всё-таки копировать сами item'ы.

Если обрабатывать xml обычных лотусовских доков, то, может хватить и DOM.
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Пару маленьких функций на LS (DOM)</div></div><div class="sp-body"><div class="sp-content">
Код:
%REM
Function SearchFirstNodeByName
Description: возвращает первую попавшуюся ноду по имени
Пример: передаётся родительская нода структуры и ищется первая нода, к примеру, filedata
<created>...</created>
<modified>...</modified>
<filedata>...</filedata>
%END REM
Function SearchFirstNodeByName(sourceDOMNode As NotesDOMNode, sNodeName As String) As NotesDOMNode
Dim DOMNodeEntry As NotesDOMNode

Set DOMNodeEntry = sourceDOMNode.FirstChild
Do While Not DOMNodeEntry.IsNull		'проход по самым верхним элементам

If DOMNodeEntry.NodeName = sNodeName Then
Set SearchFirstNodeByName = DOMNodeEntry
Exit Function
End If

Set DOMNodeEntry = DOMNodeEntry.NextSibling
Loop

End Function

%REM
Sub SetNextXMLEntry
Description: установка следующего элемента (item, par и т.п.)
%END REM
Sub SetNextXMLEntry(parDOMNode As NotesDOMNode)
Set parDOMNode = parDOMNode.NextSibling		'#text
If Not parDOMNode.IsNull Then
Set parDOMNode = parDOMNode.NextSibling		'следующий элемент
End If
End Sub
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
VladSh
Не, item не пойдет.
Идея скопировать аттачи из документа в документ минуя детач
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
Можно попроще, без сохранения на диск.
Оно-то проще, только этим методом копируются все поля со всем содержимым. Мне же нужны сугубо приатаченные файлы с сохранением ссылок в RT поле.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!