Ho quindi trovato l’idea di consentire a coloro che hanno i permessi di modifica dei post (utenti TL4+) di selezionare il testo e convertirlo in un blocco di codice.
Dopo aver fatto riferimento ad alcune parti del codice del plugin Discourse AI e aver esaminato quali dati vengono passati all’outlet del plugin che sto utilizzando, ho trovato il codice per ottenere il testo selezionato e racchiuderlo tra delimitatori di codice, utilizzando l’outlet quote-share-buttons-before.
Poi, ora, sono un po’ bloccato. Il plugin checklist (in qualche modo) fa questo con un argomento nella funzione checklistSyntax chiamato postDecorator, con cui possono ottenere il modello (penso sia il modello post?) usando .getModel(). Come venga passato non lo so, ma non credo sia disponibile per me nella mia configurazione?
Se si tratta effettivamente del modello post utilizzato nel plugin checklist, sembra che abbia difficoltà a trovare dove esista la semplice funzione ‘save’ in
in models/post.js, a meno che non stia capendo male.
Attualmente sto usando this.args.outletArgs.data.editPost(this.post) (che se non ricordo male si trova in models/topic.js, ma per favore correggimi se sbaglio) che apre solo il composer per modificare il post, non per modificarlo direttamente.
Quindi la mia domanda è questa: come posso modificare il post come il plugin checklist, senza problemi? C’è un modo per farlo se sto mettendo un pulsante in un outlet invece di api.decorateCookedElement come fa checklist? Preferibilmente senza usare l’API REST?
I tried this.post.save() and it apparently “works” - it seems like the PUT request is going through (using ajax under the hood), but was met with some error with little to no information. But that was before this…
The this.post.save() works. The only problem is the one listed below:
My function is now like this:
@action
async addCodeFences() {
let selectedText = this.selectedText;
let newText = "```" + "\n" + selectedText + "\n" + "```";
let post = this.post;
console.log(this.post.cooked); // Works
let rawPost = post.raw; // Doesn't exist!!
console.log(rawPost); // undefined!
rawPost.replace(selectedText, "\n" + newText + "\n"); // Error, since rawPost is undefined!
await this.post.save({
raw: rawPost,
edit_reason: I18n.t(themePrefix("add_code_fence_edit_reason"))
});
}
For some reason, I cannot get the post’s raw contents, only the cooked. Besides doing an ajax request, is there a way to do it? I can’t seem to find raw as one of the attributes for the post… is there a reason why it isn’t included?
P.S. I’m trying not to turn to Ask Discourse here. I would really appreciate any help!
EDIT: I think each post is based of this API request? And the response doesn’t seem to have raw as one of the JSON keys .
Sì, è corretto: non includiamo raw nella risposta predefinita. Non è necessario per il rendering normale, quindi includerlo sarebbe uno spreco in termini di trasferimento dati/velocità.