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

Тема в разделе "Lotus - Программирование", создана пользователем Omh, 4 авг 2011.

  1. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Камрады, доброе утро!

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

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

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

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

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

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

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    таже идея, и не надо на диск сохранять, и лишние пробелы если что подчистишь
     
  3. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Morpheus
    Ну я сначала попробую через NotesRichText... классы дёрнуть, если не выйдет красиво, попробую DXL.
     
  4. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.046
    Симпатии:
    18
    походу тут даже без вариантов
     
  5. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Не, похоже нет смысла даже пытаться делать через NotesRich.
    Откупориваем DXL.
     
  6. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Не, ещё не откупорил.
    Пока играюсь с NotesRichTextRange.Remove
    И даже неплохо работает, текст удаляет, аттачи оставляет.

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

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
    Можно попроще, без сохранения на диск.
    <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">
    Код (LotusScript):
    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
     
  8. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    <!--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">[​IMG]</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">[​IMG]</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">[​IMG]</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">[​IMG]</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">[​IMG]</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. Строка
    Код (LotusScript):
    Call docTarget.RemoveItem ("$FILE")
    а если аттачи, которые уже были в документе нужны?
    2. Код будет работать только для файлов, приатаченных к документу, т.к. при таком условии при удалении RT-поля, в которое вложен файл, автоматом удаляются его вложения-спутники-$FILE, т.е. информация о вложениях в RT-полях будет потеряна.

    В итоге, код для каких-то очень узко специализированных случаев. Но я бы такое не рекомендовал; чего стоит хотя бы
     
  9. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.046
    Симпатии:
    18
    а что с doc.Save(True..... - не так?
     
  10. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    ToxaRat
    Легче спросить "что так"? Такой ответ я бы послушал.
     
  11. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.046
    Симпатии:
    18
    "что так" - работает, проблем не выявлено

    а что НЕ так?
     
  12. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Странно, а по моим наблюдениям это грозит конфликтами.
    А если учесть то, что документ при любом изменении прекрасно сохраняется и при Save(False, то использование True становится, мягко выразиться, непонятным. Разве что из мазохизма.
     
  13. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.046
    Симпатии:
    18
    аааа.... сохраняется, как же :rolleyes:
    то ты просто не разобрался
     
  14. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Да, забыл сказать. Тохе и всем остальным, таким же разобравшимся, Save(True даже рекомендуется.
     
  15. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Всем привет!
    Возникла необходимость копирования нодов из одного документа в другой.
    В идеале конечно было бы не плохо получить xml-строку нода со всеми потомками и атрибутами.
    Кто-то занимался таким? Какие пути решения?
     
  16. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    КМК удобнее будет VDT (ввиду меньшего оверхеда по памяти)
    DOM накладно получится
     
  17. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Если ноды 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">
    Код (LotusScript):
    %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
     
  18. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    VladSh
    Не, item не пойдет.
    Идея скопировать аттачи из документа в документ минуя детач
     
  19. turumbay

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    item.copyToDocument?
     
  20. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Оно-то проще, только этим методом копируются все поля со всем содержимым. Мне же нужны сугубо приатаченные файлы с сохранением ссылок в RT поле.
     
Загрузка...

Поделиться этой страницей