Den Text eines RichTextItems ausgeben

  • Hallo zusammen,


    derzeit habe ich ein kleines Problem mit dem durchlaufen eines RichTextitems mit Hilfe des RichTextNavigators.


    Ich habe mal folgendes Dokument mit einem Richtextitem angelegt.


    Zitat


    eins
    zwei


    drei
    vier


    Wenn ich auf dieses Dokument mal folgenden Code anschmeisse, gibt er mir komischerweise 4 aus. Er scheint als irgendwie die Leerzeile zu überlesen.



    Das blöde an der Geschichte ist es, dass ich die Leerzeilen auch brauche =:(


    Hat jemand eine Idee, wie das kommt bzw wie ich das umgehen kann?

  • Was ich haben möchte ist der Text (unformatiert), der in dem Richtextitem steht und das Zeile für Zeile.


    Mit der Methode getText (weil ich in einem Java Agent seien werde), kommen komischerweise Zeilenumbrüche in den Texten, die im Feld nicht eingegeben wurden.


    /EDIT:


    Um das zu verdeutlichen habe ich mal zwei Screenshots angehangen. Einmal das Ergebnis des getText in java und das andere ist der Inhalt, wie er in Notes eingegeben wurde.

  • strValue = Replace(strValue,Chr(13), " ")
    strValue = Replace(strValue,Chr(10), " ")
    strValue = Replace(strValue,Chr(9), " ")


    einfach rausfiltern aus dem Text


    P.S.: aber ich denke, du brauchst die Leerzeile?


    P.S: P.S: das soll dann für Java sein?

  • Also, ich fange noch mal von vorne an:


    Es gibt ein Document, wo ich ein richtextitem habe. Dort gibt es Text, mit Zeilenumbrüchen.
    Lese ich nun in Java (jawohl es muss Java sein, weil ich noch andere Komponenten nutze, die Java voraussetzen) den Text mit getText aus, macht die Methode mir an (aus meiner Sicht willkürlichen) Stellen einen Zeilenumbruch rein.


    Damit fällt Deine alternative weg, da ich nicht radikal alles ersetzen kann, denn es gibt wie gesagt gewollte und nicht gewollte Umbrüche. Ich denke, dass die beiden Screenshots das deutlich zeigen. Denn in Notes habe ich hier insgesamt 4 Absätze mit dem schönen Text (3 Zeilen, 1 Leerzeile, 1 Zeile, 1 Zeile, 1 Leerzeile 1 Zeile). Der String, der sich dann in Java ergibt, wird leider etwas komisch umgesetzt.
    Denn da sieht man schon eindeutig, dass der in Notes als 1 Abschnitt dargestellte Text auf einmal 7 Zeilen lang ist und dort eben immer ein \n eingefügt wurde, warum auch immer.


    Daraus sollte sich dein P.S. und P.S. P.S. klären.


    Ich will halt jeden Abschnitt, wie er in dem Notesrichtextitem steht als eigenständigen String auswerten können.


    Alles roger?


    Übrigens habe ich gerade rausgefunden, dass es kein Javaproblem ist.
    Es lässt sich recht leicht nachstellen. Hier ein Screenshot aus dem Notesdebugger:

  • kann ich so bestätigen, ist tatsächlich ein Umbruch:


    myText = Implode(Split(item.Text, Chr(13)), "***")
    Msgbox myText


    aber in den Properties des Feldes kann ich es kopieren und im Editor eingefügt ist es ohne zuviel Umbrüche...


    Oder einfach:
    Messagebox item.Abstract(5000, True, False),, "Body abstract"

  • Schade das du das bestätigen kannst, denn eine Lösung wäre mir lieber gewesen. :(


    Das mit item.Abstract(..) geht leider auch nicht. Wie Dein Screenshot auch zeigt, gehen dabei reguläre Leerzeilen verloren.

  • Kannst Du haben wird Dir aber auch nicht gefallen, weil viel Arbeit :-):
    Das Dokument per DXL exportieren, wie man hier nur schlecht sieht, sind die "echten" Umbrüche "Breaks" und die anderen muss man mit replace Filtern und dann die einzelnen Blöcke zusammensetzen...


    Halbwegs verständlich?


    edit: Sorry, wird alls html teilweise interpretiert, daher im Anhang...

  • Hat mal jemand einen 6428:9-Bildschirm für mich...??? :)

    [color=0000CC]"Wir können Probleme nicht mit dem Denken lösen,
    das zu ihnen geführt hat." ( A. Einstein )[/color]

  • Jo, den Weg mit dem DXL Export habe ich auch schon angetestet. Allerdings (vielleicht aufgrund der Komplexität) wieder davon weg.


    Weil irgendwie hatte ich Probleme die DXL-Datei entsprechend zu parsen, damit ich als Resultat nur den von mir gewünschten Text zu bekommen.


    Ich hatte mir gedacht, dass ich in der Datei nach <item name="body"> suche, damit ich mein item finde. Dann aus den folgenden Zeilen bis zum </item> alles was zwischen < und > (inkl. des < und >) rausschmeisse, damit ich auf den plaintext komme.
    Aber irgendwie kam da auch nichts besonderes bei rum.



    Hast du da mal einen kleinen Schupser in die richtige Richtung für mich? :hammer:


    Ach ja. Irgendwie sieht meine DXL Datei aber ein wenig anderst aus oder?

  • also, ich nehme zur Ansicht für dxl den firefox, der macht das ganz hübsch finde ich. Das wollte ich dann hier einkopieren, sah über fürchterlich aus und bevor ich Steve_O einen neuen TFT verkaufe :-), habe ich das ausgeschnitten und in eine txt kopiert. Dabei ist wohl einiges ersetzt worden...TXT geht ja eh nicht, also habe ich das in jpg umgewandelt... Letzten Endes sehen die par-Tags etc. schon so aus wie bei Dir... Komisch nur, dass bei Dir gar keine <breaks> sind...
    Inhalt als HTML und MIME hast Du auch, sonst wäre da nur Salat...


    Bei Gelegenheit werde ich mal was basteln, wenn mir keiner zuvor kommt (erwartungsvoll)...momentan muss ich hier mal was tun...

  • Oh ha. Im Mozilla sieht das ja wirklich schick aus.
    Ich bin mir nur nicht sicher, ob da nicht so Kleinigkeiten wie bspws. irgendwelche umbrüche flöten gehen.


    Naja, egal. Ich werde auch mal parallel weiterschauen.
    Mal sehen, wer hier als erster postet :D

  • So, jetze einen Button in die Ansicht:
    Sub mit subs und functions:


    Declarations:
    Dim lstText List As String
    Dim intCount As Integer


    Sub Click(Source As Button)
    Dim ws As New notesuiworkspace
    Dim ns As New notessession
    Dim db As notesdatabase
    Dim vw As notesview
    Dim col As Notesdocumentcollection
    Dim exporter As notesdxlexporter
    Dim parser As notesdomparser
    Dim importer As notesdxlimporter
    Dim strText As String
    Dim blnExport2HDD As Boolean
    Dim i As Integer

    Set db = ns.CurrentDatabase
    Set col = db.UnprocessedDocuments
    If col.count > 0 Then
    Set exporter = ns.CreateDXLExporter
    Set parser = ns.CreateDOMParser()
    Set importer = ns.CreateDXLImporter
    Call exporter.SetInput(col)
    Call exporter.SetOutput(parser)
    If blnExport2HDD Then 'DebugHelfer
    Msgbox "Pech gehabt.", 64, "Systemarbeiten..."
    Dim stream As notesstream
    Set stream = ns.CreateStream
    Call stream.Open("C:\Export.dxl")
    Call stream.Truncate
    Call parser.setOutput(stream)
    Else
    Call parser.setOutput(importer)
    Call importer.SetOutput(db)
    importer.ReplaceDBProperties = False
    importer.DocumentImportOption = DXLIMPORTOPTION_UPDATE_ELSE_CREATE
    importer.ReplicaRequiredForReplaceOrUpdate = False
    End If
    On Event PostDOMParse From parser Call ParseEvent
    Call exporter.process
    Forall x In lstText
    strText = strText + x
    End Forall
    Msgbox strText
    End If
    End Sub


    Sub ParseEvent(source As NotesDOMParser)
    Dim domdoc As notesDOMDocumentNode
    Dim rtNodeList As notesDOMNodeList
    Dim rtNode As notesDOMElementNode
    Dim rtPos As Integer
    Dim parNodeList As notesDOMNodeList
    Dim parNode As notesDOMNode
    Dim parPos As Integer

    Set domdoc = source.Document
    Set rtNodeList = domdoc.GetElementsByTagName("richtext")
    If rtNodeList.NumberOfEntries > 0 Then
    For rtPos = 1 To rtNodeList.NumberOfEntries
    Set rtNode = rtNodeList.GetItem(rtPos)
    Set parNodeList = domdoc.GetElementsByTagName("par")
    If parNodeList.NumberOfEntries > 0 Then
    For parPos = 1 To parNodeList.NumberOfEntries
    Set parNode = parNodeList.GetItem(parPos)
    Call rekursivChildNodes(parNode)
    Next
    End If
    Next
    End If
    Call source.serialize
    End Sub


    Sub rekursivChildNodes(parentNode As NotesDOMNode)
    Dim ChildNode As notesDOMNode

    Set childNode = parentNode.firstchild
    Do Until childNode.IsNull
    Call rekursivChildNodes(childNode)
    If childNode.NodeType = 3 Then
    lstText(intCount) = Replace(childNode.NodeValue, Chr(13), "")
    intCount = intCount + 1
    End If
    If childNode.NodeName = "break" Then
    lstText(intCount) = Chr(13)
    intCount = intCount + 1
    End If
    Set childNode = childNode.nextSibling
    Loop
    End Sub


    Ich denke es brauch noch ein bisschen Feintuning...

  • Ui, da hast du ja mal richtig geproggt ... =:)


    Aber so ganz klappts wohl noch nicht. Schau mal in notes.jpg. Das habe ich als Vorgabe in Notes. Dein Skript macht da die Messagebox Pechgehabt.jpg daraus. Da fehlen aus meiner Sicht, die Leerzeilen, welche manuell im RichText mit eingegeben wurden.


    Ich habe auch mal ein wenig versucht und mache nun folgendes, damit ich zu dem quickanddirty.jpg Ergebnis komme.


    Ich erzeuge mir erst mal einen DXL Export und erzeuge mir eine temporäre Datei, wo nur noch die Zeilen zwischen <item ....> und </item> meines gesuchten Richtextitems stehen. Das sieht dann aus wie in temp.jpg. Die Datei lese ich zeichenweise ein und gebe die Zeichen aus, die nach einem > kommen und vor einem < stehen.
    Also quasi stoppe ich die zeichenweise Ausgabe, wenn ich ein < find und gebe weiter aus, wenn ich ein > finde. Also werden etwaige Zeichenumbrüche mit ausgegeben.


    Vielleicht nicht ganz schön, aber immerhin habe ich das, was ich will.

  • die msgbox ist nicht sauber in der Darstellung, mein strText hat es aber richtig.
    noch angehängt:
    Set doc = col.GetFirstDocument
    doc.Test = strText
    Call doc.save(True, False)



    Geschlampt habe ich aber bei der col ->lstText
    da müsste noch ein Trenner für die einzelnen docs rein...


    Aber egal, hautsache läuft!

  • Also,
    auf Beweis-Fotos verzichte ich jetzt mal.
    Ich habe festgestellt, dass wann/wieso auch immer die Returns mal als "break" und mal in verschiedenen "par" dargestellt werden, z.B. wenn die Texte unterschiedlich formatiert sind.


    Dann muss man halt noch den 2-Zeiler einfügen:
    [lstText(intCount) = Chr(13)
    intCount = intCount + 1]


    [ If parNodeList.NumberOfEntries > 0 Then
    For parPos = 1 To parNodeList.NumberOfEntries
    Set parNode = parNodeList.GetItem(parPos)
    Call rekursivChildNodes(parNode)
    lstText(intCount) = Chr(13)
    intCount = intCount + 1
    Next
    End If]


    An welchen Stellen Du dann vielleicht CHR(13) & CHR(10) einfügen musst, wirst Du schon rausfinden; wenn Du InlineImages und anderes Zeug hast etc., da wird's lustig mit zwischen > und <.