aladdin 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- data/assets/fonts/general_foundicons.eot +0 -0
- data/assets/fonts/general_foundicons.svg +15 -0
- data/assets/fonts/general_foundicons.ttf +0 -0
- data/assets/fonts/general_foundicons.woff +0 -0
- data/bin/aladdin +3 -2
- data/lib/aladdin.rb +14 -69
- data/lib/aladdin/app.rb +5 -1
- data/lib/aladdin/commands.rb +48 -0
- data/lib/aladdin/commands/new.rb +59 -9
- data/lib/aladdin/commands/server.rb +33 -5
- data/lib/aladdin/config.rb +52 -0
- data/lib/aladdin/constants.rb +29 -0
- data/lib/aladdin/render.rb +8 -0
- data/lib/aladdin/render/error.rb +3 -6
- data/lib/aladdin/render/markdown.rb +16 -25
- data/lib/aladdin/render/templates.rb +2 -0
- data/lib/aladdin/render/templates/header.rb +52 -0
- data/lib/aladdin/render/{image.rb → templates/image.rb} +0 -0
- data/lib/aladdin/render/{multi.rb → templates/multi.rb} +0 -0
- data/lib/aladdin/render/{navigation.rb → templates/navigation.rb} +5 -5
- data/lib/aladdin/render/{problem.rb → templates/problem.rb} +1 -1
- data/lib/aladdin/render/{short.rb → templates/short.rb} +0 -0
- data/lib/aladdin/render/{table.rb → templates/table.rb} +0 -0
- data/lib/aladdin/render/{template.rb → templates/template.rb} +5 -3
- data/lib/aladdin/submission.rb +3 -3
- data/lib/aladdin/support.rb +10 -0
- data/lib/aladdin/support/core_ext.rb +2 -0
- data/lib/aladdin/support/core_ext/hash.rb +10 -0
- data/lib/aladdin/support/logger.rb +29 -0
- data/lib/aladdin/{mixin → support}/weak_comparator.rb +8 -6
- data/lib/aladdin/version.rb +1 -1
- data/skeleton/gitignore +3 -0
- data/skeleton/manifest.json +9 -0
- data/views/haml/header.haml +5 -0
- data/views/haml/layout.haml +4 -0
- data/views/haml/nav.haml +3 -3
- data/views/scss/_settings.scss +30 -1
- data/views/scss/app.scss +26 -5
- data/views/scss/general_foundicons.scss +71 -0
- data/views/scss/general_foundicons_ie7.scss +56 -0
- metadata +45 -12
- data/lib/aladdin/cli.rb +0 -29
- data/lib/aladdin/mixin/logger.rb +0 -26
Binary file
|
@@ -0,0 +1,15 @@
|
|
1
|
+
<?xml version="1.0" standalone="no"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd" > <svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%">
|
2
|
+
<defs >
|
3
|
+
<font id="generalfoundicons" horiz-adv-x="955" ><font-face
|
4
|
+
font-family="General Foundicons"
|
5
|
+
units-per-em="1000"
|
6
|
+
panose-1="0 0 0 0 0 0 0 0 0 0"
|
7
|
+
ascent="1000"
|
8
|
+
descent="0"
|
9
|
+
alphabetic="0" />
|
10
|
+
<missing-glyph horiz-adv-x="250" />
|
11
|
+
<glyph unicode=" " glyph-name="space" horiz-adv-x="250" />
|
12
|
+
<glyph unicode="~" glyph-name="asciitilde" horiz-adv-x="1000" />
|
13
|
+
</font>
|
14
|
+
</defs>
|
15
|
+
</svg>
|
Binary file
|
Binary file
|
data/bin/aladdin
CHANGED
data/lib/aladdin.rb
CHANGED
@@ -1,88 +1,33 @@
|
|
1
1
|
# ~*~ encoding: utf-8 ~*~
|
2
|
-
require 'sinatra'
|
3
|
-
require 'zurb-foundation'
|
4
|
-
require 'albino'
|
5
|
-
require 'haml'
|
6
|
-
require 'redcarpet'
|
7
|
-
require 'htmlentities'
|
8
|
-
require 'sanitize'
|
9
|
-
require 'yaml'
|
10
2
|
require 'json'
|
3
|
+
require 'active_support/core_ext/hash'
|
11
4
|
|
12
|
-
require 'aladdin/
|
13
|
-
require 'aladdin/
|
14
|
-
require 'aladdin/
|
15
|
-
require 'aladdin/render
|
5
|
+
require 'aladdin/constants'
|
6
|
+
require 'aladdin/config'
|
7
|
+
require 'aladdin/support'
|
8
|
+
require 'aladdin/render'
|
16
9
|
|
17
|
-
# Aladdin is a gem that
|
18
|
-
#
|
10
|
+
# Aladdin is a gem that lesson authors can use to preview and test their
|
11
|
+
# lessons locally.
|
19
12
|
module Aladdin
|
20
|
-
|
21
|
-
# Name of configuration file.
|
22
|
-
CONFIG_FILE = '.genie.yml'
|
23
|
-
|
24
|
-
# Default configuration options.
|
25
|
-
DEFAULT_CONFIG = {
|
26
|
-
'verify' => {
|
27
|
-
'bin' => 'make',
|
28
|
-
'arg_prefix' => ''
|
29
|
-
},
|
30
|
-
'title' => 'Lesson X',
|
31
|
-
'description' => 'This is a placeholder description. You should provide your own',
|
32
|
-
'categories' => []
|
33
|
-
}
|
34
|
-
|
35
13
|
class << self
|
36
14
|
|
37
|
-
|
15
|
+
include Support::Logger
|
16
|
+
attr_accessor :config
|
38
17
|
|
39
18
|
# Launches the tutorial app using 'thin' as the default webserver.
|
40
19
|
# @option opts [String] from path to author's markdown documents;
|
41
20
|
# defaults to the current working directory
|
42
21
|
def launch(opts = {})
|
43
|
-
|
44
|
-
|
22
|
+
root = opts[:from] || Dir.pwd
|
23
|
+
@config = Config.new root
|
24
|
+
require 'aladdin/app'
|
45
25
|
Aladdin::App.set :views, Aladdin::VIEWS.merge(markdown: root)
|
46
26
|
Aladdin::App.run!
|
47
|
-
|
48
|
-
|
49
|
-
private
|
50
|
-
|
51
|
-
# Reads configuration options from +.genie.yml+ and merges it into
|
52
|
-
# {DEFAULT_CONFIG}.
|
53
|
-
def configure
|
54
|
-
config_file = File.expand_path CONFIG_FILE, root
|
55
|
-
config = File.exists?(config_file) ? YAML.load_file(config_file) : {}
|
56
|
-
@config = DEFAULT_CONFIG.merge(config) { |k, l, r|
|
57
|
-
(l.is_a?(Hash) and r.is_a?(Hash)) ? l.merge(r) : r
|
58
|
-
}
|
59
|
-
end
|
60
|
-
|
61
|
-
# Converts a hash to struct.
|
62
|
-
def to_struct(hash)
|
63
|
-
Struct.new( *(k = hash.keys) ).new( *hash.values_at( *k ) )
|
27
|
+
rescue => e
|
28
|
+
logger.error e.message
|
64
29
|
end
|
65
30
|
|
66
31
|
end
|
67
|
-
|
68
|
-
# Paths to different types of views.
|
69
|
-
VIEWS = {
|
70
|
-
haml: File.expand_path('../../views/haml', __FILE__),
|
71
|
-
scss: File.expand_path('../../views/scss', __FILE__),
|
72
|
-
default: File.expand_path('../../views', __FILE__)
|
73
|
-
}
|
74
|
-
|
75
|
-
# Paths to other parts of the library.
|
76
|
-
PATHS = to_struct(
|
77
|
-
assets: File.expand_path('../../assets', __FILE__),
|
78
|
-
).freeze
|
79
|
-
|
80
|
-
# File extension for solution files.
|
81
|
-
DATA_EXT = '.sol'
|
82
|
-
|
83
|
-
# @todo TODO allow configuration?
|
84
|
-
DATA_DIR = Dir.tmpdir
|
85
|
-
|
86
32
|
end
|
87
33
|
|
88
|
-
require 'aladdin/app'
|
data/lib/aladdin/app.rb
CHANGED
@@ -1,4 +1,8 @@
|
|
1
1
|
# ~*~ encoding: utf-8 ~*~
|
2
|
+
require 'sinatra'
|
3
|
+
require 'zurb-foundation'
|
4
|
+
require 'aladdin/submission'
|
5
|
+
|
2
6
|
module Aladdin
|
3
7
|
|
4
8
|
# Sinatra app that serves the tutorial. Should be able to use this in a
|
@@ -94,7 +98,7 @@ module Aladdin
|
|
94
98
|
get '/*' do |path|
|
95
99
|
path = path.empty? ? INDEX : path.to_sym
|
96
100
|
render_or_pass do
|
97
|
-
markdown(path, locals: Aladdin.config)
|
101
|
+
markdown(path, locals: Aladdin.config.to_hash)
|
98
102
|
end
|
99
103
|
end
|
100
104
|
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# ~*~ encoding: utf-8 ~*~
|
2
|
+
Signal.trap('INT') { puts; exit(1) }
|
3
|
+
|
4
|
+
module Aladdin
|
5
|
+
|
6
|
+
# Parses the command line arguments and invokes the relevant command.
|
7
|
+
# @example Adding a command
|
8
|
+
# Commands.register do
|
9
|
+
# def new
|
10
|
+
# # do stuff
|
11
|
+
# end
|
12
|
+
# end
|
13
|
+
module Commands
|
14
|
+
|
15
|
+
# Path to USAGE file.
|
16
|
+
USAGE = File.join File.dirname(__FILE__), *%w(commands/USAGE)
|
17
|
+
|
18
|
+
# Registers a new command.
|
19
|
+
def register(&block)
|
20
|
+
extend Module.new(&block)
|
21
|
+
end
|
22
|
+
|
23
|
+
# Parses the command line arguments.
|
24
|
+
def parse!(argv=ARGV, opts={})
|
25
|
+
command = argv.shift
|
26
|
+
case command
|
27
|
+
when '--version', '-v'
|
28
|
+
puts "Aladdin #{Aladdin::VERSION}"
|
29
|
+
exit 0
|
30
|
+
when '--help', '-h'
|
31
|
+
puts File.read USAGE
|
32
|
+
exit 0
|
33
|
+
else
|
34
|
+
require_relative 'commands/new'
|
35
|
+
require_relative 'commands/server'
|
36
|
+
send command, argv, opts
|
37
|
+
end
|
38
|
+
rescue => e
|
39
|
+
puts e.message
|
40
|
+
puts File.read USAGE
|
41
|
+
exit 1
|
42
|
+
end
|
43
|
+
|
44
|
+
extend self
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
data/lib/aladdin/commands/new.rb
CHANGED
@@ -1,16 +1,66 @@
|
|
1
1
|
# ~*~ encoding: utf-8 ~*~
|
2
2
|
require 'aladdin'
|
3
3
|
require 'optparse'
|
4
|
+
require 'aladdin/constants'
|
4
5
|
|
5
|
-
|
6
|
-
SKELETON_FILES = %w(.genie.yml index.md images)
|
6
|
+
module Aladdin
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
8
|
+
module Commands
|
9
|
+
|
10
|
+
# @example
|
11
|
+
# $> aladdin new path/to/lesson/root
|
12
|
+
module New
|
13
|
+
|
14
|
+
# Array of skeleton files to be copied over.
|
15
|
+
FILES = %w(index.md images) << Aladdin::Config::FILE
|
16
|
+
|
17
|
+
# Array of dot files to be copied over and renamed.
|
18
|
+
DOT_FILES = %w(gitignore)
|
19
|
+
|
20
|
+
# Flags for {FileUtils.cp_r}
|
21
|
+
COPY_FLAGS = {verbose: true}
|
22
|
+
|
23
|
+
# Copies skeleton files to given destination.
|
24
|
+
# @param [String] dest destination path
|
25
|
+
# @param [Hash] flags options for {FileUtils.cp_r}
|
26
|
+
# @return [Void]
|
27
|
+
def copy_files(dest, flags={})
|
28
|
+
flags = COPY_FLAGS.merge flags
|
29
|
+
paths = FILES.map { |file| path_to file }
|
30
|
+
FileUtils.cp_r paths, dest, flags
|
31
|
+
DOT_FILES.each do |file|
|
32
|
+
FileUtils.cp_r path_to(file), File.join(dest, '.' + file), flags
|
33
|
+
end
|
34
|
+
end
|
12
35
|
|
13
|
-
|
36
|
+
# Prefixes +filename+ with the skeleton directory.
|
37
|
+
# @param [String] filename name of file to resolve
|
38
|
+
# @return [String] path
|
39
|
+
def path_to(file)
|
40
|
+
File.expand_path file, Aladdin::PATHS.skeleton
|
41
|
+
end
|
14
42
|
|
15
|
-
|
16
|
-
|
43
|
+
# Parses the command line arguments.
|
44
|
+
# @param [Array] argv command line arguments
|
45
|
+
# @return [Void]
|
46
|
+
def parse!(argv)
|
47
|
+
opt_parser = OptionParser.new do |opts|
|
48
|
+
opts.banner = "Usage: aladdin new [options] [LESSON_PATH]"
|
49
|
+
end
|
50
|
+
opt_parser.parse! argv
|
51
|
+
end
|
52
|
+
|
53
|
+
extend self
|
54
|
+
|
55
|
+
Commands.register do
|
56
|
+
def new(argv=ARGV, opts={})
|
57
|
+
New.parse! argv
|
58
|
+
New.copy_files(argv[0] || Dir.pwd, opts)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
@@ -2,9 +2,37 @@
|
|
2
2
|
require 'aladdin'
|
3
3
|
require 'optparse'
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
5
|
+
module Aladdin
|
6
|
+
|
7
|
+
module Commands
|
8
|
+
|
9
|
+
# @example
|
10
|
+
# $> aladdin server path/to/lesson/root
|
11
|
+
module Server
|
12
|
+
|
13
|
+
# Parses the command line arguments.
|
14
|
+
# @param [Array] argv command line arguments
|
15
|
+
# @return [Void]
|
16
|
+
def parse!(argv)
|
17
|
+
opt_parser = OptionParser.new do |opts|
|
18
|
+
opts.banner = "Usage: aladdin server [options] [LESSON_PATH]"
|
19
|
+
end
|
20
|
+
opt_parser.parse! argv
|
21
|
+
end
|
22
|
+
|
23
|
+
extend self
|
9
24
|
|
10
|
-
|
25
|
+
Commands.register do
|
26
|
+
def server(argv=ARGV, opts={})
|
27
|
+
Server.parse! argv
|
28
|
+
Aladdin.launch opts.merge(from: argv[0])
|
29
|
+
rescue => e
|
30
|
+
puts e.message
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# ~*~ encoding: utf-8 ~*~
|
2
|
+
|
3
|
+
module Aladdin
|
4
|
+
|
5
|
+
# Raised when there is a configuration error.
|
6
|
+
class ConfigError < StandardError; end
|
7
|
+
|
8
|
+
# Configuration options for Aladdin.
|
9
|
+
class Config
|
10
|
+
|
11
|
+
# Name of configuration file.
|
12
|
+
FILE = 'manifest.json'
|
13
|
+
|
14
|
+
# Default configuration options.
|
15
|
+
DEFAULTS = {
|
16
|
+
'verify' => {
|
17
|
+
'bin' => 'make',
|
18
|
+
'arg_prefix' => ''
|
19
|
+
},
|
20
|
+
'title' => 'Lesson X',
|
21
|
+
'description' => 'This is a placeholder description. You should provide your own',
|
22
|
+
'categories' => []
|
23
|
+
}
|
24
|
+
|
25
|
+
# Creates a new configuration from the file at the given path. Merges the
|
26
|
+
# configuration hash parsed from the file with {DEFAULTS}. Raises
|
27
|
+
# {ConfigError} if the file could not be read or parsed.
|
28
|
+
# @param [String] root path to lesson root
|
29
|
+
def initialize(root)
|
30
|
+
path = File.expand_path FILE, root
|
31
|
+
case
|
32
|
+
when (not File.exist? path)
|
33
|
+
ConfigError.new("We couldn't find a manifest file at #{path}")
|
34
|
+
when (not File.readable? path)
|
35
|
+
ConfigError.new("We found a manifest file at #{path}, but couldn't " +
|
36
|
+
"read it. Please ensure that the permissions are set correctly.")
|
37
|
+
else
|
38
|
+
config = ::JSON.parse(File.read path)
|
39
|
+
@config = DEFAULTS.deep_merge config
|
40
|
+
end
|
41
|
+
rescue ::JSON::JSONError => e
|
42
|
+
raise ConfigError.new e.message
|
43
|
+
end
|
44
|
+
|
45
|
+
# @return [Hash] a hash copy of the configuration options
|
46
|
+
def to_hash
|
47
|
+
@config.clone
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# ~*~ encoding: utf-8 ~*~
|
2
|
+
require 'aladdin/support/core_ext/hash'
|
3
|
+
|
4
|
+
module Aladdin
|
5
|
+
|
6
|
+
root = File.expand_path('../../..', __FILE__)
|
7
|
+
|
8
|
+
# Paths to other parts of the library.
|
9
|
+
PATHS = {
|
10
|
+
root: root,
|
11
|
+
assets: File.expand_path('assets', root),
|
12
|
+
skeleton: File.expand_path('skeleton', root)
|
13
|
+
}.to_struct.freeze
|
14
|
+
|
15
|
+
# Paths to different types of views.
|
16
|
+
VIEWS = {
|
17
|
+
haml: File.expand_path('views/haml', root),
|
18
|
+
scss: File.expand_path('views/scss', root),
|
19
|
+
default: File.expand_path('views', root)
|
20
|
+
}
|
21
|
+
|
22
|
+
# @todo TODO allow configuration?
|
23
|
+
require 'tmpdir'
|
24
|
+
DATA_DIR = Dir.tmpdir
|
25
|
+
|
26
|
+
# File extension for solution files.
|
27
|
+
SOLUTION_EXT = '.sol'
|
28
|
+
|
29
|
+
end
|
data/lib/aladdin/render/error.rb
CHANGED
@@ -4,16 +4,13 @@ module Aladdin
|
|
4
4
|
module Render
|
5
5
|
|
6
6
|
# The base exception for {Aladdin::Render} Errors
|
7
|
-
class Error < StandardError
|
8
|
-
end
|
7
|
+
class Error < StandardError; end
|
9
8
|
|
10
9
|
# This exception is raised if a parse error occurs.
|
11
|
-
class ParseError < Error
|
12
|
-
end
|
10
|
+
class ParseError < Error; end
|
13
11
|
|
14
12
|
# This exception is raised if a render error occurs.
|
15
|
-
class RenderError < Error
|
16
|
-
end
|
13
|
+
class RenderError < Error; end
|
17
14
|
|
18
15
|
end
|
19
16
|
|
@@ -1,17 +1,11 @@
|
|
1
|
+
# ~*~ encoding: utf-8 ~*~
|
1
2
|
require 'aladdin/render/sanitize'
|
2
3
|
require 'aladdin/render/error'
|
3
|
-
require 'aladdin/render/
|
4
|
-
require 'aladdin/render/image'
|
5
|
-
require 'aladdin/render/problem'
|
6
|
-
require 'aladdin/render/multi'
|
7
|
-
require 'aladdin/render/short'
|
8
|
-
require 'aladdin/render/table'
|
9
|
-
require 'aladdin/render/navigation'
|
4
|
+
require 'aladdin/render/templates'
|
10
5
|
|
11
|
-
# ~*~ encoding: utf-8 ~*~
|
12
6
|
module Aladdin
|
13
7
|
|
14
|
-
# aladdin-render module for all of
|
8
|
+
# aladdin-render module for all of Aladdin's rendering needs.
|
15
9
|
module Render
|
16
10
|
|
17
11
|
# HTML Renderer for Markdown.
|
@@ -23,7 +17,7 @@ module Aladdin
|
|
23
17
|
#
|
24
18
|
# @see http://github.github.com/github-flavored-markdown/
|
25
19
|
class HTML < ::Redcarpet::Render::HTML
|
26
|
-
include Aladdin::
|
20
|
+
include Aladdin::Support::Logger
|
27
21
|
|
28
22
|
@sanitize = Aladdin::Sanitize.new
|
29
23
|
@entities = HTMLEntities.new
|
@@ -40,7 +34,7 @@ module Aladdin
|
|
40
34
|
# Renderer configuration options.
|
41
35
|
CONFIGURATION = {
|
42
36
|
hard_wrap: true,
|
43
|
-
|
37
|
+
no_styles: true,
|
44
38
|
}
|
45
39
|
|
46
40
|
# Creates a new HTML renderer.
|
@@ -48,8 +42,9 @@ module Aladdin
|
|
48
42
|
def initialize(options = {})
|
49
43
|
super options.merge(CONFIGURATION)
|
50
44
|
exe_template = File.join(Aladdin::VIEWS[:haml], 'exe.haml')
|
51
|
-
@exe
|
52
|
-
@
|
45
|
+
@exe = Haml::Engine.new(File.read exe_template)
|
46
|
+
@nav, @headers = Navigation.new, Headers.new
|
47
|
+
@prob, @img = 0, 0 # indices for Problem #, Figure #
|
53
48
|
end
|
54
49
|
|
55
50
|
# Pygmentizes code blocks.
|
@@ -77,15 +72,10 @@ module Aladdin
|
|
77
72
|
p(text)
|
78
73
|
end
|
79
74
|
|
80
|
-
# Increases all header levels by one and keeps
|
81
|
-
# sections.
|
75
|
+
# Increases all header levels by one and keeps a navigation bar.
|
82
76
|
def header(text, level)
|
83
|
-
level += 1
|
84
|
-
|
85
|
-
if level == 2
|
86
|
-
index = @nav << text
|
87
|
-
html += "<a name='section_#{index}' data-magellan-destination='section_#{index}'/>"
|
88
|
-
end
|
77
|
+
html, name = h(text, level += 1)
|
78
|
+
@nav.append(text, name) if level == 2
|
89
79
|
html
|
90
80
|
end
|
91
81
|
|
@@ -120,14 +110,15 @@ module Aladdin
|
|
120
110
|
# Prepares a block image. Raises {RenderError} or {ParseError} if the
|
121
111
|
# given text does not contain a valid image block.
|
122
112
|
def block_image(text)
|
123
|
-
|
124
|
-
image.render(index: @img += 1)
|
113
|
+
Image.parse(text).render(index: @img += 1)
|
125
114
|
end
|
126
115
|
|
127
116
|
# Wraps the given text with header tags.
|
128
|
-
# @return [String]
|
117
|
+
# @return [String] rendered HTML
|
118
|
+
# @return [String] anchor name
|
129
119
|
def h(text, level)
|
130
|
-
|
120
|
+
header = @headers.add(text, level)
|
121
|
+
return header.render, header.name
|
131
122
|
end
|
132
123
|
|
133
124
|
# Wraps the given text with paragraph tags.
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# ~*~ encoding: utf-8 ~*~
|
2
|
+
require 'active_support/core_ext/string/inflections'
|
3
|
+
|
4
|
+
module Aladdin
|
5
|
+
|
6
|
+
module Render
|
7
|
+
|
8
|
+
# Keeps track of headers within the same document. It's responsible for
|
9
|
+
# assigning unique names that can be used in the anchors.
|
10
|
+
class Headers
|
11
|
+
|
12
|
+
def initialize
|
13
|
+
@headers = {}
|
14
|
+
end
|
15
|
+
|
16
|
+
# Adds a new header to the set.
|
17
|
+
# @return [Header] header
|
18
|
+
def add(text, level=1)
|
19
|
+
name = text.parameterize
|
20
|
+
if @headers.include? name
|
21
|
+
name += '-%d' % (@headers[name] += 1)
|
22
|
+
else @headers[name] = 0 end
|
23
|
+
Header.new(text, level, name)
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
# Renders a header (e.g. +h1+, +h2+, ...) with anchors.
|
29
|
+
class Header < Template
|
30
|
+
|
31
|
+
# Name of template file for rendering headers.
|
32
|
+
TEMPLATE = 'header.haml'
|
33
|
+
|
34
|
+
attr_reader :name
|
35
|
+
|
36
|
+
# Creates a new header.
|
37
|
+
# @param [String] text header text
|
38
|
+
# @param [Fixnum] level 1 to 6
|
39
|
+
# @param [String] name anchor name
|
40
|
+
def initialize(text, level, name)
|
41
|
+
@text, @level, @name = text, level, name
|
42
|
+
end
|
43
|
+
|
44
|
+
def render(locals={})
|
45
|
+
super locals.merge(text: @text, level: @level, name: @name)
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
File without changes
|
File without changes
|
@@ -11,15 +11,15 @@ module Aladdin
|
|
11
11
|
|
12
12
|
# Creates a new navigation bar.
|
13
13
|
def initialize
|
14
|
-
@sections =
|
14
|
+
@sections = {}
|
15
15
|
end
|
16
16
|
|
17
17
|
# Adds a new section.
|
18
18
|
# @param [String] heading section heading
|
19
|
-
# @
|
20
|
-
|
21
|
-
|
22
|
-
@sections
|
19
|
+
# @param [String] name anchor name
|
20
|
+
# @return [void]
|
21
|
+
def append(heading, name)
|
22
|
+
@sections[name] = heading
|
23
23
|
end
|
24
24
|
|
25
25
|
# Renders the navigation bar in HTML.
|
@@ -78,7 +78,7 @@ module Aladdin
|
|
78
78
|
# so that the author doesn't have to read the logs.
|
79
79
|
def save!
|
80
80
|
raise RenderError.new('Invalid problem.') unless valid?
|
81
|
-
solution = File.join(Aladdin::DATA_DIR, id + Aladdin::
|
81
|
+
solution = File.join(Aladdin::DATA_DIR, id + Aladdin::SOLUTION_EXT)
|
82
82
|
File.open(solution, 'wb+') { |file| Marshal.dump answer, file }
|
83
83
|
end
|
84
84
|
|
File without changes
|
File without changes
|
@@ -3,13 +3,14 @@ module Aladdin
|
|
3
3
|
|
4
4
|
module Render
|
5
5
|
|
6
|
-
# Child classes should provide a +TEMPLATE+
|
7
|
-
# the path to the HAML file.
|
6
|
+
# Base class for all templates. Child classes should provide a +TEMPLATE+
|
7
|
+
# string constant that contains the path to the relevant HAML file.
|
8
8
|
class Template
|
9
9
|
|
10
10
|
# Renders the given problem using {#view}.
|
11
11
|
# @todo TODO should probably show some error message in the preview,
|
12
12
|
# so that the author doesn't have to read the logs.
|
13
|
+
# @params [Hash] locals local variables to pass to the template
|
13
14
|
def render(locals={})
|
14
15
|
view.render Object.new, locals
|
15
16
|
end
|
@@ -17,7 +18,8 @@ module Aladdin
|
|
17
18
|
private
|
18
19
|
|
19
20
|
# Retrieves the +view+ singleton. If it is nil, initializes it from
|
20
|
-
# +self.class.TEMPLATE+.
|
21
|
+
# +self.class.TEMPLATE+. Note that this is reloaded with every refresh so
|
22
|
+
# I can edit the templates without refreshing.
|
21
23
|
# @return [Haml::Engine] haml engine
|
22
24
|
def view
|
23
25
|
return @view unless @view.nil?
|
data/lib/aladdin/submission.rb
CHANGED
@@ -10,8 +10,8 @@ module Aladdin
|
|
10
10
|
# it's unsuitable for production use. It does not impose any security
|
11
11
|
# restrictions at all.
|
12
12
|
class Submission
|
13
|
-
include
|
14
|
-
include
|
13
|
+
include Support::Logger
|
14
|
+
include Support::WeakComparator
|
15
15
|
|
16
16
|
SCRATCHSPACE = '.__ss'
|
17
17
|
|
@@ -39,7 +39,7 @@ module Aladdin
|
|
39
39
|
# @return [String] (json-encoded) true iff the submitted answer is correct.
|
40
40
|
def verify_quiz
|
41
41
|
id = @id.gsub File::SEPARATOR, '' # protect against directory attacks
|
42
|
-
solution = File.expand_path id + Aladdin::
|
42
|
+
solution = File.expand_path id + Aladdin::SOLUTION_EXT, Aladdin::DATA_DIR
|
43
43
|
File.open(solution, 'rb') { |f| same? @params['answer'], Marshal.restore(f) }.to_json
|
44
44
|
rescue => e
|
45
45
|
logger.warn e.message
|
@@ -0,0 +1,10 @@
|
|
1
|
+
# ~*~ encoding: utf-8 ~*~
|
2
|
+
require 'aladdin/support/core_ext'
|
3
|
+
require 'aladdin/support/logger'
|
4
|
+
require 'aladdin/support/weak_comparator'
|
5
|
+
|
6
|
+
module Aladdin
|
7
|
+
# aladdin-support is a collection of utility classes and modules for use in
|
8
|
+
# the Aladdin project.
|
9
|
+
module Support; end
|
10
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# ~*~ encoding: utf-8 ~*~
|
2
|
+
require 'active_support/core_ext/logger'
|
3
|
+
|
4
|
+
module Aladdin
|
5
|
+
|
6
|
+
module Support
|
7
|
+
|
8
|
+
# Provides a convenient global logger.
|
9
|
+
# @example
|
10
|
+
# class X
|
11
|
+
# include Logger
|
12
|
+
# def x; logger.info "hey"; end
|
13
|
+
# end
|
14
|
+
# @todo FIXME allow configuration
|
15
|
+
module Logger
|
16
|
+
|
17
|
+
# Global logger.
|
18
|
+
LOGGER = ::Logger.new(STDOUT)
|
19
|
+
|
20
|
+
# Retrieves the global logger.
|
21
|
+
def logger
|
22
|
+
Logger::LOGGER
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
@@ -1,9 +1,9 @@
|
|
1
1
|
# ~*~ encoding: utf-8 ~*~
|
2
2
|
module Aladdin
|
3
3
|
|
4
|
-
module
|
4
|
+
module Support
|
5
5
|
|
6
|
-
# Provides a
|
6
|
+
# Provides a rich comparison with weak-typing.
|
7
7
|
# @see #same?
|
8
8
|
module WeakComparator
|
9
9
|
|
@@ -21,7 +21,7 @@ module Aladdin
|
|
21
21
|
# === Numerics
|
22
22
|
# If +saved+ is a numeric, then it will accept any +submitted+ value that
|
23
23
|
# is numerically equivalent to +saved+. For example, if +saved+ is 0,
|
24
|
-
# then +'0.0'+ and +'0'+ will
|
24
|
+
# then both +'0.0'+ and +'0'+ will be accepted.
|
25
25
|
#
|
26
26
|
# @param [String, Hash] submitted
|
27
27
|
# @param [String, Numeric, Boolean, Hash] saved
|
@@ -40,9 +40,9 @@ module Aladdin
|
|
40
40
|
|
41
41
|
private
|
42
42
|
|
43
|
-
# Compares two
|
44
|
-
# +submitted+ and +saved+ have the same number of
|
45
|
-
# compares
|
43
|
+
# Compares two hashes and returns a simple diff. It checks that both
|
44
|
+
# +submitted+ and +saved+ have the same number of keys, and then
|
45
|
+
# compares all key-value pairs in order.
|
46
46
|
#
|
47
47
|
# @param [Hash] submitted
|
48
48
|
# @param [Hash] saved
|
@@ -53,6 +53,8 @@ module Aladdin
|
|
53
53
|
Hash[saved.map { |key, value| [key, same?(submitted[key], value)] }]
|
54
54
|
end
|
55
55
|
|
56
|
+
extend self
|
57
|
+
|
56
58
|
end
|
57
59
|
|
58
60
|
end
|
data/lib/aladdin/version.rb
CHANGED
data/skeleton/gitignore
ADDED
data/views/haml/layout.haml
CHANGED
@@ -13,6 +13,10 @@
|
|
13
13
|
|
14
14
|
%title= title
|
15
15
|
%link{rel: 'stylesheet', href:'stylesheets/app.css'}
|
16
|
+
%link{rel: 'stylesheet', href:'stylesheets/general_foundicons.css'}
|
17
|
+
/[if lt IE 8]
|
18
|
+
%link{rel: 'stylesheet', href:'stylesheets/general_foundicons_ie7.css'}
|
19
|
+
|
16
20
|
%script{src: 'javascripts/foundation/modernizr.foundation.js'}
|
17
21
|
|
18
22
|
%body
|
data/views/haml/nav.haml
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
-# coding: UTF-8
|
2
2
|
%dl#sections.sub-nav{'data-magellan-expedition' => 'fixed'}
|
3
|
-
-sections.
|
4
|
-
%dd{'data-magellan-arrival' =>
|
5
|
-
%a{href:
|
3
|
+
-sections.each do |name, heading|
|
4
|
+
%dd{'data-magellan-arrival' => name}
|
5
|
+
%a{href: '#' + name}= heading
|
data/views/scss/_settings.scss
CHANGED
@@ -239,4 +239,33 @@
|
|
239
239
|
// $base-size: $baseFontSize $importantModNum;
|
240
240
|
// Produced the following list of values: 14, 17, 23, 27, 37, 44, 59, 71, 95, 115;
|
241
241
|
// http://www.modularscale.com by Tim Brown
|
242
|
-
// https://github.com/scottkellum/modular-scale by scottkellum
|
242
|
+
// https://github.com/scottkellum/modular-scale by scottkellum
|
243
|
+
|
244
|
+
$fontFileName: "/fonts/general_foundicons";
|
245
|
+
$fontName: "GeneralFoundicons";
|
246
|
+
$classPrefix: "foundicon-";
|
247
|
+
|
248
|
+
@mixin i-class($name,$pua) {
|
249
|
+
.#{$classPrefix}#{$name}:before {
|
250
|
+
content: "\f#{$pua}";
|
251
|
+
}
|
252
|
+
}
|
253
|
+
|
254
|
+
@mixin ie-class($name,$pua) {
|
255
|
+
.#{$classPrefix}#{$name} {
|
256
|
+
*zoom: expression( this.runtimeStyle['zoom'] = "1", this.innerHTML = "#{$pua};");
|
257
|
+
}
|
258
|
+
}
|
259
|
+
|
260
|
+
@mixin face {
|
261
|
+
@font-face {
|
262
|
+
font-family: $fontName;
|
263
|
+
src: url('#{$fontFileName}.eot');
|
264
|
+
src: url('#{$fontFileName}.eot?#iefix') format('embedded-opentype'),
|
265
|
+
url('#{$fontFileName}.woff') format('woff'),
|
266
|
+
url('#{$fontFileName}.ttf') format('truetype'),
|
267
|
+
url('#{$fontFileName}.svg##{$fontName}') format('svg');
|
268
|
+
font-weight: normal;
|
269
|
+
font-style: normal;
|
270
|
+
}
|
271
|
+
}
|
data/views/scss/app.scss
CHANGED
@@ -44,11 +44,32 @@ a.hero img {
|
|
44
44
|
}
|
45
45
|
|
46
46
|
/* Styling within lesson */
|
47
|
+
section[role='lesson'] {
|
47
48
|
|
48
|
-
|
49
|
-
|
50
|
-
}
|
49
|
+
.block-image {
|
50
|
+
text-align: center;
|
51
|
+
}
|
52
|
+
|
53
|
+
ul {
|
54
|
+
margin-left: 17px;
|
55
|
+
}
|
56
|
+
|
57
|
+
#{nest(headings(), 'a.anchor')} {
|
58
|
+
position: absolute;
|
59
|
+
padding-left: 60px;
|
60
|
+
margin-left: -60px;
|
61
|
+
display: block;
|
62
|
+
}
|
63
|
+
|
64
|
+
#{nest(headings(), 'a.anchor i')} {
|
65
|
+
display: none;
|
66
|
+
width: 16px;
|
67
|
+
font-size: 16px;
|
68
|
+
}
|
69
|
+
|
70
|
+
#{nest(append-selector(headings(), ':hover'), 'a.anchor i')} {
|
71
|
+
display: inline-block;
|
72
|
+
margin-left: -1.5em;
|
73
|
+
}
|
51
74
|
|
52
|
-
section[role='lesson'] ul {
|
53
|
-
margin-left: 17px;
|
54
75
|
}
|
@@ -0,0 +1,71 @@
|
|
1
|
+
@import "settings";
|
2
|
+
|
3
|
+
/* font-face */
|
4
|
+
@include face;
|
5
|
+
|
6
|
+
/* global foundicon styles */
|
7
|
+
[class*="#{$classPrefix}"] {
|
8
|
+
display: inline;
|
9
|
+
width: auto;
|
10
|
+
height: auto;
|
11
|
+
line-height: inherit;
|
12
|
+
vertical-align: baseline;
|
13
|
+
background-image: none;
|
14
|
+
background-position: 0 0;
|
15
|
+
background-repeat: repeat;
|
16
|
+
}
|
17
|
+
[class*="#{$classPrefix}"]:before {
|
18
|
+
font-family: $fontName;
|
19
|
+
font-weight: normal;
|
20
|
+
font-style: normal;
|
21
|
+
text-decoration: inherit;
|
22
|
+
}
|
23
|
+
|
24
|
+
/* icons */
|
25
|
+
@include i-class(settings,"000");
|
26
|
+
@include i-class(heart,"001");
|
27
|
+
@include i-class(star,"002");
|
28
|
+
@include i-class(plus,"003");
|
29
|
+
@include i-class(minus,"004");
|
30
|
+
@include i-class(checkmark,"005");
|
31
|
+
@include i-class(remove,"006");
|
32
|
+
@include i-class(mail,"007");
|
33
|
+
@include i-class(calendar,"008");
|
34
|
+
@include i-class(page,"009");
|
35
|
+
@include i-class(tools,"00a");
|
36
|
+
@include i-class(globe,"00b");
|
37
|
+
@include i-class(home,"00c");
|
38
|
+
@include i-class(quote,"00d");
|
39
|
+
@include i-class(people,"00e");
|
40
|
+
@include i-class(monitor,"00f");
|
41
|
+
@include i-class(laptop,"010");
|
42
|
+
@include i-class(phone,"011");
|
43
|
+
@include i-class(cloud,"012");
|
44
|
+
@include i-class(error,"013");
|
45
|
+
@include i-class(right-arrow,"014");
|
46
|
+
@include i-class(left-arrow,"015");
|
47
|
+
@include i-class(up-arrow,"016");
|
48
|
+
@include i-class(down-arrow,"017");
|
49
|
+
@include i-class(trash,"018");
|
50
|
+
@include i-class(add-doc,"019");
|
51
|
+
@include i-class(edit,"01a");
|
52
|
+
@include i-class(lock,"01b");
|
53
|
+
@include i-class(unlock,"01c");
|
54
|
+
@include i-class(refresh,"01d");
|
55
|
+
@include i-class(paper-clip,"01e");
|
56
|
+
@include i-class(video,"01f");
|
57
|
+
@include i-class(photo,"020");
|
58
|
+
@include i-class(graph,"021");
|
59
|
+
@include i-class(idea,"022");
|
60
|
+
@include i-class(mic,"023");
|
61
|
+
@include i-class(cart,"024");
|
62
|
+
@include i-class(address-book,"025");
|
63
|
+
@include i-class(compass,"026");
|
64
|
+
@include i-class(flag,"027");
|
65
|
+
@include i-class(location,"028");
|
66
|
+
@include i-class(clock,"029");
|
67
|
+
@include i-class(folder,"02a");
|
68
|
+
@include i-class(inbox,"02b");
|
69
|
+
@include i-class(website,"02c");
|
70
|
+
@include i-class(smiley,"02d");
|
71
|
+
@include i-class(search,"02e");
|
@@ -0,0 +1,56 @@
|
|
1
|
+
@import "settings";
|
2
|
+
|
3
|
+
/* general icons for IE7 */
|
4
|
+
[class*="#{$classPrefix}"] {
|
5
|
+
font-family: $fontName;
|
6
|
+
font-weight: normal;
|
7
|
+
font-style: normal;
|
8
|
+
}
|
9
|
+
|
10
|
+
@include ie-class(settings,"000");
|
11
|
+
@include ie-class(heart,"001");
|
12
|
+
@include ie-class(star,"002");
|
13
|
+
@include ie-class(plus,"003");
|
14
|
+
@include ie-class(minus,"004");
|
15
|
+
@include ie-class(checkmark,"005");
|
16
|
+
@include ie-class(remove,"006");
|
17
|
+
@include ie-class(mail,"007");
|
18
|
+
@include ie-class(calendar,"008");
|
19
|
+
@include ie-class(page,"009");
|
20
|
+
@include ie-class(tools,"00a");
|
21
|
+
@include ie-class(globe,"00b");
|
22
|
+
@include ie-class(home,"00c");
|
23
|
+
@include ie-class(quote,"00d");
|
24
|
+
@include ie-class(people,"00e");
|
25
|
+
@include ie-class(monitor,"00f");
|
26
|
+
@include ie-class(laptop,"010");
|
27
|
+
@include ie-class(phone,"011");
|
28
|
+
@include ie-class(cloud,"012");
|
29
|
+
@include ie-class(error,"013");
|
30
|
+
@include ie-class(right-arrow,"014");
|
31
|
+
@include ie-class(left-arrow,"015");
|
32
|
+
@include ie-class(up-arrow,"016");
|
33
|
+
@include ie-class(down-arrow,"017");
|
34
|
+
@include ie-class(trash,"018");
|
35
|
+
@include ie-class(add-doc,"019");
|
36
|
+
@include ie-class(edit,"01a");
|
37
|
+
@include ie-class(lock,"01b");
|
38
|
+
@include ie-class(unlock,"01c");
|
39
|
+
@include ie-class(refresh,"01d");
|
40
|
+
@include ie-class(paper-clip,"01e");
|
41
|
+
@include ie-class(video,"01f");
|
42
|
+
@include ie-class(photo,"020");
|
43
|
+
@include ie-class(graph,"021");
|
44
|
+
@include ie-class(idea,"022");
|
45
|
+
@include ie-class(mic,"023");
|
46
|
+
@include ie-class(cart,"024");
|
47
|
+
@include ie-class(address-book,"025");
|
48
|
+
@include ie-class(compass,"026");
|
49
|
+
@include ie-class(flag,"027");
|
50
|
+
@include ie-class(location,"028");
|
51
|
+
@include ie-class(clock,"029");
|
52
|
+
@include ie-class(folder,"02a");
|
53
|
+
@include ie-class(inbox,"02b");
|
54
|
+
@include ie-class(website,"02c");
|
55
|
+
@include ie-class(smiley,"02d");
|
56
|
+
@include ie-class(search,"02e");
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: aladdin
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-12-
|
12
|
+
date: 2012-12-26 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: sinatra
|
@@ -155,6 +155,22 @@ dependencies:
|
|
155
155
|
- - ! '>='
|
156
156
|
- !ruby/object:Gem::Version
|
157
157
|
version: '0'
|
158
|
+
- !ruby/object:Gem::Dependency
|
159
|
+
name: activesupport
|
160
|
+
requirement: !ruby/object:Gem::Requirement
|
161
|
+
none: false
|
162
|
+
requirements:
|
163
|
+
- - ~>
|
164
|
+
- !ruby/object:Gem::Version
|
165
|
+
version: 3.2.9
|
166
|
+
type: :runtime
|
167
|
+
prerelease: false
|
168
|
+
version_requirements: !ruby/object:Gem::Requirement
|
169
|
+
none: false
|
170
|
+
requirements:
|
171
|
+
- - ~>
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: 3.2.9
|
158
174
|
- !ruby/object:Gem::Dependency
|
159
175
|
name: yard
|
160
176
|
requirement: !ruby/object:Gem::Requirement
|
@@ -246,25 +262,37 @@ files:
|
|
246
262
|
- LICENSE
|
247
263
|
- README.md
|
248
264
|
- lib/aladdin/app.rb
|
249
|
-
- lib/aladdin/cli.rb
|
250
265
|
- lib/aladdin/commands/new.rb
|
251
266
|
- lib/aladdin/commands/server.rb
|
252
|
-
- lib/aladdin/
|
253
|
-
- lib/aladdin/
|
267
|
+
- lib/aladdin/commands.rb
|
268
|
+
- lib/aladdin/config.rb
|
269
|
+
- lib/aladdin/constants.rb
|
254
270
|
- lib/aladdin/render/error.rb
|
255
|
-
- lib/aladdin/render/image.rb
|
256
271
|
- lib/aladdin/render/markdown.rb
|
257
|
-
- lib/aladdin/render/multi.rb
|
258
|
-
- lib/aladdin/render/navigation.rb
|
259
|
-
- lib/aladdin/render/problem.rb
|
260
272
|
- lib/aladdin/render/sanitize.rb
|
261
|
-
- lib/aladdin/render/
|
262
|
-
- lib/aladdin/render/
|
263
|
-
- lib/aladdin/render/
|
273
|
+
- lib/aladdin/render/templates/header.rb
|
274
|
+
- lib/aladdin/render/templates/image.rb
|
275
|
+
- lib/aladdin/render/templates/multi.rb
|
276
|
+
- lib/aladdin/render/templates/navigation.rb
|
277
|
+
- lib/aladdin/render/templates/problem.rb
|
278
|
+
- lib/aladdin/render/templates/short.rb
|
279
|
+
- lib/aladdin/render/templates/table.rb
|
280
|
+
- lib/aladdin/render/templates/template.rb
|
281
|
+
- lib/aladdin/render/templates.rb
|
282
|
+
- lib/aladdin/render.rb
|
264
283
|
- lib/aladdin/submission.rb
|
284
|
+
- lib/aladdin/support/core_ext/hash.rb
|
285
|
+
- lib/aladdin/support/core_ext.rb
|
286
|
+
- lib/aladdin/support/logger.rb
|
287
|
+
- lib/aladdin/support/weak_comparator.rb
|
288
|
+
- lib/aladdin/support.rb
|
265
289
|
- lib/aladdin/version.rb
|
266
290
|
- lib/aladdin.rb
|
267
291
|
- assets/favicon.ico
|
292
|
+
- assets/fonts/general_foundicons.eot
|
293
|
+
- assets/fonts/general_foundicons.svg
|
294
|
+
- assets/fonts/general_foundicons.ttf
|
295
|
+
- assets/fonts/general_foundicons.woff
|
268
296
|
- assets/images/graphic.png
|
269
297
|
- assets/images/no_gravatar.gif
|
270
298
|
- assets/javascripts/app.js
|
@@ -291,6 +319,7 @@ files:
|
|
291
319
|
- assets/javascripts/foundation/jquery.placeholder.js
|
292
320
|
- assets/javascripts/foundation/modernizr.foundation.js
|
293
321
|
- views/haml/exe.haml
|
322
|
+
- views/haml/header.haml
|
294
323
|
- views/haml/img.haml
|
295
324
|
- views/haml/layout.haml
|
296
325
|
- views/haml/multi.haml
|
@@ -303,9 +332,13 @@ files:
|
|
303
332
|
- views/scss/_pygment.scss
|
304
333
|
- views/scss/_settings.scss
|
305
334
|
- views/scss/app.scss
|
335
|
+
- views/scss/general_foundicons.scss
|
336
|
+
- views/scss/general_foundicons_ie7.scss
|
306
337
|
- bin/aladdin
|
338
|
+
- skeleton/gitignore
|
307
339
|
- skeleton/images/graphic.png
|
308
340
|
- skeleton/index.md
|
341
|
+
- skeleton/manifest.json
|
309
342
|
homepage: https://github.com/jimjh/aladdin
|
310
343
|
licenses:
|
311
344
|
- MIT
|
data/lib/aladdin/cli.rb
DELETED
@@ -1,29 +0,0 @@
|
|
1
|
-
# ~*~ encoding: utf-8 ~*~
|
2
|
-
|
3
|
-
Signal.trap('INT') { puts; exit(1) }
|
4
|
-
|
5
|
-
case ARGV.first
|
6
|
-
when '--version', '-v'
|
7
|
-
puts "Aladdin #{Aladdin::VERSION}"
|
8
|
-
exit(0)
|
9
|
-
when 'new'
|
10
|
-
ARGV.shift
|
11
|
-
require_relative 'commands/new'
|
12
|
-
when 'server'
|
13
|
-
ARGV.shift
|
14
|
-
require_relative 'commands/server'
|
15
|
-
else
|
16
|
-
puts <<-eos
|
17
|
-
Usage:
|
18
|
-
aladdin COMMAND [options]
|
19
|
-
|
20
|
-
Commands:
|
21
|
-
new # generates the skeleton for a new lesson
|
22
|
-
server # launches a preview server
|
23
|
-
|
24
|
-
Aladdin Options:
|
25
|
-
-v, [--version] # show version number and quit
|
26
|
-
-h, [--help] # show this help message and quit
|
27
|
-
eos
|
28
|
-
exit ['-h', '--help'].include?(ARGV.first) ? 0 : 1
|
29
|
-
end
|
data/lib/aladdin/mixin/logger.rb
DELETED
@@ -1,26 +0,0 @@
|
|
1
|
-
# ~*~ encoding: utf-8 ~*~
|
2
|
-
require 'logger'
|
3
|
-
|
4
|
-
module Aladdin
|
5
|
-
|
6
|
-
# aladdin-mixin module contains all other mixin modules.
|
7
|
-
module Mixin
|
8
|
-
|
9
|
-
# @example
|
10
|
-
# require 'logger'
|
11
|
-
# logger.info "hey"
|
12
|
-
module Logger
|
13
|
-
|
14
|
-
# Global Logger.
|
15
|
-
LOGGER = ::Logger.new STDOUT
|
16
|
-
|
17
|
-
# Retrieves the global logger.
|
18
|
-
def logger
|
19
|
-
Logger::LOGGER
|
20
|
-
end
|
21
|
-
|
22
|
-
end
|
23
|
-
|
24
|
-
end
|
25
|
-
|
26
|
-
end
|