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

Omh

Lotus team
04.07.2007
2 210
1
#1
Камрады, доброе утро!

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

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

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

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

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

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

Omh

Lotus team
04.07.2007
2 210
1
#3
Morpheus
Ну я сначала попробую через NotesRichText... классы дёрнуть, если не выйдет красиво, попробую DXL.
 

Omh

Lotus team
04.07.2007
2 210
1
#5
Не, похоже нет смысла даже пытаться делать через NotesRich.
Откупориваем DXL.
 

Omh

Lotus team
04.07.2007
2 210
1
#6
Не, ещё не откупорил.
Пока играюсь с NotesRichTextRange.Remove
И даже неплохо работает, текст удаляет, аттачи оставляет.

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

savl

Lotus team
28.10.2011
2 136
105
#7
Можно попроще, без сохранения на диск.
<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 262
6
#8
<!--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">
</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">
</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">
</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">
</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">
</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 262
6
#10
ToxaRat
Легче спросить "что так"? Такой ответ я бы послушал.
 

VladSh

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

ToxaRat

Чёрный маг
Lotus team
06.11.2007
3 231
18
#13
А если учесть то, что документ при любом изменении прекрасно сохраняется и при Save(False, то использование True становится, мягко выразиться, непонятным. Разве что из мазохизма.
аааа.... сохраняется, как же :rolleyes:
то ты просто не разобрался
 

VladSh

начинающий
Lotus team
11.12.2009
1 262
6
#14
Да, забыл сказать. Тохе и всем остальным, таким же разобравшимся, Save(True даже рекомендуется.
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 809
21
#15
Всем привет!
Возникла необходимость копирования нодов из одного документа в другой.
В идеале конечно было бы не плохо получить xml-строку нода со всеми потомками и атрибутами.
Кто-то занимался таким? Какие пути решения?
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 586
272
#16
КМК удобнее будет VDT (ввиду меньшего оверхеда по памяти)
DOM накладно получится
 

VladSh

начинающий
Lotus team
11.12.2009
1 262
6
#17
Если ноды 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 809
21
#18
VladSh
Не, item не пойдет.
Идея скопировать аттачи из документа в документ минуя детач
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 809
21
#20
Можно попроще, без сохранения на диск.
Оно-то проще, только этим методом копируются все поля со всем содержимым. Мне же нужны сугубо приатаченные файлы с сохранением ссылок в RT поле.