Campi Rich Text nell’API di Adobe Workfront
Creato per:
- Sviluppatore
Alcuni oggetti in Adobe Workfront consentono l’archiviazione di testo con formattazione RTF. In Workfront API il testo RTF viene memorizzato come JSON utilizzando il framework open source Draft.js.
Esempio di panoramica
Un campo personalizzato con formattazione RTF è denominato Campo con testo RTF e può essere associato ai seguenti valori:
Esempio: una richiesta di base di GET per recuperare il valore del campo modulo personalizzato Campo con testo RTF:
<OBJ Code><OBJ ID><OBJ Code><OBJ ID>
Esempio: Questa richiesta restituirà il valore di Field con Rich Text in JSON archiviato in parameterValue DE:Field con Rich Text
{
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",
}
}
}
Esempio: Questa è una versione formattata della risposta presentata nella figura immediatamente sopra
{
"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":{
}
}
Blocchi
Gli oggetti JSON che memorizzano il contenuto Rich Text sono composti da due parti principali: blocchi e entityMaps.
Un blocco è un oggetto JSON che rappresenta una singola riga di testo formattato. Poiché un singolo campo personalizzato può contenere più di una riga di testo, ogni riga di testo ha un proprio blocco e ogni blocco è rappresentato come un elemento in un array principale denominato blocchi.
Esempio: In questo caso, ogni riga di testo da un campo personalizzato viene mappata a un elemento di blocco nei blocchi di matrice
Poiché ogni elemento del blocco è anche un oggetto JSON, ogni blocco è composto dagli elementi: key, text, type, depth, inlineStyleRanges, entityRanges e data. Ciascuno di questi elementi funziona come segue:
- Chiave è l'identificatore univoco per il blocco. La chiave viene utilizzata per mappare una riga di testo tramite entityMaps. I dettagli su entityMaps sono disponibili nella sezione entityMaps di questo documento.
- Testo è la riga di contenuto di testo che viene archiviata dal campo personalizzato.
- Il tipo descrive il tipo di testo che viene rappresentato. Ad esempio, una riga di testo memorizzata in un blocco potrebbe far parte di un elenco. Se tale riga di testo faceva parte di un elenco non ordinato, il relativo tipo sarebbe definito come: unordered-list-item.
- Gli elenchi non sono attualmente supportati, ma dovrebbero essere disponibili a breve.
- Profondità Questo parametro definisce la profondità della linea quando questa è una parte nidificata di un elenco ordinato o non ordinato.
- inlineStyleRanges è una matrice che descrive i tipi di formattazione applicati alla riga di testo rappresentata dal blocco corrente.
Esempio: Ecco una matrice inlineStyleRanges che descrive ogni stile a livello di carattere. In questo caso: a 9 caratteri (lunghezza: 9) a partire dall'indice 0 (offset: 0) era applicato lo stile Grassetto:
Se a una singola riga sono stati applicati più tipi di formattazione, gli stili verranno mappati su elementi aggiuntivi nell’array inlineStyleRanges.
Esempio: Ecco come apparirebbe un blocco quando si memorizza una riga di testo con la formattazione mista: Testo in grassetto e corsivo
{
"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 ed entityRanges
Un blocco di dati può potenzialmente contenere entità come collegamenti ipertestuali o altri tipi di formattazione stilizzata che sono connesse a origini dati che si trovano al di fuori del campo di testo personalizzato.
Esempi
Recupero di testo normale da JSON
Quando viene inviato un campo personalizzato con formattazione RTF, tutto il testo viene memorizzato nell'array blocchi. Tuttavia, ogni riga del testo completo è memorizzata nel parametro di testo all'interno di ciascuno degli elementi di blocco separati che compongono l'array principale blocchi. Quindi, per recuperare il testo completo, ogni riga di testo separata deve essere estratta e ritagliata insieme. A questo scopo, è possibile eseguire un ciclo su tutti gli elementi nei blocchi e concatenare ogni parametro di testo con un delimitatore di riga (\n).
Esempio: Ecco come potrebbe apparire il tuo JS:
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)
Salvataggio di un valore di campo in formato Rich Text tramite l’API Workfront
Per salvare i seguenti valori di un campo in formato Rich Text utilizzando l’API Workfront:
Salve Mondo!!!
Questo è il mio primo Rich Text
-
Costruisci JSON che rappresenta il valore del campo Rich Text che stai tentando di acquisire organizzando ogni riga di testo in un elemento blocco, nell'array blocchi
{ "blocks":[ { "key":"0", "text":"Hello World!!!", }, { "key":"1", "text":"This is my first Rich Text", } ] }
-
Acquisisci la formattazione RTF utilizzando il parametro inlineStyleRanges
{ "blocks":[ { "key":"0", "text":"Hello World!!!", "inlineStyleRanges": [ { "offset":6, "length":11, "style":"BOLD" } ] }, { "key":"1", "text":"This is my first Rich Text", } ] }
-
Per acquisire la seconda riga, il testo "Rich Text" deve essere formattato in grassetto e corsivo.
{ "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
Anche se la funzionalità entityMap non è supportata durante la versione iniziale, rimane comunque un campo obbligatorio per trasmettere questo JSON in una richiesta -
Utilizza il metodo stringify nel JSON descritto sopra per effettuare una richiesta PUT e inviare aggiornamenti
<OBJ Code><OBJ ID>