Suppongo che dovrei avere pre-affrontato questo con: Sì, so che non c'è bisogno di un nuovo linguaggio di template, ma voglio comunque farne uno nuovo, perché Sono un pazzo. A parte questo, come posso migliorare la mia lingua:
Iniziamo con un esempio:
using "html5"
using "extratags"
html {
head {
title "Ordering Notice"
jsinclude "jquery.js"
}
body {
h1 "Ordering Notice"
p "Dear @name,"
p "Thanks for placing your order with @company. It's scheduled to ship on {@ship_date|dateformat}."
p "Here are the items you've ordered:"
table {
tr {
th "name"
th "price"
}
for(@item in @item_list) {
tr {
td @item.name
td @item.price
}
}
}
if(@ordered_warranty)
p "Your warranty information will be included in the packaging."
p(class="footer") {
"Sincerely," br @company
}
}
}
La parola chiave "using" indica quali tag usare. "html5" potrebbe includere tutti i tag standard html5, ma i tuoi nomi di tag non dovrebbero essere basati sulle loro controparti HTML del tutto se non lo avessi voluto.
La libreria "extratags" ad esempio potrebbe aggiungere un tag extra, chiamato "jsinclude" che viene sostituito con qualcosa come <script type="text/javascript" src="@content"></script>
I tag possono essere opzionalmente seguiti da una parentesi graffa di apertura. Saranno automaticamente chiusi alla coppia di chiusura. Se non viene utilizzata alcuna parentesi, verranno chiusi dopo aver preso un elemento.
Le variabili sono precedute dal simbolo @
. Possono essere usati all'interno di stringhe tra virgolette doppie. Penso che userò virgolette singole per indicare "nessuna sostituzione di variabili" come fa PHP.
Le funzioni filtro possono essere applicate a variabili come @variable|filter
. Gli argomenti possono essere passati al filtro @variable|filter:@arg1,arg2="y"
Gli attributi possono essere passati ai tag includendoli in ()
, come p(class="classname")
.
Sarai anche in grado di includere modelli parziali come:
for(@item in @item_list)
include("item_partial", item=@item)
Qualcosa del genere sto pensando. Il primo argomento sarà il nome del file template, e quelli successivi saranno denominati argomenti dove @item ottiene il nome variabile "item" all'interno di quel template. Voglio anche avere una versione di raccolta come RoR, quindi non devi nemmeno scrivere il ciclo. I pensieri su questa ed esatta sintassi sarebbero utili:)
Alcune domande:
- Quale simbolo dovrei usare per prefisso variabili? @ (come Razor), $ (come PHP), o qualcos'altro?
- Il simbolo @ dovrebbe essere necessario nelle istruzioni "for" e "if"? È un po 'implicito che quelle siano variabili.
- Tag e controlli (come se, per) attualmente hanno la stessa sintassi esatta. Dovrei fare qualcosa per differenziare i due? E quindi?
- Ciò renderebbe più chiaro che il "tag" non si comporta come un normale tag che verrà sostituito dal contenuto, ma controlla il flusso. Inoltre, consentirebbe il riutilizzo dei nomi.
- Come
tag
sarebbe un tag normale, ma@tag
sarebbe una direttiva come@for
,@if
,@include
,@using
- Ti piace la sintassi degli attributi? (parentesi tonde)
- Come devo fare l'ereditarietà / layout dei modelli?
- In Django, la prima riga del file deve includere il file di layout e quindi delimitare i blocchi di codice che vengono inseriti in quel layout.
- In CakePHP, è una specie di backward, si specifica il layout nella funzione controller.view, il layout ottiene una speciale
$content_for_layout
variabile, quindi l'intero modello viene inserito in quello e non è necessario delimitare qualsiasi blocco di codice. - Suppongo che Django sia un po 'più potente perché puoi avere più blocchi di codice, ma rende i tuoi modelli più prolissi ... cercando di decidere quale approccio adottare
- Variabili filtrate all'interno di virgolette:
-
"xxx {@var|filter} yyy"
-
"xxx @{var|filter} yyy"
-
"xxx @var|filter yyy"
- i.e, @ inside, @ outside, o niente parentesi. Penso che le no-parentesi potrebbero causare problemi, specialmente quando si tenta di aggiungere argomenti, come
@var|filter:arg="x"
, quindi le virgolette si confondono. Ma forse potrebbe funzionare una versione senza bretelle quando non ci sono citazioni ...? Ancora, quale opzione per le parentesi graffe, prima o seconda? Penso che il primo potrebbe essere migliore perché poi siamo coerenti ... il @ è sempre spinto contro la variabile.
-
Aggiungerò altre domande in pochi minuti, una volta ricevuto un feedback.
Il punto e virgola:
Utilizzerò il punto e virgola per chiudere i tag senza contenuto. Ad esempio, div; emetterebbe e non mangerebbe il token successivo come normalmente farebbe.
namespace:
Dato che definirò i tag direttamente in C # e C # supporta gli spazi dei nomi, penso che userò lo spazio dei nomi e funzionerà perfettamente. namespace.tagname
, ma non sarà necessario includere lo spazio dei nomi a meno che non si voglia disambiguare. L'ultimo incluso (tramite la direttiva @using) avrà la precedenza.
@ Tom Anderson:
div {
p "This is a paragraph"
p "This is another paragraph"
}
span(class="error") "This is going to be bright red"
img(src="smiley.png", alt=":)")
p {
"This " a(href="about-paragraphs.html") "paragraph" " contains a link."
}