Rich-Textfelder in der Adobe Workfront-API
Erstellt für:
- Entwickler
Einige Objekte in Adobe Workfront ermöglichen die Speicherung von Text mit Rich-Text-Formatierung. In der Workfront-API wird Rich-Text als JSON unter Verwendung des Open-Source-Frameworks Draft.js gespeichert.
Beispiel für eine Übersicht
Ein benutzerdefiniertes Feld mit Rich-Text-Formatierung wird Feld mit Rich-Text genannt und kann die folgenden Werte aufweisen:
Beispiel: Eine einfache GET-Anfrage zum Abrufen des Werts des Felds mit einem benutzerdefinierten Rich-Text-Formularfeld:
<OBJ Code><OBJ ID><OBJ Code><OBJ ID>
Beispiel: Diese Anfrage gibt den Wert des Felds mit Rich-Text in JSON zurück, das im ParameterValue DE:Field mit Rich-Text gespeichert ist.
{
data: {
ID: "5e85e3f10000b99e8cef10af4e5c6c7b",
name: "Zoom Integration Test",
objCode: "PROJ",
parameterValues: {
"DE:Field with rich text": "{"blocks":[{"key":"dpfce","text":"This is a regular text","type":"unstyled","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"a9ic6","text":"Bold text and regular text","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":0,"length":9,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"1b2a4","text":"Italic text and regular text","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":0,"length":11,"style":"ITALIC"}],"entityRanges":[],"data":{}},{"key":"4dle1","text":"Underline text and regular text","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":0,"length":14,"style":"UNDERLINE"}],"entityRanges":[],"data":{}},{"key":"10mip","text":"With all formating and regular text","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":0,"length":18,"style":"BOLD"},{"offset":0,"length":18,"style":"ITALIC"},{"offset":0,"length":18,"style":"UNDERLINE"}],"entityRanges":[],"data":{}}],"entityMap":{}}",
"DE:Other Type of Field": "Value",
}
}
}
Beispiel: Dies ist eine formatierte Version der Antwort, die in der Abbildung oben dargestellt wird.
{
"blocks":[
{
"key":"dpfce",
"text":"This is a regular text",
"type":"unstyled",
"depth":0,
"inlineStyleRanges":[
],
"entityRanges":[
],
"data":{
}
},
{
"key":"a9ic6",
"text":"Bold text and regular text",
"type":"unstyled",
"depth":0,
"inlineStyleRanges":[
{
"offset":0,
"length":9,
"style":"BOLD"
}
],
"entityRanges":[
],
"data":{
}
},
{
"key":"1b2a4",
"text":"Italic text and regular text",
"type":"unstyled",
"depth":0,
"inlineStyleRanges":[
{
"offset":0,
"length":11,
"style":"ITALIC"
}
],
"entityRanges":[
],
"data":{
}
},
{
"key":"4dle1",
"text":"Underline text and regular text",
"type":"unstyled",
"depth":0,
"inlineStyleRanges":[
{
"offset":0,
"length":14,
"style":"UNDERLINE"
}
],
"entityRanges":[
],
"data":{
}
},
{
"key":"10mip",
"text":"With all formating and regular text",
"type":"unstyled",
"depth":0,
"inlineStyleRanges":[
{
"offset":0,
"length":18,
"style":"BOLD"
},
{
"offset":0,
"length":18,
"style":"ITALIC"
},
{
"offset":0,
"length":18,
"style":"UNDERLINE"
}
],
"entityRanges":[
],
"data":{
}
}
],
"entityMap":{
}
}
Bausteine
Die JSON-Objekte, die den Rich-Text-Inhalt speichern, bestehen aus zwei Hauptteilen: Blöcken und EntityMaps.
Ein Block ist ein JSON-Objekt, das eine einzelne Zeile formatierten Textes darstellt. Da ein einzelnes benutzerdefiniertes Feld mehr als eine Textzeile haben kann, verfügt jede Textzeile über einen eigenen Block, und jeder Block wird als Element in einem übergeordneten Array namens Blöcke dargestellt.
Beispiel: Hier wird jede Textzeile aus einem benutzerdefinierten Feld einem Blockelement in den Array-Blöcken zugeordnet.
Da jedes Blockelement auch ein JSON-Objekt ist, besteht jeder Block aus den Elementen: Schlüssel, Text, Typ, Tiefe, inlineStyleRanges, entityRanges und Daten. Jedes dieser Elemente funktioniert wie folgt:
- Schlüssel: Die eindeutige Kennung für diesen Block. Der Schlüssel wird verwendet, um eine Textzeile über entityMaps zuzuordnen. Details zu entityMaps finden Sie im Abschnitt entityMaps dieses Dokuments.
- Text: Die Zeile mit Textinhalt, die aus dem benutzerdefinierten Feld gespeichert wird.
- Typ: Beschreibt den Typ des Textes, der dargestellt wird. Beispielsweise könnte eine Textzeile, die in einem Block gespeichert ist, Teil einer Liste sein. Wenn diese Textzeile Teil einer ungeordneten Liste ist, wird ihr Typ wie folgt definiert: unordered-list-item.
- Listen: Derzeit nicht unterstützt, sollten aber bald verfügbar sein.
- Tiefe: Ein Parameter, der die Tiefe der Zeile definiert, wenn die Zeile ein verschachtelter Teil einer geordneten oder ungeordneten Liste ist.
- inlineStyleRanges : Ein Array, das die Formatierungstypen beschreibt, die auf die Textzeile angewendet wurden, die vom aktuellen Block dargestellt wird.
Beispiel: Hier ist ein inlineStyleRanges-Array, das jeden Stil auf Zeichenebene beschreibt. In diesem Fall: 9 Zeichen (Länge: 9) ab dem Index 0 (Versatz: 0) hatten den Stil Fett angewendet:
Wenn mehrere Formatierungstypen auf eine einzelne Zeile angewendet wurden, werden Stile zusätzlichen Elementen im inlineStyleRanges-Array zugeordnet.
Beispiel: So würde ein Block aussehen, wenn eine Textzeile mit der gemischten Formatierung gespeichert wird: Fett und Kursiv.
{
"key":"a9ic6",
"text":"Bold text and Italics",
"type":"unstyled",
"depth":0,
"inlineStyleRanges":[
{
"offset":0,
"length":21,
"style":"BOLD"
},
{
"offset":14,
"length":7,
"style":"ITALIC"
}
],
...
},
entityMaps und entityRanges
Ein Datenblock kann möglicherweise Entitäten wie Hyperlinks oder andere Arten stilisierter Formatierung enthalten, die mit Datenquellen verbunden sind, die sich außerhalb des benutzerdefinierten Textfelds befinden.
Beispiele
Nur Text aus JSON wird abgerufen
Wenn ein benutzerdefiniertes Feld mit Rich-Text-Formatierung gesendet wird, wird der gesamte Text in den Array-Blöcken gespeichert. Jede Zeile des Volltextes wird jedoch im Textparameter innerhalb jedes der separaten Blockelemente gespeichert, aus denen die übergeordneten Array-Blöcke bestehen. Um also den vollständigen Text abzurufen, muss jede einzelne Textzeile extrahiert und wieder geteilt werden. Dies kann erreicht werden, indem alle Elemente in Blöcken durchlaufen und die einzelnen Textparameter zusammen mit einem Zeilentrennzeichen (\n) verkettet werden.
Beispiel: So könnte Ihr JS aussehen:
const parameterValue = JSON.parse('{"blocks":[{"key":"dpfce","text":"This is a regular text","type":"unstyled","depth":0,"inlineStyleRanges":[],"entityRanges":[],"data":{}},{"key":"a9ic6","text":"Bold text and regular text","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":0,"length":9,"style":"BOLD"}],"entityRanges":[],"data":{}},{"key":"1b2a4","text":"Italic text and regular text","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":0,"length":11,"style":"ITALIC"}],"entityRanges":[],"data":{}},{"key":"4dle1","text":"Underline text and regular text","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":0,"length":14,"style":"UNDERLINE"}],"entityRanges":[],"data":{}},{"key":"10mip","text":"With all formating and regular text","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":0,"length":18,"style":"BOLD"},{"offset":0,"length":18,"style":"ITALIC"},{"offset":0,"length":18,"style":"UNDERLINE"}],"entityRanges":[],"data":{}}],"entityMap":{}}');
let plainText = "";
parameterValue.blocks.forEach((block) => {
plainText = plainText.concat(block.text, "\n");
})
console.log(plainText)
Speichern eines Rich-Text-Feldwerts mithilfe der Workfront-API
So speichern Sie die folgenden Werte eines Rich-Text-Felds mithilfe der Workfront-API:
Hallo Welt!!!
Dies ist mein erster Rich-Text
-
Erstellen Sie JSON-Code, der den Wert des Rich-Text-Felds darstellt, das Sie erfassen möchten, indem Sie jede Textzeile in einem Blockelement in den Array-Blöcken organisieren.
{ "blocks":[ { "key":"0", "text":"Hello World!!!", }, { "key":"1", "text":"This is my first Rich Text", } ] }
-
Erfassen Sie die Rich-Text-Formatierung mit dem inlineStyleRanges-Parameter.
{ "blocks":[ { "key":"0", "text":"Hello World!!!", "inlineStyleRanges": [ { "offset":6, "length":11, "style":"BOLD" } ] }, { "key":"1", "text":"This is my first Rich Text", } ] }
-
Um die zweite Zeile zu erfassen, muss der Text Rich-Text sowohl fett als auch kursiv formatiert sein.
{ "blocks":[ { "key":"0", "text":"Hello World!!!", "inlineStyleRanges": [ { "offset":6, "length":11, "style":"BOLD" } ] }, { "key":"1", "text":"This is my first Rich Text", "inlineStyleRanges": [ { "offset":17, "length":26, "style":"BOLD" }, { "offset":17, "length":26, "style":"ITALIC" } ] } ], "entityMap":{ } }
NOTE
Während die entityMap-Funktion bei der ersten Version nicht unterstützt wird, ist es dennoch ein erforderliches Feld, um diese JSON in einer Anfrage zu übergeben. -
Verwenden Sie die Stringify-Methode für die oben beschriebene JSON, um eine PUT-Anfrage zu stellen und Aktualisierungen zu senden.
<OBJ Code><OBJ ID>