Skip to content
Browse files

build, clean, serve working

  • Loading branch information...
1 parent 4752f6d commit 26680a8eef52d64f067f81c4390ef7c8fb375bfc @chrisfjones chrisfjones committed Dec 17, 2012
Showing with 567 additions and 47 deletions.
  1. +15 −14 lib/cli.js
  2. +348 −7 lib/starman.js
  3. +1 −1 package.json
  4. +21 −17 src/cli.iced
  5. +182 −8 src/starman.iced
View
29 lib/cli.js
@@ -1,6 +1,6 @@
// Generated by IcedCoffeeScript 1.3.3g
(function() {
- var colors, program, starman, todoString;
+ var colors, program, star, starman, todoString;
program = require('commander');
@@ -10,44 +10,45 @@
todoString = 'todo: '.blue;
+ star = '\u2606'.red;
+
program.version('0.0.1').option('-v, --verbose', 'be chatty.');
program.command('init').description('Set up a new project with the appropriate directory structure. Run this within your new project\'s root directory.').action(function(options) {
return starman.init();
});
+ program.command('clean').description('Nuke the release/ directory (don\'t worry, its all regenerated anyway).').action(function(options) {
+ return starman.clean();
+ });
+
program.command('build').description('Compile everything into the release directory.').action(function(options) {
return starman.build();
});
- program.command('watch').description('Keep watching for changes and then compile everything into the release directory.').action(function(options) {
+ program.command('watch').description('Keep watching for changes and then compile everything into the release directory. (Blocks)').action(function(options) {
return starman.watch();
});
- program.command('serve').description('Throw up a server on $port to serve up everything in the release directory.').option('-p, --port [port]', 'The port with which to serve upon. Default is 8080.', parseInt).on("--help", function() {
- return console.log("" + todoString + "display help about serve?");
- }).action(function(options) {
+ program.command('serve').description('Throw up a server on $port to serve up everything in the release directory. (Blocks)').option('-p, --port [port]', 'The port with which to serve upon. Default is 8080.', parseInt).option('-d, --dont-open', 'Don\'t open the url after launching.').on("--help", function() {}).action(function(options) {
var port, portString;
port = options.port || 8080;
portString = ("" + port).green;
- console.log("serving on " + portString);
- return starman.serve(port);
+ starman.serve(port);
+ if (!options.dontOpen) return starman.open(port);
});
- program.command('dev').description('Throw up a server, watch for changes, and open the site in the default browser. Great for speedy development.').option('-p, --port [port]', 'The port with which to serve upon. Default is 8080.', parseInt).on("--help", function() {
- return console.log("todo: display help about dev?");
- }).action(function(options) {
- var port, portString, url;
+ program.command('dev').description('Throw up a server, watch for changes, and open the site in the default browser. Great for speedy development. (Blocks)').option('-p, --port [port]', 'The port with which to serve upon. Default is 8080.', parseInt).option('-d, --dont-open', 'Don\'t open the url after launching.').on("--help", function() {}).action(function(options) {
+ var port;
port = options.port || 8080;
- portString = ("" + port).green;
starman.build();
starman.watch();
starman.serve(port);
- url = "http://localhost:" + port;
- return console.log("" + todoString + "open " + url);
+ if (!options.dontOpen) return starman.open(port);
});
module.exports.run = function() {
+ process.stdout.write("" + star + " ");
return program.parse(process.argv);
};
View
355 lib/starman.js
@@ -1,20 +1,361 @@
// Generated by IcedCoffeeScript 1.3.3g
(function() {
+ var buildOutputTemplateFilePath, cc, ccupOptions, colors, compileLayout, compilePage, compilePages, cs, default_index_content, default_layout_content, default_style_content, error, exec, fs, fsextra, iced, makeReleaseDir, path, vm, _, __iced_k, __iced_k_noop, _ref,
+ __slice = [].slice;
+
+ iced = {
+ Deferrals: (function() {
+
+ function _Class(_arg) {
+ this.continuation = _arg;
+ this.count = 1;
+ this.ret = null;
+ }
+
+ _Class.prototype._fulfill = function() {
+ if (!--this.count) return this.continuation(this.ret);
+ };
+
+ _Class.prototype.defer = function(defer_params) {
+ var _this = this;
+ ++this.count;
+ return function() {
+ var inner_params, _ref;
+ inner_params = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
+ if (defer_params != null) {
+ if ((_ref = defer_params.assign_fn) != null) {
+ _ref.apply(null, inner_params);
+ }
+ }
+ return _this._fulfill();
+ };
+ };
+
+ return _Class;
+
+ })(),
+ findDeferral: function() {
+ return null;
+ },
+ trampoline: function(_fn) {
+ return _fn();
+ }
+ };
+ __iced_k = __iced_k_noop = function() {};
+
+ fs = require('fs');
+
+ fsextra = require('fs.extra');
+
+ path = require('path');
+
+ vm = require('vm');
+
+ cc = require('coffeecup');
+
+ cs = require('coffee-script');
+
+ colors = require('colors');
+
+ exec = require('child_process').exec;
+
+ _ = require('underscore');
+
+ _ref = [null, null, null], default_layout_content = _ref[0], default_index_content = _ref[1], default_style_content = _ref[2];
+
+ compilePages = [null][0];
module.exports.init = function() {
- return console.log('init');
+ console.log('Generating skeleton project...');
+ try {
+ fs.writeFile('layout.html.coffee', default_layout_content, function(err) {
+ if (err) return console.error(err);
+ });
+ console.log(' layout.html.coffee'.green);
+ console.log('\tThis is the layout template that every page will share.');
+ fsextra.mkdirRecursiveSync('pages');
+ fs.writeFile('pages/index.html.coffee', default_index_content, function(err) {
+ if (err) return console.error(err);
+ });
+ console.log(' pages/'.green);
+ console.log('\tThis is where coffeecup templates go (like index.html.coffee).');
+ console.log('\tThey\'ll be compiled into *.html files in the release folder.');
+ fsextra.mkdirRecursiveSync('scss');
+ fs.writeFile('scss/style.scss', default_style_content, function(err) {
+ if (err) return console.error(err);
+ });
+ console.log(' scss/'.green);
+ console.log('\tThis is where the SCSS source files go.');
+ console.log('\tThey\'ll be compiled into css/*.css files in the release folder.');
+ fsextra.mkdirRecursiveSync('src');
+ console.log(' src/'.green);
+ console.log('\tThis is where all your coffeescript source files will go.');
+ console.log('\tThey\'ll be compiled into lib/*.js files in the release folder.');
+ fsextra.mkdirRecursiveSync('static');
+ console.log(' static/'.green);
+ return console.log('\tThis is where all your static resources (images, etc) go.');
+ } catch (e) {
+ return console.error(e);
+ }
+ };
+
+ module.exports.clean = function(callback) {
+ var ___iced_passed_deferral, __iced_deferrals, __iced_k,
+ _this = this;
+ __iced_k = __iced_k_noop;
+ ___iced_passed_deferral = iced.findDeferral(arguments);
+ (function(__iced_k) {
+ __iced_deferrals = new iced.Deferrals(__iced_k, {
+ parent: ___iced_passed_deferral,
+ filename: "src/starman.iced",
+ funcname: "clean"
+ });
+ exec('rm -rf release/', __iced_deferrals.defer({
+ lineno: 48
+ }));
+ __iced_deferrals._fulfill();
+ })(function() {
+ console.log("Removed release directory");
+ return typeof callback === "function" ? callback() : void 0;
+ });
+ };
+
+ module.exports.open = function(port) {
+ var err, ___iced_passed_deferral, __iced_deferrals, __iced_k,
+ _this = this;
+ __iced_k = __iced_k_noop;
+ ___iced_passed_deferral = iced.findDeferral(arguments);
+ (function(__iced_k) {
+ __iced_deferrals = new iced.Deferrals(__iced_k, {
+ parent: ___iced_passed_deferral,
+ filename: "src/starman.iced",
+ funcname: "open"
+ });
+ exec("open http://localhost:" + port, __iced_deferrals.defer({
+ assign_fn: (function() {
+ return function() {
+ return err = arguments[0];
+ };
+ })(),
+ lineno: 53
+ }));
+ __iced_deferrals._fulfill();
+ })(function() {
+ if (typeof err !== "undefined" && err !== null) return console.error(err);
+ });
+ };
+
+ module.exports.build = function(callback) {
+ var copyErr, csErr, pagesErr, sassErr, stderr, stdout, ___iced_passed_deferral, __iced_deferrals, __iced_k,
+ _this = this;
+ __iced_k = __iced_k_noop;
+ ___iced_passed_deferral = iced.findDeferral(arguments);
+ (function(__iced_k) {
+ try {
+ (function(__iced_k) {
+ __iced_deferrals = new iced.Deferrals(__iced_k, {
+ parent: ___iced_passed_deferral,
+ filename: "src/starman.iced",
+ funcname: "build"
+ });
+ exec('rm -rf release/', __iced_deferrals.defer({
+ lineno: 58
+ }));
+ __iced_deferrals._fulfill();
+ })(function() {
+ fsextra.mkdirRecursiveSync('release');
+ (function(__iced_k) {
+ __iced_deferrals = new iced.Deferrals(__iced_k, {
+ parent: ___iced_passed_deferral,
+ filename: "src/starman.iced",
+ funcname: "build"
+ });
+ fsextra.copyRecursive('./static', './release', __iced_deferrals.defer({
+ assign_fn: (function() {
+ return function() {
+ return copyErr = arguments[0];
+ };
+ })(),
+ lineno: 62
+ }));
+ exec('sass --scss -t expanded --update -f scss:release/css', __iced_deferrals.defer({
+ assign_fn: (function() {
+ return function() {
+ return sassErr = arguments[0];
+ };
+ })(),
+ lineno: 63
+ }));
+ exec('coffee -c -o release/lib/ src/', __iced_deferrals.defer({
+ assign_fn: (function() {
+ return function() {
+ csErr = arguments[0];
+ stdout = arguments[1];
+ return stderr = arguments[2];
+ };
+ })(),
+ lineno: 63
+ }));
+ compilePages(__iced_deferrals.defer({
+ assign_fn: (function() {
+ return function() {
+ return pagesErr = arguments[0];
+ };
+ })(),
+ lineno: 65
+ }));
+ __iced_deferrals._fulfill();
+ })(function() {
+ if (copyErr || sassErr || csErr || pagesErr) {
+ throw copyErr || sassErr || csErr || pagesErr;
+ }
+ });
+ });
+ } catch (e) {
+ return console.error(e);
+ }
+ })(function() {
+ return typeof callback === "function" ? callback() : void 0;
+ });
};
- module.exports.build = function() {
- return console.log('build');
+ module.exports.watch = function(callback) {
+ console.log('todo: watch');
+ return typeof callback === "function" ? callback() : void 0;
+ };
+
+ module.exports.serve = function(port, callback) {
+ var connect, portString, staticDir;
+ connect = require('connect');
+ staticDir = path.join(process.cwd(), 'release');
+ portString = ("" + port).green;
+ console.log("serving '" + staticDir.green + "' on " + portString);
+ connect.createServer(connect["static"](staticDir)).listen(port);
+ return typeof callback === "function" ? callback() : void 0;
+ };
+
+ makeReleaseDir = _.memoize(function(srcDir) {
+ var dirChunks, releaseDir;
+ dirChunks = srcDir.split(path.sep);
+ dirChunks[0] = 'release';
+ releaseDir = dirChunks.join(path.sep);
+ fsextra.mkdirRecursiveSync(releaseDir);
+ return releaseDir;
+ });
+
+ ccupOptions = {
+ format: true
};
- module.exports.watch = function() {
- return console.log('watch');
+ error = function(err) {
+ if (err != null) {
+ console.log(err);
+ return true;
+ }
+ return false;
};
- module.exports.serve = function() {
- return console.log('serve');
+ compileLayout = function(callback) {
+ var layoutFileContents, layoutTemplate;
+ console.log("compiling layout...");
+ try {
+ layoutFileContents = fs.readFileSync('layout.html.coffee').toString();
+ layoutTemplate = cc.compile(layoutFileContents, ccupOptions);
+ return typeof callback === "function" ? callback(layoutTemplate) : void 0;
+ } catch (e) {
+ console.error("failed to compile 'layout.html.coffee':");
+ console.error(e);
+ return typeof callback === "function" ? callback() : void 0;
+ }
};
+ buildOutputTemplateFilePath = function(sourcePath) {
+ var dirChunks, fileChunks;
+ dirChunks = sourcePath.split(path.sep);
+ dirChunks.shift();
+ fileChunks = dirChunks.pop().split('.');
+ fileChunks.pop();
+ return path.join('release', dirChunks.join(path.sep), fileChunks.join('.'));
+ };
+
+ compilePage = function(file, layoutTemplate) {
+ var compiledContents, context, outputFilePath, pageContents, prop, results, value;
+ if (path.extname(file) !== '.coffee') return;
+ outputFilePath = buildOutputTemplateFilePath(file);
+ console.log("\t" + file + " -> " + outputFilePath);
+ try {
+ pageContents = fs.readFileSync(file).toString();
+ compiledContents = cs.compile(pageContents, {
+ bare: true
+ });
+ context = {};
+ vm.runInNewContext(compiledContents, context);
+ for (prop in context) {
+ value = context[prop];
+ if (typeof value !== 'function') continue;
+ context[prop] = cc.render(value, context);
+ }
+ results = layoutTemplate(context);
+ return fs.writeFile(outputFilePath, results, 'utf-8');
+ } catch (e) {
+ return console.error(e);
+ }
+ };
+
+ compilePages = function(callback) {
+ var err, layoutTemplate, options, walker, ___iced_passed_deferral, __iced_deferrals, __iced_k,
+ _this = this;
+ __iced_k = __iced_k_noop;
+ ___iced_passed_deferral = iced.findDeferral(arguments);
+ try {
+ err = null;
+ (function(__iced_k) {
+ __iced_deferrals = new iced.Deferrals(__iced_k, {
+ parent: ___iced_passed_deferral,
+ filename: "src/starman.iced",
+ funcname: "compilePages"
+ });
+ compileLayout(__iced_deferrals.defer({
+ assign_fn: (function() {
+ return function() {
+ return layoutTemplate = arguments[0];
+ };
+ })(),
+ lineno: 138
+ }));
+ __iced_deferrals._fulfill();
+ })(function() {
+ if (!(typeof layoutTemplate !== "undefined" && layoutTemplate !== null)) {
+ if (typeof callback === "function") {
+ callback("couldn't compile layout.html.coffee");
+ }
+ return;
+ }
+ options = {
+ followLinks: false
+ };
+ walker = fsextra.walk('pages', options);
+ walker.on('file', function(root, fileStats, next) {
+ makeReleaseDir(root);
+ compilePage("" + root + "/" + fileStats.name, layoutTemplate);
+ return next();
+ });
+ walker.on("end", function() {});
+ if (error(err)) {
+ return typeof callback === "function" ? callback(err) : void 0;
+ } else {
+ return typeof callback === "function" ? callback() : void 0;
+ }
+ });
+ } catch (e) {
+ return typeof callback === "function" ? callback(e) : void 0;
+ }
+ };
+
+ default_layout_content = "doctype 5\nhtml class: 'no-js', ->\n head ->\n meta charset: 'utf-8'\n meta 'http-equiv': 'X-UA-Compatible', content: 'IE=edge,chrome=1'\n title ''\n link rel: 'stylesheet', href: '/css/style.css'\n body ->\n ie 'IE7', ->\n p '.chromeframe', 'You are using an <strong>outdated</strong> browser. Please <a href=\"http://browsehappy.com/\">upgrade your browswer</a> or <a href=\"http://www.google.com/chromeframe/?redirect=true\">activate Google Chrome Frame</a> to improve your experience.'\n div -> @body\n";
+
+ default_index_content = "body = ->\n p 'Welcome to Starman'\n";
+
+ default_style_content = "body {\n font-size: 1em;\n line-height: 1.4;\n}\n";
+
}).call(this);
View
2 package.json
@@ -24,7 +24,7 @@
"connect":"2.7.0",
"underscore":"1.4.2",
"walk":"2.2.1",
- "node-fs":"0.1.5",
+ "fs.extra":"1.2.0",
"colors":"0.6.0-1"
},
"author": "Chris Jones <chris@thebriga.de>",
View
38 src/cli.iced
@@ -3,6 +3,7 @@ colors = require 'colors'
starman = require './starman'
todoString = 'todo: '.blue
+star = '\u2606'.red
program
.version('0.0.1')
@@ -12,58 +13,61 @@ program
.command('init')
.description('Set up a new project with the appropriate directory structure. Run this within your new project\'s root directory.')
.action((options) ->
- #todo: grab any options
starman.init()
)
program
+ .command('clean')
+ .description('Nuke the release/ directory (don\'t worry, its all regenerated anyway).')
+ .action((options) ->
+ starman.clean()
+ )
+
+program
.command('build')
.description('Compile everything into the release directory.')
.action((options) ->
- #todo: grab any options
starman.build()
)
program
.command('watch')
- .description('Keep watching for changes and then compile everything into the release directory.')
+ .description('Keep watching for changes and then compile everything into the release directory. (Blocks)')
.action((options) ->
- #todo: grab any options
starman.watch()
)
program
.command('serve')
- .description('Throw up a server on $port to serve up everything in the release directory.')
+ .description('Throw up a server on $port to serve up everything in the release directory. (Blocks)')
.option('-p, --port [port]', 'The port with which to serve upon. Default is 8080.', parseInt)
+ .option('-d, --dont-open', 'Don\'t open the url after launching.')
.on("--help", ->
- console.log "#{todoString}display help about serve?"
+ # custom help
).action((options) ->
port = options.port or 8080
portString = "#{port}".green
- console.log "serving on #{portString}"
- starman.serve port
+
+ starman.serve port
+ starman.open port unless options.dontOpen
)
program
.command('dev')
- .description('Throw up a server, watch for changes, and open the site in the default browser. Great for speedy development.')
+ .description('Throw up a server, watch for changes, and open the site in the default browser. Great for speedy development. (Blocks)')
.option('-p, --port [port]', 'The port with which to serve upon. Default is 8080.', parseInt)
+ .option('-d, --dont-open', 'Don\'t open the url after launching.')
.on("--help", ->
- console.log "todo: display help about dev?"
+ # custom help
).action((options) ->
port = options.port or 8080
- portString = "#{port}".green
-
+
starman.build()
-
starman.watch()
-
starman.serve port
-
- url = "http://localhost:#{port}"
- console.log "#{todoString}open #{url}"
+ starman.open port unless options.dontOpen
)
module.exports.run = ->
+ process.stdout.write "#{star} "
program.parse process.argv
View
190 src/starman.iced
@@ -1,12 +1,186 @@
+fs = require 'fs'
+fsextra = require 'fs.extra'
+path = require 'path'
+vm = require 'vm'
+cc = require 'coffeecup'
+cs = require 'coffee-script'
+colors = require 'colors'
+{exec} = require 'child_process'
+_ = require 'underscore'
+
+[default_layout_content, default_index_content, default_style_content] = [null, null, null]
+[compilePages] = [null]
+
module.exports.init = ->
- console.log 'init'
+ console.log 'Generating skeleton project...'
+ try
+ fs.writeFile 'layout.html.coffee', default_layout_content, (err) ->
+ console.error(err) if err
+ console.log ' layout.html.coffee'.green
+ console.log '\tThis is the layout template that every page will share.'
+
+ fsextra.mkdirRecursiveSync 'pages'
+ fs.writeFile 'pages/index.html.coffee', default_index_content, (err) ->
+ console.error(err) if err
+ console.log ' pages/'.green
+ console.log '\tThis is where coffeecup templates go (like index.html.coffee).'
+ console.log '\tThey\'ll be compiled into *.html files in the release folder.'
+
+ fsextra.mkdirRecursiveSync 'scss'
+ fs.writeFile 'scss/style.scss', default_style_content, (err) ->
+ console.error(err) if err
+ console.log ' scss/'.green
+ console.log '\tThis is where the SCSS source files go.'
+ console.log '\tThey\'ll be compiled into css/*.css files in the release folder.'
+
+ fsextra.mkdirRecursiveSync 'src'
+ console.log ' src/'.green
+ console.log '\tThis is where all your coffeescript source files will go.'
+ console.log '\tThey\'ll be compiled into lib/*.js files in the release folder.'
+
+ fsextra.mkdirRecursiveSync 'static'
+ console.log ' static/'.green
+ console.log '\tThis is where all your static resources (images, etc) go.'
+
+ catch e
+ console.error e
+
+module.exports.clean = (callback) ->
+ await exec 'rm -rf release/', defer()
+ console.log "Removed release directory"
+ callback?()
-module.exports.build = ->
- console.log 'build'
+module.exports.open = (port) ->
+ await exec "open http://localhost:#{port}", defer(err)
+ console.error err if err?
+
+module.exports.build = (callback) ->
+ try
+ await exec 'rm -rf release/', defer()
+ fsextra.mkdirRecursiveSync 'release'
+ await
+ fsextra.copyRecursive './static', './release', defer copyErr
+ exec 'sass --scss -t expanded --update -f scss:release/css', defer sassErr
+ exec 'coffee -c -o release/lib/ src/', defer(csErr, stdout, stderr)
+ compilePages defer pagesErr
+ if copyErr or sassErr or csErr or pagesErr
+ throw copyErr or sassErr or csErr or pagesErr
+ catch e
+ console.error e
+ callback?()
+
+module.exports.watch = (callback) ->
+ console.log 'todo: watch'
+ callback?()
-module.exports.watch = ->
- console.log 'watch'
-
-module.exports.serve = ->
- console.log 'serve'
+module.exports.serve = (port, callback) ->
+ connect = require 'connect'
+ staticDir = path.join(process.cwd(), 'release')
+ portString = "#{port}".green
+ console.log "serving '#{staticDir.green}' on #{portString}"
+ connect.createServer(connect.static(staticDir)).listen port
+ callback?()
+
+makeReleaseDir = _.memoize (srcDir) ->
+ dirChunks = srcDir.split path.sep
+ dirChunks[0] = 'release'
+ releaseDir = dirChunks.join path.sep
+ fsextra.mkdirRecursiveSync releaseDir
+ return releaseDir
+
+ccupOptions = format: true
+error = (err) ->
+ if err?
+ console.log err
+ return true
+ return false
+
+compileLayout = (callback) ->
+ console.log "compiling layout..."
+ try
+ layoutFileContents = fs.readFileSync('layout.html.coffee').toString()
+ layoutTemplate = cc.compile layoutFileContents, ccupOptions
+ callback? layoutTemplate
+ catch e
+ console.error "failed to compile 'layout.html.coffee':"
+ console.error e
+ callback?()
+
+buildOutputTemplateFilePath = (sourcePath) ->
+ dirChunks = sourcePath.split path.sep
+ dirChunks.shift()
+ fileChunks = dirChunks.pop().split '.'
+ fileChunks.pop()
+ path.join 'release', dirChunks.join(path.sep), fileChunks.join '.'
+compilePage = (file, layoutTemplate) ->
+ return if path.extname(file) isnt '.coffee'
+ outputFilePath = buildOutputTemplateFilePath file
+ console.log "\t#{file} -> #{outputFilePath}"
+
+ try
+ pageContents = fs.readFileSync(file).toString()
+ compiledContents = cs.compile pageContents, bare: true
+ context = {}
+ vm.runInNewContext compiledContents, context
+
+ for prop, value of context
+ continue if typeof value isnt 'function'
+ context[prop] = cc.render value, context
+
+ results = layoutTemplate context
+ fs.writeFile outputFilePath, results, 'utf-8'
+ catch e
+ console.error e
+
+compilePages = (callback) ->
+ try
+ err = null
+ await compileLayout defer(layoutTemplate)
+ if not layoutTemplate?
+ callback? "couldn't compile layout.html.coffee"
+ return
+
+ options = followLinks: false
+ walker = fsextra.walk 'pages', options
+ walker.on 'file', (root, fileStats, next) ->
+ makeReleaseDir root
+ compilePage "#{root}/#{fileStats.name}", layoutTemplate
+ next()
+ walker.on "end", () ->
+
+ if error err
+ callback? err
+ else
+ callback?()
+ catch e
+ callback? e
+
+
+
+default_layout_content = """
+doctype 5
+html class: 'no-js', ->
+ head ->
+ meta charset: 'utf-8'
+ meta 'http-equiv': 'X-UA-Compatible', content: 'IE=edge,chrome=1'
+ title ''
+ link rel: 'stylesheet', href: '/css/style.css'
+ body ->
+ ie 'IE7', ->
+ p '.chromeframe', 'You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browswer</a> or <a href="http://www.google.com/chromeframe/?redirect=true">activate Google Chrome Frame</a> to improve your experience.'
+ div -> @body
+
+"""
+default_index_content = """
+body = ->
+ p 'Welcome to Starman'
+
+"""
+default_style_content = """
+body {
+ font-size: 1em;
+ line-height: 1.4;
+}
+
+"""

0 comments on commit 26680a8

Please sign in to comment.
Something went wrong with that request. Please try again.