diff --git a/doc.go b/doc.go deleted file mode 100644 index d3f3f65..0000000 --- a/doc.go +++ /dev/null @@ -1,48 +0,0 @@ -// trofaf is a super-simple *live* static blog engine. -// -// Install using: `go get github.com/PuerkitoBio/trofaf` -// -// ## Description -// -// It generates a static website from *markdown* files and front matter, and requires only a simple -// 3-directories structure to get going. It favors simplicity over features. -// -// To get started, create the 3 subdirectories (you can look at the `example/` subdirectory -// for... an example): -// * posts -// * public -// * templates -// -// trofaf only cares about `*.md` files in the posts directory, and about `*.amber` (Amber templates) -// or `*.html` (native Go templates) files in the templates directory. It will watch for changes, -// creates or deletes on those files in these directories, and will re-generate automatically -// the website when required. This is the *live* part. -// -// All files in the public directory are exposed by the web server. Posts in markdown format get -// translated to static html files at the root of the public directory. The html file name is -// an URL-friendly slug generated from the original markdown file name. There is no extension, so -// the URL looks clean and, uh, *modern*? -// -// An RSS feed is automatically generated from a number of recent posts, and saved as a static -// XML file in the public directory. -// -// There is no special template for an index page, the most recent post (based on the publication -// date found in the front matter of the markdown files) is saved twice - once under its own -// html file, once under the index.html file, so that this is the page displayed when the root -// of the web server is requested. -// -// When the site is (re-)generated, the public directory must be cleaned, because some posts may -// have been deleted. Subdirectories are left untouched (so that `css/` or `js/` directories can -// coexist peacefully), as well as hidden (dot) files, and some special files are also graced -// from the destruction (robots.txt, favicon.ico, etc., see gen.go). -// -// ## Command-line Options -// -// The following options can be set at the command-line: -// * Port (-p) : the port number for the web server, defaults to 9000. -// * NoGen (-G) : prevents watching and live-generating the site. This is equivalent to running the static public directory. -// * SiteName (-n) : the name of the web site, passed to the template. -// * TagLine (-t) : a tag line for the web site, passed to the template. -// * RecentPostsCount (-r) : the number of posts in the recent posts list, passed to the template and used for the RSS feed. -// * BaseURL (-b) : the base URL of the web site, most likely the host name (i.e. http://www.mysite.com). -package main diff --git a/examples/amber/public/002-meta-billet b/examples/amber/public/002-meta-billet index 4bb9e60..386797a 100644 --- a/examples/amber/public/002-meta-billet +++ b/examples/amber/public/002-meta-billet @@ -10,13 +10,13 @@ - +
- + Site Name
@@ -36,6 +36,7 @@
+

Il existe de nombreux moteurs de blogue gratuits sur internet, tels Wordpress, Blogger et Tumblr. Pourquoi avoir jeté l’ancre sur ce discret et modeste Calepin? Peut-être un peu pour ça, tiens, pour me tenir loin des tumultes de ces méga-centres urbains du Web. Un peu aussi pour ce design minimaliste, centré sur le contenu, sur les mots. Et un peu pour deux qualités franchement moins romantiques: dropbox et markdown.

Mes billets, mon coffret

diff --git a/examples/amber/public/003-dependances b/examples/amber/public/003-dependances index 93f3106..b1a3bcf 100644 --- a/examples/amber/public/003-dependances +++ b/examples/amber/public/003-dependances @@ -10,13 +10,13 @@ - +
- + Site Name
@@ -36,6 +36,7 @@
+

La plateforme node.js est volontairement limitée, en son coeur, aux fonctionnalités les plus fondamentales. Elle mise donc sur les contributions - souvent époustouflantes, j’en parle ici - de sa communauté pour enrichir le noyau et repousser les limites du possible.

Avec près de 8000 librairies pullulant dans son écosystème, il y a sérieux danger de chaos. Et si on y retrouve plutôt quelque chose comme une belle organisation, c’est en bonne partie grâce à la colonne vertébrale qui unit et soutient cette terre fertile, le gestionnaire de librairies npm. Présentation, trucs et astuces dans les lignes qui suivent.

diff --git a/examples/amber/public/004-npm-packages b/examples/amber/public/004-npm-packages index b15fca3..9ac73b3 100644 --- a/examples/amber/public/004-npm-packages +++ b/examples/amber/public/004-npm-packages @@ -10,13 +10,13 @@ - +
- + Site Name
@@ -36,6 +36,7 @@
+

Utiliser une librairie existante permet d’ajouter rapidement des fonctionnalités à une application, et de concentrer ses efforts sur les nouveautés, les spécificités de son projet, plutôt qu’à réinventer la roue. Cependant, chaque librairie utilisée devient une dépendance, et une dépendance est un risque. Un risque car notre code dépend maintenant de ce corps étranger sur lequel on a généralement peu ou pas de contrôle. Les meilleures pratiques pour limiter ce risque ont évolué rapidement sur la plateforme node.js ces derniers mois.

diff --git a/examples/amber/public/005-structurer-express b/examples/amber/public/005-structurer-express index 87f395d..5ee70b5 100644 --- a/examples/amber/public/005-structurer-express +++ b/examples/amber/public/005-structurer-express @@ -10,13 +10,13 @@ - +
- + Site Name
@@ -36,6 +36,7 @@
+

** MISE À JOUR ** (22 mars 2012) : J’ai mis un exemple (simpliste, mais fonctionnel) de la structure suggérée dans ce billet sur GitHub, express-boilerplate.


diff --git a/examples/amber/public/006-dependency-injection b/examples/amber/public/006-dependency-injection index 6b32b52..0c23a28 100644 --- a/examples/amber/public/006-dependency-injection +++ b/examples/amber/public/006-dependency-injection @@ -10,13 +10,13 @@ - +
- + Site Name
@@ -36,6 +36,7 @@
+

L’injection de dépendance (dependency injection) permet de découpler les différentes composantes d’une application pour en faciliter l’entretien, la testabilité, circonscrire l’impact des changements, mais aussi pour imposer une façon d’aborder la création de l’application en une aggrégation de pièces simples, à la responsabilité ciblée, et à l’API bien défini. Elle a comme effet secondaire, règle générale, une meilleure architecture.

Dans les langages de programmation orientés-objet statiques, tels C# ou Java, le patron (pattern) d’injection de dépendance prend la forme d’une interface ou d’une classe abstraite, d’une (ou plusieurs) implémentation de cette interface, et d’un assembleur, responsable de créer l’instance concrète d’une implémentation de l’interface, et de l’injecter dans un objet “client” de la dépendance. Martin Fowler a écrit un brillant article sur le sujet, c’est une lecture essentielle pour approfondir ce patron.

diff --git a/examples/amber/public/007-implement-js b/examples/amber/public/007-implement-js index 7c8bf77..8fdcc26 100644 --- a/examples/amber/public/007-implement-js +++ b/examples/amber/public/007-implement-js @@ -10,13 +10,13 @@ - +
- + Site Name
@@ -36,6 +36,7 @@
+

L’injection de dépendance (dependency injection) avec Javascript a comme conséquence de ne pouvoir assumer que les fonctionnalités offertes par l’instance reçue seront celles attendues. Dans les langages statiques, l’injection est généralement basée sur une interface, qui assure au module “client” la disponibilité d’un ensemble de fonctionnalités. Le contrat imposé par l’interface est assurément respecté. Dans un langage dynamique comme Javascript, il n’y a rien de tel.

Ce qui laisse deux options aux développeurs Javascript: l’acte de foi ou la validation manuelle de l’objet reçu. J’en parlais dans mon dernier billet, j’avais l’impression qu’il manquait quelque chose à ce niveau.

diff --git a/examples/amber/public/008-backbone-computed-properties b/examples/amber/public/008-backbone-computed-properties index b6dbe75..59628d2 100644 --- a/examples/amber/public/008-backbone-computed-properties +++ b/examples/amber/public/008-backbone-computed-properties @@ -10,13 +10,13 @@ - +
- + Site Name
@@ -36,6 +36,7 @@
+

Je travaille actuellement à temps plein sur mon application-en-devenir de Compte Rendu Web. Cette immersion totale en Javascript, node.js et Backbone est très intéressante. La beauté de l’univers du code libre dans lequel baignent ces technologies est que lorsqu’il manque une fonctionnalité, on peut se retrousser les manches, ouvrir le code et l’ajouter. Voici ma petite histoire des propriétés calculées (computed properties) avec Backbone.

Pas encore une controverse Backbone vs Knockout…

diff --git a/examples/amber/public/009-je-men-vais b/examples/amber/public/009-je-men-vais index 85d4c9a..9c786eb 100644 --- a/examples/amber/public/009-je-men-vais +++ b/examples/amber/public/009-je-men-vais @@ -10,13 +10,13 @@ - +
- + Site Name
@@ -36,6 +36,7 @@
+

Ou plutôt, “je suis venu te dire qu’on m’évince”, mais ça punch moins… En effet, mon coup de foudre pour le blogiciel Calepin aura finalement été son baiser de la mort. Sur Twitter la semaine dernière, via le canal officiel du site, on apprenait que c’était la fin des haricots:

diff --git a/examples/amber/public/010-demenagement b/examples/amber/public/010-demenagement index f797385..ef6fe4c 100644 --- a/examples/amber/public/010-demenagement +++ b/examples/amber/public/010-demenagement @@ -10,13 +10,13 @@ - +
- + Site Name
@@ -36,6 +36,7 @@
+
diff --git a/examples/amber/public/index.html b/examples/amber/public/index.html index f797385..ef6fe4c 100644 --- a/examples/amber/public/index.html +++ b/examples/amber/public/index.html @@ -10,13 +10,13 @@ - +
- + Site Name
@@ -36,6 +36,7 @@
+
diff --git a/examples/amber/public/j-42-preparation b/examples/amber/public/j-42-preparation index 6aaefb0..98d0515 100644 --- a/examples/amber/public/j-42-preparation +++ b/examples/amber/public/j-42-preparation @@ -10,13 +10,13 @@ - +
- + Site Name
@@ -36,6 +36,7 @@
+

Le développement d’une application Web (d’un SaaS, si vous préférez) est ponctué d’une multitude de choix technologiques. Pour le compte rendu Web, le coeur technologique, celui qui a orienté pratiquement tous les autres choix, n’a pourtant pas fait l’objet d’une réflexion, d’une étude comparative. Loin s’en faut. Il a plutôt été l’élément déclencheur de tout le projet.

diff --git a/examples/amber/public/rss b/examples/amber/public/rss index f4d32da..f8b9ae8 100644 --- a/examples/amber/public/rss +++ b/examples/amber/public/rss @@ -1,2 +1,2 @@ -17 Jul 13 19:50 EDTtrofaf (https://github.com/PuerkitoBio/trofaf)Ce blogue a déménagé sur GitHub/010-demenagementSuite à l'annonce de la fermeture de Calepin.co, j'ai déménagé ce blogue sur http://hypermegatop.github.com. Veuillez mettre à jour vos favoris!Martin Angers30 Apr 12 00:00 UTCJe suis venu te dire que je m'en vais/009-je-men-vaisOu plutôt, "je suis venu te dire qu'on m'évince", mais ça "punch" moins... En effet, mon coup de foudre pour le blogiciel Calepin aura finalement été son baiser de la mort. Sur Twitter la semaine dernière, via le canal officiel du site, on apprenait que c'était la fin des haricots.Martin Angers23 Apr 12 00:00 UTCPropriétés calculées avec Backbone/008-backbone-computed-propertiesLa beauté de l'univers du code libre est que lorsqu'il manque une fonctionnalité, on peut se retrousser les manches, ouvrir le code et l'ajouter. Voici ma petite histoire des propriétés calculées avec Backbone.Martin Angers13 Apr 12 00:00 UTCimplement.js: typage fort et Javascript/007-implement-jsL'injection de dépendance avec Javascript a comme conséquence de ne pouvoir assumer que les fonctionnalités offertes par l'instance reçue seront celles attendues.Martin Angers02 Apr 12 00:00 UTCExpérimentations sur l'injection de dépendance avec node.js/006-dependency-injectionL'injection de dépendance permet de découpler les différentes composantes d'une application pour en faciliter l'entretien, la testabilité, circonscrire l'impact des changements, mais aussi pour imposer une façon d'aborder la création de l'application en une aggrégation de pièces simples, à la responsabilité ciblée, et à l'API bien défini.Martin Angers27 Mar 12 00:00 UTC \ No newline at end of file +Site Namehttp://localhost22 Jul 13 12:35 EDTtrofaf (https://github.com/PuerkitoBio/trofaf)Ce blogue a déménagé sur GitHubhttp://localhost/010-demenagementSuite à l'annonce de la fermeture de Calepin.co, j'ai déménagé ce blogue sur http://hypermegatop.github.com. Veuillez mettre à jour vos favoris!Martin Angers30 Apr 12 00:00 UTCJe suis venu te dire que je m'en vaishttp://localhost/009-je-men-vaisOu plutôt, "je suis venu te dire qu'on m'évince", mais ça "punch" moins... En effet, mon coup de foudre pour le blogiciel Calepin aura finalement été son baiser de la mort. Sur Twitter la semaine dernière, via le canal officiel du site, on apprenait que c'était la fin des haricots.Martin Angers23 Apr 12 00:00 UTCPropriétés calculées avec Backbonehttp://localhost/008-backbone-computed-propertiesLa beauté de l'univers du code libre est que lorsqu'il manque une fonctionnalité, on peut se retrousser les manches, ouvrir le code et l'ajouter. Voici ma petite histoire des propriétés calculées avec Backbone.Martin Angers13 Apr 12 00:00 UTCimplement.js: typage fort et Javascripthttp://localhost/007-implement-jsL'injection de dépendance avec Javascript a comme conséquence de ne pouvoir assumer que les fonctionnalités offertes par l'instance reçue seront celles attendues.Martin Angers02 Apr 12 00:00 UTCExpérimentations sur l'injection de dépendance avec node.jshttp://localhost/006-dependency-injectionL'injection de dépendance permet de découpler les différentes composantes d'une application pour en faciliter l'entretien, la testabilité, circonscrire l'impact des changements, mais aussi pour imposer une façon d'aborder la création de l'application en une aggrégation de pièces simples, à la responsabilité ciblée, et à l'API bien défini.Martin Angers27 Mar 12 00:00 UTC \ No newline at end of file diff --git a/examples/amber/templates/post.amber b/examples/amber/templates/post.amber index edce23c..fa37340 100644 --- a/examples/amber/templates/post.amber +++ b/examples/amber/templates/post.amber @@ -1,6 +1,7 @@ extends layout block content + time #{fmttime(Post.ShortPost.PubTime, "2006-01-02")} article [lang=Post.ShortPost.Lang] ? len(Post.ShortPost.Lang) > 0 | #{Post.Content} diff --git a/examples/native/public/index.html b/examples/native/public/index.html index 9c961b0..f0c60c0 100644 --- a/examples/native/public/index.html +++ b/examples/native/public/index.html @@ -7,6 +7,7 @@

This is a test

+

This is a test header

And this is a test content.

diff --git a/examples/native/public/rss b/examples/native/public/rss index 46aac27..fae7efa 100644 --- a/examples/native/public/rss +++ b/examples/native/public/rss @@ -1,2 +1,2 @@ -Site Namehttp://localhost17 Jul 13 12:16 EDTtrofaf (https://github.com/PuerkitoBio/trofaf)This is a testhttp://localhost/testWhateverMe17 Jul 13 00:00 UTC \ No newline at end of file +Site Namehttp://localhost22 Jul 13 12:40 EDTtrofaf (https://github.com/PuerkitoBio/trofaf)This is a testhttp://localhost/testWhateverMe17 Jul 13 00:00 UTC \ No newline at end of file diff --git a/examples/native/public/test b/examples/native/public/test index 9c961b0..f0c60c0 100644 --- a/examples/native/public/test +++ b/examples/native/public/test @@ -7,6 +7,7 @@

This is a test

+

This is a test header

And this is a test content.

diff --git a/examples/native/templates/content.html b/examples/native/templates/content.html index 6deade5..fb0858f 100644 --- a/examples/native/templates/content.html +++ b/examples/native/templates/content.html @@ -1,6 +1,7 @@ {{ define "content" }}

{{ .Post.ShortPost.Title }}

+
{{ .Post.Content }}
{{ end }} diff --git a/gen.go b/gen.go index 45b7863..0e156bd 100644 --- a/gen.go +++ b/gen.go @@ -11,8 +11,9 @@ import ( "path/filepath" "sort" "strings" + "time" - "github.com/eknkc/amber" + "github.com/PuerkitoBio/amber" ) var ( @@ -33,8 +34,20 @@ var ( "apple-touch-icon-72x72-precomposed.png": struct{}{}, "apple-touch-icon-precomposed.png": struct{}{}, } + + funcs = template.FuncMap{ + "fmttime": func(t time.Time, f string) string { + return t.Format(f) + }, + } ) +func init() { + // Add the custom functions to Amber in the init(), since this is global + // (package) state in my Amber fork. + amber.AddFuncs(funcs) +} + // This type is a slice of *LongPost that implements the sort.Interface, to sort in PubTime order. type sortablePosts []*LongPost @@ -59,7 +72,7 @@ func compileTemplates() error { ap := filepath.Join(TemplatesDir, postTplNm) if _, err := os.Stat(ap); os.IsNotExist(err) { // Amber post template does not exist, compile the native Go templates - postTpl, err = template.ParseGlob(filepath.Join(TemplatesDir, "*.html")) + postTpl, err = template.New("templates").Funcs(funcs).ParseGlob(filepath.Join(TemplatesDir, "*.html")) if err != nil { return fmt.Errorf("error parsing templates: %s", err) }