Pensieri sul mio nuovo linguaggio template / generatore HTML? [chiuso]

1

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."
}
    
posta mpen 07.01.2011 - 21:36
fonte

3 risposte

4

Primo pensiero: "Oh no, non un altro!" Secondo pensiero: "Beh, almeno questo era un concetto unico".

Si crea un linguaggio "modello" che in realtà non è affatto un linguaggio modello, poiché non ha alcuna relazione con l'output. È più strettamente un linguaggio di generazione HTML.

L'idea è interessante, soprattutto perché ha una sintassi molto più pulita rispetto all'HTML. Ma ha uno svantaggio principale: nessun editor HTML lo capirebbe. Pertanto è utile solo per HTML che è più generato rispetto a un modello. Questo è sicuramente un concetto interessante, poiché la tecnologia HTML sta diventando sempre più importante per l'HTML che fa solo contenuti e per progettare con CSS o XSLT o entrambi.

Ma hai davvero bisogno di un linguaggio per questo? Costruire l'HTML è possibile con i moduli nella maggior parte delle lingue, e anche se la sintassi sarebbe diversa, il codice sembrerebbe piuttosto simile. Non sarebbe difficile fare qualcosa di simile con say lxml o BeautifulSoup in Python. Forse sarebbe meno pulito, ma non richiederebbe nemmeno di imparare un'altra lingua.

La mia tecnica preferita è ancora quella di raccogliere tutti i dati nel linguaggio di programmazione (python nel mio caso) e avere un linguaggio template piuttosto stupido che lo formatta semplicemente in HTML. (Sfortunatamente non uso mai il mio preferito: Templess , quindi rimane un preferito solo in teoria.)

In ogni caso preferirei usare una sintassi più Pythonic. È ancora più pulito:

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:
              th: item.name
              td: item.price
    if ordered_warranty:
        p: "Your warranty information will be included in the packaging."
        p(class="footer"):
          "Sincerely," br @company # I don't understand this line
    
risposta data 07.01.2011 - 22:42
fonte
1

Come dice Lennart, questo non è un linguaggio per i modelli. Piuttosto, è un linguaggio di programmazione specifico del dominio, con primitive (o forse funzioni di libreria, non sono chiaro come sono definiti i tag) per la produzione di HTML.

Ho scritto qualcosa di simile qualche tempo fa, che ho purtroppo perso. Tuttavia, piuttosto che definire un nuovo linguaggio, ho semplicemente scritto alcune funzioni in Python. In realtà, avevo bisogno di scrivere un traduttore che trasformasse DTD in Python, ma questa è un'altra storia. Ad ogni modo, ho avuto funzioni chiamate per ogni tag, che restituirebbero un oggetto che rappresenta un elemento con quel tag e che accetterebbero vari argomenti in base al modello di contenuto di quell'elemento. Gli attributi sono stati gestiti con argomenti di parole chiave. Quindi, potresti scrivere:

div(
    p("This is a paragraph"),
    p("This is another paragraph - div takes varargs")
)

span("This is going to be bright red", class="error")

img(src="smiley.png", alt=":)")

p("This ", a("paragraph", href="about-paragraphs.html"), "contains a link."),

Ma non potevi scrivere nessuno dei seguenti:

img("throws an exception because img elements can't have content")

span(p("throws an exception because spans can't contain block-level elements"))

p(nosuch="throws an exception because there's no such attribute")

img(alt="throws an exception because it lacks the required src attribute")

Gli oggetti costruiti erano leggeri, ma sapevano come scriversi su un oggetto simile a un file o assemblarsi in una stringa.

Poiché questo è solo un normale codice Python, hai tutta la potenza del linguaggio - un linguaggio che esiste già, è ben sviluppato, potente e ampiamente conosciuto e documentato - a tua disposizione. Se si desidera un ciclo, si utilizza for o, meglio ancora, una comprensione di lista o un'espressione generatore. Se si desidera un blocco condizionale, si utilizza if . Se vuoi memorizzare un frammento di HTML e usarlo in seguito, usa una variabile. Se vuoi inserire i valori delle variabili in stringhe, usa % . Se vuoi un metaclasse che applica un decoratore per produrre un generatore da una lambda, impazzisci. Non puoi fare l'ereditarietà del modello come tale, ma le strutture esistenti del linguaggio ti permettono di creare una funzione che passa i suoi argomenti in un modello:

def standardPageContainer(pageTitle, pageText):
    return html(
        head(
            title(pageTitle)),
        body(
            h1(pageTitle),
            hr(),
            pageText))

E tu sei fuori.

Scommetterò sterline alle torte di maiale che il mio approccio fornirà un linguaggio più pulito, più coerente, più facile da usare e più potente del tuo in meno di un decimo delle linee di codice. Posso fare quella scommessa perché sto imbrogliando come un porco: sto rubando tutto ciò che i ragazzi di Python hanno fatto.

In ogni caso, la morale della storia è: bambini, basta dire di no alle lingue specifiche del dominio .

    
risposta data 07.01.2011 - 23:33
fonte
1

Mi piace la sintassi.

Non mi piace l'idea di creare qualcosa solo "perché possiamo", senza un'esigenza precisa. Ma, bene, non importa.

Ciò che conta è un'altra cosa che voglio notare, che a volte viene dimenticata dalle persone che creano nuove lingue, sistemi di template, ecc.:

  1. Hai intenzione di creare strumenti per supportare questo linguaggio modello? Voglio dire, quando sviluppo un sito Web ASP.NET MVC con Razor, ho un utile IntelliSense di Visual Studio 2010. Se un giorno ho bisogno di usare PHP (che è un linguaggio template), posso usare Zend IDE e altri utili editor per questo. Se un giorno comincio ad usare il tuo linguaggio template, ho qualcosa di meglio del notepad?

  2. Hai intenzione di fornire aiuto e supporto? Immagina un giorno che inizi a usare la tua lingua. E succede qualcosa di sbagliato. Cosa posso fare?

Potresti dire che non ha importanza dal momento che il tuo intento non è quello di creare qualcosa da utilizzare da centinaia di migliaia di sviluppatori in tutto il mondo. Ma se lo userai un giorno nei tuoi siti web, tieni presente che un sito web che utilizza un linguaggio dei modelli personalizzato senza strumenti o supporto può essere gestito solo da te .

Questo significa che avrà problemi se sei uno sviluppatore professionista e lo usi nei tuoi clienti / nel tuo sito web aziendale. Ciò significa anche che avrà problemi se un giorno alcuni dei tuoi siti web fatti in casa diventeranno famosi o deciderai di invitare qualcuno a lavorare sul tuo codice.

    
risposta data 08.01.2011 - 02:42
fonte

Leggi altre domande sui tag