aladdin 0.0.4 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
         |