Россыпь мелких вопросов

  • Автор темы Vagor.ini
  • Дата начала
V

Vagor.ini

Isk
Весь документ (форму) спроектировать как таблицу, в ячейки вставлять элементы, а сами ячейки скрывать или показывать в зависимости от условия.

Для этих целей можно и ввести блок настроечных полей.
 
V

Vagor.ini

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

Вместо этой открываем новую:) "Диалоги Lotus developers" вот ссылка https://codeby.net/threads/2112/
 
A

Anonimous

Меня тоже мелкий вопрос. Выбираю файл-вложение в поле RT. Беру его с рабочего стола. Если размер файла не 0, то OpenFileDialog его вкладывает спокойно. А если размер файла 0 байт, то тогда возникает ошибка "File Not Found", и этот пустой файлик с рабочего стола пропадает. В коде все стандартно

On Error Goto catchErr

Dim stFilenames As Variant
stFilenames = ws.OpenFileDialog(False, "Выберите файл-вложение ", Curdir$)

If Not(Isempty(stFilenames)) Then
Forall filename In stFilenames
' Вкладываем файлы

End Forall
End If

Exit Sub
catchErr:
Print "Error [" & Error & "] at line " & Cstr(Erl)
Resume out

Файл удаляется с рабочего стола в момент его выбора через OpenFileDialog. Поделитесь плиз, знаниями, почему так происходит.
Заранее спасибо
 
A

Anonimous

8.5.3. ОС у меня 7-ка, у пользователя Windows XP, но там тоже файл пропал. Файл исчезает со стола до строки If Not(Isempty(stFilenames)) Then

А полная версия кода такая
On Error Goto catchErr

Dim ws As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Dim lnFilesize As Long
Dim stFilenames As Variant
Set uidoc = ws.CurrentDocument
Dim rtitem As NotesRichTextItem, rtitem1 As NotesRichTextItem'
Dim object As NotesEmbeddedObject

stFilenames = ws.OpenFileDialog(False, "Выберите файл-вложение ", Curdir$)

If Not(Isempty(stFilenames)) Then
Forall filename In stFilenames
'Проверка размера файла
lnFilesize = Clng (Filelen (filename))
If lnFilesize > 10000000 Then
Msgbox "Размер вложения должен не превышать 10000000 B" & Chr (13) & "Размер выбранного файла " & filename & " - " & Cstr (lnFilesize) & " B", 16, "Размер вложения"
Exit Sub
Elseif lnFilesize = 0 Then
Msgbox "Размер вложения 0 B. Поэтому вложить его невозможно" & Chr (13) , 16, "Размер вложения"
Exit Sub
End If

Set rtitem = uidoc.Document.GetFirstItem ("RTAppendix")
If rtitem Is Nothing Then Set rtitem = New NotesRichTextItem( uidoc.Document, "RTAppendix" )

Set rtitem1 = New NotesRichTextItem( uidoc.Document, "RTAppendix1" )
Set object=rtitem1.EmbedObject(EMBED_ATTACHMENT,"",Cstr(filename))

rtitem.AppendRTItem rtitem1

rtitem1.Remove

Dim vAttach As Variant

vAttach=Evaluate({AttachmentsName},uidoc.Document)

vAttach=Fulltrim(Arrayappend(vAttach,Cstr(filename)))
uidoc.Document.ReplaceItemValue "AttachmentsName",vAttach


Dim docThis As NotesDocument
Set docThis = ws.CurrentDocument.Document
docThis.ReplaceItemValue("SaveOptions", "0").SaveToDisk = False
ws.CurrentDocument.Close
ws.ViewRefresh
ws.EditDocument True, docThis

End Forall
End If

out:
Exit Sub
catchErr:
Print "Error [" & Error & "] at line " & Cstr(Erl)
Resume out
 

savl

Lotus Team
28.10.2011
2 624
314
BIT
515
Anonimous
Файл исчезает со стола до строки If Not(Isempty(stFilenames))
Была такая трабла, папка пользователя в винде лежала на сетевом диске, тупо не мог получить файл.
Пришлось менять выбор файла для винды на winAPI (нашел в сети):
Код:
Необходимые константы и объявления:
Public Const OFN_ALLOWMULTISELECT = &H200
Public Const OFN_CREATEPROMPT = &H2000
Public Const OFN_ENABLEHOOK = &H20
Public Const OFN_ENABLETEMPLATE = &H40
Public Const OFN_ENABLETEMPLATEHANDLE = &H80
Public Const OFN_EXPLORER = &H80000
Public Const OFN_EXTENSIONDIFFERENT = &H400
Public Const OFN_FILEMUSTEXIST = &H1000
Public Const OFN_HIDEREADONLY = &H4
Public Const OFN_LONGNAMES = &H200000
Public Const OFN_NOCHANGEDIR = &H8
Public Const OFN_NODEREFERENCELINKS = &H100000
Public Const OFN_NOLONGNAMES = &H40000
Public Const OFN_NONETWORKBUTTON = &H20000
Public Const OFN_NOREADONLYRETURN = &H8000
Public Const OFN_NOTESTFILECREATE = &H10000
Public Const OFN_NOVALIDATE = &H100
Public Const OFN_OVERWRITEPROMPT = &H2
Public Const OFN_PATHMUSTEXIST = &H800
Public Const OFN_READONLY = &H1
Public Const OFN_SHAREAWARE = &H4000
Public Const OFN_SHAREFALLTHROUGH = 2
Public Const OFN_SHARENOWARN = 1
Public Const OFN_SHAREWARN = 0
Public Const OFN_SHOWHELP = &H10

' Declarations section

Dim sFolder As String
Dim sFiles As String
Dim sFile As String
Dim vbNullChar
Dim aFiles() As Variant
Dim nNullPos As Integer
Dim n As Integer
Dim Filter As String
Dim FileName As String
Dim FileTitle As String
Dim TruncName As String
Dim VaultWIPRoot As String
Dim VaultWIPUserPath As String
Type tagOPENFILENAME
lStructSize As Long
hwndOwner As Long
hInstance As Long
lpstrFilter As String
lpstrCustomFilter As Long
nMaxCustFilter As Long
nFilterIndex As Long
lpstrFile As String
nMaxFile As Long
lpstrFileTitle As String
nMaxFileTitle As Long
lpstrInitialDir As String
lpstrTitle As String
Flags As Long
nFileOffset As Integer
nFileExtension As Integer
lpstrDefExt As String
lCustData As Long
lpfnHook As Long
lpTemplateName As Long
End Type
Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" (OPENFILENAME As tagOPENFILENAME) As Long
Declare Function w32_DSGetSystemTempDirectory Lib "nnotes.dll" Alias "OSGetSystemTempDirectory" ( ByVal S As String) As Integer
Dim OPENFILENAME As tagOPENFILENAME

Код функции:
Function OpenCommDlg (allowMulti, initialTitle As String, initialDir As String)
On Error GoTo handler
Const FuncName = {Function "OpenCommDlg"}
Dim errStr As String

Dim Title As String
Dim DefExt As String
Dim szCurDir As String
Dim APIResults%

Title =initialTitle & Chr$(0) 'Title of the dialog

FileName = Chr$(0) & Space$(255) & Chr$(0)
FileTitle = Space$(255) & Chr$(0)


'Set up the default directory
szCurDir = initialDir+Chr(0) 'Curdir$ & Chr$(0)

'Set up the data structure before you call the GetOpenFileName
OPENFILENAME.lStructSize = Len(OPENFILENAME)

'If the OpenFile Dialog box is not linked to any form use this line.
'It will pass a null pointer.

OPENFILENAME.hwndOwner = 0&

OPENFILENAME.lpstrFilter = Filter
OPENFILENAME.nFilterIndex = 1
OPENFILENAME.lpstrFile = FileName
OPENFILENAME.nMaxFile = Len(FileName)
OPENFILENAME.lpstrFileTitle = FileTitle
OPENFILENAME.nMaxFileTitle = Len(FileTitle)
OPENFILENAME.lpstrTitle = Title
OPENFILENAME.hInstance = 0
OPENFILENAME.lpstrCustomFilter = 0
OPENFILENAME.nMaxCustFilter = 0
OPENFILENAME.lpstrInitialDir = szCurDir
OPENFILENAME.nFileOffset = 0
OPENFILENAME.nFileExtension = 0
OPENFILENAME.lCustData = 0
OPENFILENAME.lpfnHook = 0
OPENFILENAME.lpTemplateName = 0

If allowMulti Then
OPENFILENAME.Flags = OFN_FILEMUSTEXIST Or OFN_ALLOWMULTISELECT Or OFN_EXPLORER
Else
OPENFILENAME.Flags = OFN_FILEMUSTEXIST Or OFN_EXPLORER
End If

'This will pass the desired data structure to the Windows API,
'which will in turn it uses to display the Open Dialog form.
APIResults% = GetOpenFileName(OPENFILENAME)

If APIResults% <> 0 Then
OpenCommDlg = 1
Else
OpenCommDlg = 0
End If

vbNullChar=Chr(0)
sFiles = CStr( OPENFILENAME.lpstrFile )
nNullPos = InStr(sFiles, vbNullChar)

If nNullPos > OPENFILENAME.nFileOffset Then
' one file
sFiles = Left(sFiles, nNullPos - 1)
ReDim aFiles(1 To 1)
aFiles(1) = sFiles
Else
' multiple files
sFolder = Left(sFiles, nNullPos - 1)
sFiles = Mid(sFiles, nNullPos + 1)
nNullPos = InStr(sFiles, vbNullChar)

n = 0
Do While nNullPos > 1
sFile = sFolder & "\" & Left(sFiles, nNullPos - 1)
sFiles = Mid(sFiles, nNullPos + 1)
n = n + 1
ReDim Preserve aFiles(1 To n)
aFiles(n) = sFile
nNullPos = InStr(sFiles, vbNullChar)
Loop
End If
GoTo endh

handler:
ErrStr = libName & ", " & FuncName & ": " & Err &", в стр " & Erl & nLine & Error$
Error Err,ErrStr
endh:
End Function

Вызов:
if OpenCommDlg(False, "Файлы", "Desktop") = 1) then
' срепим файлы из массива aFiles
end if
Если все равно будет писать потом что файл не найден. Проверяйте длину пути, может превышать нужную.
У меня была и такая проблема, решили путем копирования файла с того места в темп и крепить из темпа:
Код:
		Set FSO = CreateObject("Scripting.FileSystemObject")
Call FSO.CopyFile(FilePath, newFilePath, 1)

P.S. На Mac методами Notes все прекрасно крепиться без костылей. Windows =)
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 983
611
BIT
453
раз стопицот сказано - не используйте виндошары воизбежании кастылей!
поднимите ФТП и спокойно забирайте файло стандартными инструментами
 

seoman2

Green Team
17.02.2010
507
1
BIT
72
Есть поле типа richtext, в нгем текст, есть абзацы.
Как текст получить в переменную variant, чтобы были разделители абзацев?

Пример:
В ричтекстполе:
"
ляляля. текст абзаца 1.
тратата. текст абзаца 2.
"
А в doc.getItemValue("ричтекстполе")(0) получаем просто одну строку "ляляля. текст абзаца 1.тратата. текст абзаца 2."

Добавлено: Есть поле типа richtext, в нгем текст, есть абзацы.
Как текст получить в переменную variant, чтобы были разделители абзацев?
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 983
611
BIT
453
seoman2 зачем это нужно? Странно обсуждать ваше видение решения, в то время как задача может иметь совершенно другой исход
излагайте задачу!
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
Есть поле типа richtext, в нгем текст, есть абзацы.
Как текст получить в переменную variant, чтобы были разделители абзацев?

Пример:
В ричтекстполе:
"
ляляля. текст абзаца 1.
тратата. текст абзаца 2.
"
А в doc.getItemValue("ричтекстполе")(0) получаем просто одну строку "ляляля. текст абзаца 1.тратата. текст абзаца 2."

Добавлено: Есть поле типа richtext, в нгем текст, есть абзацы.
Как текст получить в переменную variant, чтобы были разделители абзацев?
парсить xml
 

seoman2

Green Team
17.02.2010
507
1
BIT
72
Да, я так парсю XML.
С ричтекстового поля хочу текст по абзацам в html запихнуть.
Почему-то XLS лично у меня не как надо не обрабатывает лотусовый XML.
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 983
611
BIT
453
Да, я так парсю XML.
С ричтекстового поля хочу текст по абзацам в html запихнуть.
Почему-то XLS лично у меня не как надо не обрабатывает лотусовый XML.
смешались в кучу кони, люди... здесь уже были проекты по переводу DXL в HTML/PDF - NetWood и я делали...
с картинками с абзацами, цветами, параграфами
не XLS, а XSL! - ничего особенного в DXL нет
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 983
611
BIT
453
А конкретно по моему вопросу кто-то может подсказать?
а нет конкретного вопроса - есть ваше непонятное стремление сделать к-то откровенную...
есть "правильные" методы решения, а есть ...код, в в последнем стремлении - помогать нет желания
слушайте что вам подсказывают
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
А конкретно по моему вопросу кто-то может подсказать?
А чем твой вопрос отличается от других?
Есть одна особенность DXL. У меня XML получался кривой если в поле в свойствах Help Description и Fild Hint что-то написано. Не знаю если будет написано латиницей, но кириллица ломает.
 

seoman2

Green Team
17.02.2010
507
1
BIT
72
Конкретный вопрос - как в пеерменную получить текст с ричтекст поля, чтобы абзацы разделялись каким-то тегом.
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 983
611
BIT
453
Конкретный вопрос - как в пеерменную получить текст с ричтекст поля, чтобы абзацы разделялись каким-то тегом.
конкретный ответ - не надо так делать
ибо результатом является малоосмысленны набор с кот. что-то надо дальше делать
а вот про дальше - ни слова, а это самое основное
 

seoman2

Green Team
17.02.2010
507
1
BIT
72
а потом я выгружу содержимое переменной в файл xml

А как надо сделать?
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 983
611
BIT
453
Код:
Public DXLobj As DXLprocessing
 
Private ses As NotesSession
Private wks As NotesUIWorkspace
Private db As NotesDatabase
 
Private Const LIST_SEP={:}
 
Private Const attachBody={attachBody}
Private Const htmlTransform={HTMLTransform}
Private Const RT_FIELDS={attachBody:htmlTransform}
Private rtFields As Variant
 
'************************************************
'************************************************
Class DXLprocessingBase As ErrorHandler
Private DOM_off As Boolean
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub New(transformOnly As Boolean)
DOM_off=transformOnly
End Sub
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Function ApplyXSLT(doc As NotesDocument, ss As String) As NotesStream
On Error Goto ErrH
Dim lsTimer As New LsTimer()
Call lsTimer.StartTimer()
Dim XML_in As NotesStream
Dim XML_out As NotesStream	' output file
Dim out_obj As NotesXMLProcessor
 
'удаляем все "вспомогательные" РТ поля и вложения	  
Forall m In rtFields
If doc.HasItem(Cstr(m)) Then doc.RemoveItem(Cstr(m)):Print {Remove} & Cstr(m):Call doc.Save(True,False)
End Forall
 
Set XML_in=ses.CreateStream
Set XML_out=ses.CreateStream
XML_out.Truncate
 
Dim transformer As NotesXSLTransformer
 
On Error lsERR_NOTES_XSLT_INPUT_OBJECT Goto err_IN
On Error lsERR_NOTES_XSLT_OUTPUT_OBJECT Goto err_OUT
On Error lsERR_NOTES_XSLT_STYLESHEET_OBJECT Goto err_SS
On Error lsERR_NOTES_DXLEXPORTER_INPUT_OBJECT Goto err_DXLIN
 
Set transformer=ses.CreateXSLTransformer
Dim xslt As NotesStream
Set xslt = ses.CreateStream
Call xslt.Truncate
 
Call xslt.WriteText(ss) 'экономит время, но непредсказуемое форматирование вывода
'убираем все переносы строк, чтобы форматирование XSL не накладывалось на результат
'Call xslt.WriteText(Replace(ss,Split(Chr(10) & {:} & Chr(13),{:}),{}))
'		Print {XSLT size:} & Cstr(xslt.Bytes)
'таблица преобразований
Call transformer.SetStylesheet(xslt)
Call transformer.SetOutput(XML_out)
Set out_obj=transformer'для будущих вариантов обработки
 
If Not DOM_off Then
'включаем в цепочку DOM parser - для обработки в PostParse
Dim docDOM As NotesDOMParser
Set docDOM=ses.CreateDOMParser
Call docDOM.SetOutput(out_obj)
On Event PostDOMParse From docDOM Call postParse
Set out_obj=docDOM'для будущих вариантов обработки
End If
 
Dim exporter As NotesDXLExporter
Set exporter=ses.CreateDxlExporter(doc, out_obj)
exporter.ConvertNotesbitmapsToGIF=True
 
'	Dim importer As NotesDXLImporter
'	Set importer=ses.CreateDXLImporter(transformer, XML_out)
'	importer.DesignImportOption = DXLIMPORTOPTION_REPLACE_ELSE_IGNORE
 
Print {Processing to stream...}
Call exporter.Process
Call RTprocessing(doc, XML_out)
Call lsTimer.StopTimer()
Print Getthreadinfo(1) & { - elapsed time:}Format(lsTimer.GetSecondsLapsed(), "0.000")
'выводим результат
Set ApplyXSLT=XML_out
 
Quit:
Exit Function
err_IN:
Print "XSL Input error:XSLTransformer Process"
RaiseError
Resume Quit
err_OUT:
Print "XSL Output error:XSLTransformer Process"
RaiseError
Resume Quit
err_SS:
Print "Style Sheet error:XSLTransformer Process"
RaiseError
Resume Quit
err_DXLIN:
Print "DXL input Object error"
ErrH:
RaiseError
If (Not transformer Is Nothing) Then If Len(transformer.Log) > 0 Then Msgbox transformer.Log
Resume Quit
End Function
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub RTprocessing	(doc As NotesDocument, xml As NotesStream)
 
End Sub
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub postParse(xml As NotesDOMParser)
 
End Sub
End Class
 
'************************************************
'************************************************
Class DXLprocessing As DXLprocessingBase
Private attachments List As String
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub New(), DXLprocessingBase(False)
 
End Sub
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub RTprocessing	(doc As NotesDocument, xml As NotesStream)
Dim lsTimer As New LsTimer()
Call lsTimer.StartTimer()
Print {Processing to RT...}
'добавляем вложения (получены в PostParse)
Dim rt As NotesRichTextItem
Set rt=doc.CreateRichTextItem(attachBody)
rt.IsProtected=False
rt.IsEncrypted=False
rt.IsSigned=False
rt.IsSummary=False
Forall a In attachments
Call AddAttachment(a, doc, attachBody)
Call DeleteFile(a)
'Print {attach:} & a
End Forall
 
'результат кладём в РТ поле
Dim buff As New StringBuffer(DEF_BUFFER)
xml.Position=0
Do
buff.Append(xml.ReadText)
Loop Until xml.IsEOS
 
Call doc.ReplaceItemValue({Form}, {mainnotes})
Dim item As NotesItem
Set item=doc.ReplaceItemValue(htmlTransform, buff.toString)
item.IsSummary=True
Call doc.ComputeWithForm(False, False)
 
Call doc.Save(True, True)
Call lsTimer.StopTimer()
Print Getthreadinfo(1) & { - elapsed time:}Format(lsTimer.GetSecondsLapsed(), "0.000")
End Sub
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'обработка без наложения XSLT
Function ReplaceAttachDOM(doc As NotesDocument) As NotesStream
Dim docDOM As NotesDOMParser
Dim exporter As NotesDXLExporter
Dim importer As NotesDXLImporter
 
On Error Goto ErrH
Forall m In rtFields
If doc.HasItem(Cstr(m)) Then doc.RemoveItem(Cstr(m)):Call doc.Save(True,False)
End Forall
 
Dim XML_out As NotesStream
Set XML_out=ses.CreateStream
XML_out.Truncate
 
Set docDOM=ses.CreateDOMParser
Call docDOM.SetOutput(XML_out)
'здесь будут выдёргиваться вложения и меняться DXL
On Event PostDOMParse From docDOM Call postParse
 
Set exporter=ses.CreateDXLExporter(doc,docDOM)
exporter.ConvertNotesbitmapsToGIF=True
 
'	Set importer=ses.CreateDXLImporter(docDOM,db)
'	importer.DesignImportOption = DXLIMPORTOPTION_REPLACE_ELSE_IGNORE
Set ReplaceAttachDOM=XML_out
Quit:
Exit Function
ErrH:
RaiseError
Resume Quit
End Function
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub postParse(xml As NotesDOMParser)
On Error Goto ErrH
Dim lsTimer As New LsTimer()
Call lsTimer.StartTimer()
Dim root As NotesDOMDocumentNode
Dim nodeList As NotesDOMNodeList
Dim node As NotesDOMElementNode
 
Erase attachments
Dim embViewNode As NotesDOMElementNode
 
Set root=xml.Document
Set nodeList=root.GetElementsByTagName("noteinfo")
 
Dim fname As String
Set node=nodeList.GetItem(1)
fname=node.GetAttribute({noteid})
 
Dim path As String
'совместимость в ОС
path=Replace(ses.GetEnvironmentString("Directory", True), {\}, {/}) & {/} & fname
'path=ses.GetEnvironmentString("Directory", True) & {/} & fname
 
Set nodeList=root.GetElementsByTagName("picture")
Dim i As Long
For i=1 To nodeList.NumberOfEntries
Set node=nodeList.GetItem(i)
If node.HasChildNodes Then
Dim ext As String
ext={}
Dim imgnode As NotesDOMElementNode
Set imgnode=node.FirstChild
Print {image type:} & imgnode.TagName
Select Case Ucase(imgnode.TagName)
Case {JPEG}:ext={.jpg}
Case {GIF}:ext={.gif}
Case {CGM}:ext={.cgm}
Case Else:
ext={}
End Select
Dim part As String
part= Cstr(i) & ext
Dim out As NotesStream
Set out=ses.CreateStream
Dim encpath As String
encpath=path & Cstr(i) & {enc64}
If out.Open(encpath, {UTF-8}) Then
out.Position=0
Call out.Truncate
Dim s As String
s=imgnode.FirstChild.NodeValue
Print {Base64 len:}Cstr(Len(s))
Call out.WriteText(s)
Call out.Close()
Call Base64Obj.DecodeFileToFile(encpath, path & part)
Call DeleteFile(encpath)
imgnode.FirstChild.NodeValue=fname & part
attachments(fname & part)=path & part
Else
Print {Failed to open:} & encpath
End If
 
'			Do While Not Isnull(imgnode)
'				Set imgnode=imgnode.NextSibling
'			Loop
End If
Next
Call xml.Serialize
Call lsTimer.StopTimer()
Print Getthreadinfo(1) & { - elapsed time:}Format(lsTimer.GetSecondsLapsed(), "0.000")
Quit:
Exit Sub
ErrH:
RaiseError
Resume Quit
End Sub
End Class
Sub Initialize
Set ses=New NotesSession
Set wks=New NotesUIWorkspace
Set db=ses.CurrentDatabase
rtFields=Split(RT_FIELDS, LIST_SEP)
Set DXLobj=New DXLprocessing
End Sub
Код:
Option Public
Option Declare
Use "XML_XSLT"
 
Dim ses As NotesSession
Dim db As NotesDatabase
Dim agent As NotesAgent
Private Const DOC_XSL_PROFILE = {XSLProfile}
Sub Initialize
On Error Goto ErrH
Set ses=New NotesSession
Set db=ses.CurrentDataBase
Set agent=ses.CurrentAgent
'	Msgbox {Agent Start:} & agent.Name
Print {Agent Start:} & agent.Name
 
Dim id As String
id=agent.ParameterDocID
Dim doc As NotesDocument
If id<>{} Then
Print {NoteID:} & id
Set doc=db.GetDocumentByID(id)
Else
Set doc=ses.DocumentContext
End If
Dim xslProfile As NotesDocument
Set xslProfile=db.getProfileDocument(DOC_XSL_PROFILE)
Dim xslItem As NotesItem
Set xslItem = xslProfile.getFirstItem("rtxsl")
 
Dim out As NotesStream
Set out=DXLobj.ApplyXSLT(doc, xslItem.Text)
 
Dim path As String
path=ses.GetEnvironmentString("Directory", True)
Print {path:} & path
Call SaveStream(out, path & {/transform-result.xml}, {UTF-8})
Quit:Exit Sub
ErrH:
RaiseError
Resume Quit
End Sub
XML:
<code class='xml'><xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:d="http://www.lotus.com/dxl" exclude-result-prefixes="d">
<xsl:eek:utput method="html" indent="yes"/>
<!-- <xsl:strip-space elements="*"/> -->
<xsl:preserve-space elements="par"/>
<xsl:variable name="uid">
<xsl:value-of select="//d:document/d:noteinfo/@unid"/>
</xsl:variable>
<xsl:variable name="webdb">
<xsl:value-of select="//d:document/d:item[@name='webdb']"/>
</xsl:variable>
<xsl:variable name="pname">
<xsl:value-of select="//d:document/d:item[@name='DocPage']"/>
</xsl:variable>
<xsl:variable name="viewname">
<xsl:value-of select="//d:document/d:item[@name='DocView']"/>
</xsl:variable>
<xsl:template match="/">
<xsl:apply-templates select="//d:document"/>
</xsl:template>
<xsl:template match="d:document">
<xsl:apply-templates select="d:item"/>
</xsl:template>
<xsl:template match="d:item">
<xsl:apply-templates select="d:richtext"/>
</xsl:template>
<xsl:template match="d:richtext">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="d:table">
<table width="100%" cellspacing="0" cellpadding="0">
<xsl:attribute name="width">
<xsl:if test="@widthtype='fitmargins'">100%</xsl:if>
</xsl:attribute>
<xsl:attribute name="style">border-collapse: collapse;<xsl:if
test="string(d:border/@style)"> border-style: <xsl:choose>
<xsl:when test="d:border/@style='dot'">dotted</xsl:when>
<xsl:when test="d:border/@style='dash'">dashed</xsl:when>
<xsl:eek:therwise>
<xsl:value-of select="d:border/@style"/>
</xsl:eek:therwise>
</xsl:choose>; </xsl:if>
<xsl:if test="string(d:border/@width)"> border-width: <xsl:value-of select="d:border/@width"/>; <xsl:text/></xsl:if>
<xsl:if test="string(d:border/@color)"> border-color: <xsl:value-of select="d:border/@color"/>; <xsl:text/></xsl:if>
</xsl:attribute>
<tr>
<xsl:for-each select="d:tablecolumn">
<!--This sets the column widths-->
<th style="border: 0px 0px 0px 0px;">
<xsl:attribute name="width">
<xsl:choose>
<xsl:when test="contains(@width, 'in')">
<xsl:variable name="wd">
<xsl:value-of select="substring-before(@width, 'in')"/>
</xsl:variable>
<xsl:value-of select="72*$wd"/><xsl:text>px</xsl:text></xsl:when>
<xsl:eek:therwise><xsl:value-of select="@width"/><xsl:text>px</xsl:text></xsl:eek:therwise>
</xsl:choose>
</xsl:attribute></th><xsl:text/>
</xsl:for-each>
</tr>
<xsl:apply-templates/>
</table>
</xsl:template>
<xsl:template match="d:tablerow">
<tr>
<xsl:apply-templates/>
</tr>
</xsl:template>
<xsl:template match="d:tablecell">
<td valign="top">
<xsl:attribute name="style">border-width: <xsl:choose>
<xsl:when test="string(@borderwidth)">
<xsl:value-of select="@borderwidth"/>
</xsl:when>
<xsl:eek:therwise>1px <xsl:text/></xsl:eek:therwise>
</xsl:choose>; border-color: <xsl:text/>
<xsl:choose>
<xsl:when test="string(../../@cellbordercolor)">
<xsl:value-of select="../../@cellbordercolor"/>
</xsl:when>
<xsl:eek:therwise>black</xsl:eek:therwise>
</xsl:choose>; border-style: solid; <xsl:text/>
<xsl:choose>
<xsl:when test="string(@bgcolor)"> background-color: <xsl:value-of select="@bgcolor"/>; <xsl:text/>
</xsl:when>
</xsl:choose>
</xsl:attribute>
<xsl:apply-templates/>
</td>
</xsl:template>
<xsl:template match="d:pardef">
<!-- <xsl:comment> ****************** paragraph definition ****************** </xsl:comment> -->
<style>
.par_<xsl:value-of select="$uid"/>
_<xsl:value-of select="@id"/>
{<xsl:if test="@align!=''">text-align: <xsl:value-of select="@align"/>;</xsl:if>
font-family: sans-serif;
color: black;
font-size: 10pt;
font-weight: normal;
text-decoration: none;
}
</style>
</xsl:template>
<!--tabreplace function-->
<xsl:template name="tabreplace">
<xsl:param name="str" select="."/>
<xsl:param name="search-for" select="'	'"/>
<xsl:param name="replace-with">	</xsl:param>
<xsl:choose>
<xsl:when test="contains($str, $search-for)">
<xsl:value-of select="substring-before($str, $search-for)"/>
<xsl:copy-of select="$replace-with"/>
<xsl:call-template name="tabreplace">
<xsl:with-param name="str"
select="substring-after($str, $search-for)"/>
<xsl:with-param name="search-for" select="$search-for"/>
<xsl:with-param name="replace-with" select="$replace-with"/>
</xsl:call-template>
</xsl:when>
<xsl:eek:therwise>
<xsl:value-of select="$str"/>
</xsl:eek:therwise>
</xsl:choose>
</xsl:template>
<xsl:template match="text()">
<!-- <xsl:comment> ****************** text match ****************** </xsl:comment> -->
<xsl:variable name="txt" select="."/>
<xsl:choose>
<xsl:when test="starts-with($txt,' ')">
<xsl:variable name="norm" select="normalize-space($txt)"/>
<xsl:variable name="space">
<xsl:choose>
<xsl:when test="contains($norm,' ')">
<xsl:value-of select="substring-before($txt,substring-before($norm,' '))"/>
</xsl:when>
<xsl:eek:therwise>
<xsl:value-of select="substring-before($txt,$norm)"/>
</xsl:eek:therwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="replacement"><xsl:text> </xsl:text></xsl:variable>
<xsl:call-template name="tabreplace">
<xsl:with-param name="str">
<xsl:value-of select="translate($space, '
', $replacement)"/>
<xsl:value-of select="substring-after($txt,$space)"/>
</xsl:with-param>
</xsl:call-template>
</xsl:when>
<xsl:eek:therwise>
<!-- <xsl:value-of select="$txt"/> -->
<xsl:call-template name="tabreplace"/>
</xsl:eek:therwise>
</xsl:choose>
</xsl:template>
<xsl:template match="d:par">
<xsl:variable name="defnum">
<xsl:value-of select="@def"/>
</xsl:variable>
<xsl:choose>
<xsl:when test="contains(//d:document/d:item/d:richtext/d:pardef[@id=$defnum]/@list, 'bullet') or
contains(//d:document/d:item/d:richtext/d:table/d:tablerow/d:tablecell/d:pardef[@id=$defnum]/@list, 'bullet')">
<xsl:if test="preceding-sibling::d:par[1]/@def!=$defnum">
<xsl:text disable-output-escaping="yes"><![CDATA[<ul>]]></xsl:text>
</xsl:if>
<li>
<xsl:attribute name="class">par_<xsl:value-of select="$uid"/>_<xsl:value-of select="@def"/></xsl:attribute>
<xsl:apply-templates/>
</li>
<xsl:if test="following-sibling::d:par[1]/@def!=$defnum">
<xsl:text disable-output-escaping="yes"><![CDATA[</ul>]]></xsl:text>
</xsl:if>
</xsl:when>
<xsl:when test="contains(//d:document/d:item/d:richtext/d:pardef[@id=$defnum]/@list, 'number') or contains(//d:document/d:item/d:richtext/d:table/d:tablerow/d:tablecell/d:pardef[@id=$defnum]/@list, 'number')">
<xsl:if test="preceding-sibling::d:par[1]/@def!=$defnum">
<xsl:text disable-output-escaping="yes"><![CDATA[<ol>]]></xsl:text>
<xsl:attribute name="class">par_<xsl:value-of select="$uid"/>_<xsl:value-of select="@def"/></xsl:attribute>
</xsl:if>
<li>
<xsl:attribute name="style">font-family: <xsl:text/>
<xsl:value-of select="d:run/d:font/@name"/>; font-size: <xsl:value-of select="d:run/d:font/@size"/>; <xsl:text/>
<xsl:choose>
<xsl:when test="contains(d:run/d:font/@style, 'bold')">font-weight: bold;</xsl:when>
<xsl:eek:therwise>font-weight: normal;</xsl:eek:therwise>
</xsl:choose>
<xsl:choose>
<xsl:when test="contains(d:run/d:font/@style, 'italic')"> <xsl:text/>font-style: italic;</xsl:when>
<xsl:eek:therwise>font-style: normal;</xsl:eek:therwise>
</xsl:choose>
<!--Can't have both selected at same time-->
<xsl:choose>
<xsl:when test="contains(d:run/d:font/@style, 'superscript')">vertical-align: super;<xsl:text/></xsl:when>
<xsl:when test="contains(d:run/d:font/@style, 'subscript')">vertical-align: sub;<xsl:text/></xsl:when>
<xsl:eek:therwise>vertical-align: bottom;<xsl:text/></xsl:eek:therwise>
</xsl:choose><!--Could potentially have both selected here-->text-decoration: <xsl:text/>
<xsl:choose>
<xsl:when test="contains(d:run/d:font/@style, 'underline')">underline <xsl:text/></xsl:when>
<xsl:when test="contains(d:run/d:font/@style, 'strikethrough')">line-through <xsl:text/></xsl:when>
<xsl:eek:therwise>none<xsl:text/></xsl:eek:therwise>
</xsl:choose>; color: <xsl:text/>
<xsl:choose>
<xsl:when test="string(d:run/d:font/@color)">
<xsl:value-of select="d:run/d:font/@color"/>
</xsl:when>
<xsl:eek:therwise>black<xsl:text/></xsl:eek:therwise>
</xsl:choose>;<xsl:text/>
</xsl:attribute>
<xsl:attribute name="class">par_<xsl:value-of select="$uid"/>_<xsl:value-of select="@def"/></xsl:attribute>
<xsl:apply-templates/>
</li>
<xsl:if test="following-sibling::d:par[1]/@def!=$defnum">
<xsl:text disable-output-escaping="yes"><![CDATA[</ol>]]></xsl:text>
</xsl:if>
</xsl:when>
<xsl:eek:therwise>
<div>
<xsl:attribute name="class">par_<xsl:value-of select="$uid"/>_<xsl:value-of select="@def"/></xsl:attribute>
<xsl:apply-templates/>
</div>
</xsl:eek:therwise>
</xsl:choose>
</xsl:template>
<xsl:template match="d:urllink">
<!-- <xsl:comment> ****************** urllink definition ****************** </xsl:comment> -->
<a>
<xsl:attribute name="href">
<xsl:value-of select="@href"/>
</xsl:attribute>
<xsl:apply-templates/>
</a>
</xsl:template>
<xsl:template match="d:run">
<span>
<xsl:attribute name="style">font-family: <xsl:text/>
<xsl:value-of select="d:font/@name"/>; font-size: <xsl:text/>
<xsl:value-of select="d:font/@size"/>;<xsl:text/>
<xsl:choose>
<xsl:when test="contains(d:font/@style, 'bold')">font-weight:bold;</xsl:when>
<xsl:eek:therwise>font-weight:normal;</xsl:eek:therwise>
</xsl:choose>
<xsl:choose>
<xsl:when test="contains(d:font/@style, 'italic')"> font-style:italic;</xsl:when>
<xsl:eek:therwise>font-style:normal;</xsl:eek:therwise>
</xsl:choose>
<!--Can't have both selected at same time-->
<xsl:choose>
<xsl:when test="contains(d:font/@style, 'superscript')">vertical-align: super; </xsl:when>
<xsl:when test="contains(d:font/@style, 'subscript')">vertical-align: sub; </xsl:when>
<xsl:eek:therwise>vertical-align: bottom; </xsl:eek:therwise>
</xsl:choose><!--Could potentially have both selected here-->text-decoration: <xsl:choose>
<xsl:when test="contains(d:font/@style, 'underline')">underline </xsl:when>
<xsl:when test="contains(d:font/@style, 'strikethrough')">line-through</xsl:when>
<xsl:eek:therwise>none</xsl:eek:therwise>
</xsl:choose>; color: <xsl:choose>
<xsl:when test="string(d:font/@color)">
<xsl:value-of select="d:font/@color"/>
</xsl:when>
<xsl:eek:therwise>black</xsl:eek:therwise>
</xsl:choose>;</xsl:attribute>
<xsl:apply-templates/>  </span>
</xsl:template>
<xsl:template match="d:attachmentref">
<a target="8">
<xsl:attribute name="href"><xsl:value-of select="$viewname"/>/<xsl:value-of
select="$pname"/>/$FILE/<xsl:value-of select="@name"/></xsl:attribute>
<img>
<xsl:attribute name="height">
<xsl:value-of select="d:picture/@height"/>
</xsl:attribute>
<xsl:attribute name="width">
<xsl:value-of select="d:picture/@width"/>
</xsl:attribute>
<xsl:attribute name="src">/<xsl:value-of select="$webdb"/>/0/<xsl:value-of select="$uid"/>/$FILE/<xsl:value-of select="d:picture/d:gif"/></xsl:attribute>
<xsl:attribute name="border">0</xsl:attribute>
</img>
</a>
</xsl:template>
<xsl:template match="d:picture">
<!-- <xsl:comment> ****************** picture definition ****************** </xsl:comment> -->
<img>
<xsl:attribute name="height">
<xsl:value-of select="@height"/>
</xsl:attribute>
<xsl:attribute name="width">
<xsl:value-of select="@width"/>
</xsl:attribute>
<xsl:attribute name="src">/<xsl:value-of select="$webdb"/>/0/<xsl:value-of select="$uid"/>/$FILE/<xsl:value-of select="d:gif"/></xsl:attribute>
<xsl:attribute name="border">0</xsl:attribute>
</img>
</xsl:template>
 
</xsl:stylesheet>
 
Последнее редактирование модератором:
S

Serduko

Добрый день, есть ли в Lotusscript аналог Javaвского - Object1.equals(Object2)?
 
Мы в соцсетях:

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