jekyll-pseudocode 0.1.3
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.
- checksums.yaml +7 -0
 - data/.gitignore +6 -0
 - data/.ruby-version +1 -0
 - data/Gemfile +4 -0
 - data/LICENSE +21 -0
 - data/README.md +42 -0
 - data/Rakefile +1 -0
 - data/doc/screenshot.png +0 -0
 - data/jekyll-pseudocode.gemspec +21 -0
 - data/lib/jekyll-pseudocode.css +23 -0
 - data/lib/jekyll-pseudocode.rb +23 -0
 - data/lib/jekyll-pseudocode/brush.rb +40 -0
 - data/lib/jekyll-pseudocode/grammar.rb +68 -0
 - data/lib/jekyll-pseudocode/html_brush.rb +57 -0
 - data/lib/jekyll-pseudocode/mock_brush.rb +43 -0
 - data/lib/jekyll-pseudocode/version.rb +5 -0
 - data/spec/grammar_spec.rb +51 -0
 - data/spec/html_spec.rb +35 -0
 - metadata +78 -0
 
    
        checksums.yaml
    ADDED
    
    | 
         @@ -0,0 +1,7 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            ---
         
     | 
| 
      
 2 
     | 
    
         
            +
            SHA1:
         
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: a51b68d46cbd01b77363100383fef7df319bd65c
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 0d9a29b14040cb8bc6777b4f0b5abe04839c7b7d
         
     | 
| 
      
 5 
     | 
    
         
            +
            SHA512:
         
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 04e6f11f961ba2f3552d6ad83bd606c114e3eca1cb38a6f3538ab9ffd91884da6302cbcf0dbf4528dfc8b03aa1007b0faa6df7f04786c3843f8cb68966cccd30
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 490b282dea171022a112c850253e8aed6d5a3d3eda36a7060f6e30a433597a5330fcc28d6c924cf0fd9e05be4d42fb862042af75c46abcc43b797e417b195335
         
     | 
    
        data/.gitignore
    ADDED
    
    
    
        data/.ruby-version
    ADDED
    
    | 
         @@ -0,0 +1 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            ruby-head
         
     | 
    
        data/Gemfile
    ADDED
    
    
    
        data/LICENSE
    ADDED
    
    | 
         @@ -0,0 +1,21 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            MIT License
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            Copyright (c) 2017 Victor Eduardo Bazterra
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            Permission is hereby granted, free of charge, to any person obtaining a copy
         
     | 
| 
      
 6 
     | 
    
         
            +
            of this software and associated documentation files (the "Software"), to deal
         
     | 
| 
      
 7 
     | 
    
         
            +
            in the Software without restriction, including without limitation the rights
         
     | 
| 
      
 8 
     | 
    
         
            +
            to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
         
     | 
| 
      
 9 
     | 
    
         
            +
            copies of the Software, and to permit persons to whom the Software is
         
     | 
| 
      
 10 
     | 
    
         
            +
            furnished to do so, subject to the following conditions:
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
            The above copyright notice and this permission notice shall be included in all
         
     | 
| 
      
 13 
     | 
    
         
            +
            copies or substantial portions of the Software.
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
            THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
         
     | 
| 
      
 16 
     | 
    
         
            +
            IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
         
     | 
| 
      
 17 
     | 
    
         
            +
            FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
         
     | 
| 
      
 18 
     | 
    
         
            +
            AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
         
     | 
| 
      
 19 
     | 
    
         
            +
            LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
         
     | 
| 
      
 20 
     | 
    
         
            +
            OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
         
     | 
| 
      
 21 
     | 
    
         
            +
            SOFTWARE.
         
     | 
    
        data/README.md
    ADDED
    
    | 
         @@ -0,0 +1,42 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # jekyll-pseudocode
         
     | 
| 
      
 2 
     | 
    
         
            +
            A pseudocode/algorithm formatter for sites powered by jekyll. This is a fork from wkm/jekyll-pseudo.
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            Sometimes you don't want to use a particular programming language to
         
     | 
| 
      
 5 
     | 
    
         
            +
            demonstrate a concept because of the syntactic overhead. jekyll-pseudocode lets
         
     | 
| 
      
 6 
     | 
    
         
            +
            you use a gently styled free-formated representation.
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
            ## Language
         
     | 
| 
      
 9 
     | 
    
         
            +
            * indentation is preserved
         
     | 
| 
      
 10 
     | 
    
         
            +
            * a word beginning with a capital letter is a keyword
         
     | 
| 
      
 11 
     | 
    
         
            +
            * a word followed by parentheses is a function name
         
     | 
| 
      
 12 
     | 
    
         
            +
            * all other words are variables
         
     | 
| 
      
 13 
     | 
    
         
            +
            * words within double quotes are generally strings
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
            * these symbols are auto-formatted: `<-- <= >= --> =`
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
            Sample output:
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
                {% pseudo %}
         
     | 
| 
      
 21 
     | 
    
         
            +
                Function swap(old, new)
         
     | 
| 
      
 22 
     | 
    
         
            +
                  remaining <- quorumSize
         
     | 
| 
      
 23 
     | 
    
         
            +
                  success <- False
         
     | 
| 
      
 24 
     | 
    
         
            +
                  For Each host
         
     | 
| 
      
 25 
     | 
    
         
            +
                    result[host] <- send(host, propose(old, new))
         
     | 
| 
      
 26 
     | 
    
         
            +
                    If result[host] = "ok"
         
     | 
| 
      
 27 
     | 
    
         
            +
                      remaining--
         
     | 
| 
      
 28 
     | 
    
         
            +
                  If remaining > 1+quorumSize/2
         
     | 
| 
      
 29 
     | 
    
         
            +
                    success <- True
         
     | 
| 
      
 30 
     | 
    
         
            +
                  For Each result
         
     | 
| 
      
 31 
     | 
    
         
            +
                    If success
         
     | 
| 
      
 32 
     | 
    
         
            +
                      send(host, confirm(old, new))
         
     | 
| 
      
 33 
     | 
    
         
            +
                    Else
         
     | 
| 
      
 34 
     | 
    
         
            +
                      send(host, cancel(old, new))
         
     | 
| 
      
 35 
     | 
    
         
            +
                {% endpseudo %}
         
     | 
| 
      
 36 
     | 
    
         
            +
             
     | 
| 
      
 37 
     | 
    
         
            +
            ## Output
         
     | 
| 
      
 38 
     | 
    
         
            +
            Output is annotated with `<span>` classes and can be styled using CSS. Typically keywords are made bold and variables are italicized.
         
     | 
| 
      
 39 
     | 
    
         
            +
             
     | 
| 
      
 40 
     | 
    
         
            +
            Using the style provided in `lib/jekyll-pseudocode.css` previous markdown should be rendered as:
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
            
         
     | 
    
        data/Rakefile
    ADDED
    
    | 
         @@ -0,0 +1 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require "bundler/gem_tasks"
         
     | 
    
        data/doc/screenshot.png
    ADDED
    
    | 
         Binary file 
     | 
| 
         @@ -0,0 +1,21 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # -*- encoding: utf-8 -*-
         
     | 
| 
      
 2 
     | 
    
         
            +
            $:.push File.expand_path("../lib", __FILE__)
         
     | 
| 
      
 3 
     | 
    
         
            +
            require "jekyll-pseudocode/version"
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            Gem::Specification.new do |s|
         
     | 
| 
      
 6 
     | 
    
         
            +
              s.name        = "jekyll-pseudocode"
         
     | 
| 
      
 7 
     | 
    
         
            +
              s.version     = Jekyll::PseudoCode::VERSION
         
     | 
| 
      
 8 
     | 
    
         
            +
              s.authors     = ["Victor Bazterra"," Wiktor Macura"]
         
     | 
| 
      
 9 
     | 
    
         
            +
              s.email       = ["bazterra@gmail.com", "wmacura@gmail.com"]
         
     | 
| 
      
 10 
     | 
    
         
            +
              s.homepage    = "http://github.com/baites/jekyll-pseudocode"
         
     | 
| 
      
 11 
     | 
    
         
            +
              s.summary     = %q{A trivial jekyll plugin for pseudocode fork from jekyll-pseudo}
         
     | 
| 
      
 12 
     | 
    
         
            +
              s.description = %q{jekyll-pseudocode helps typeset pseudocode with minimal formatting}
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
              s.files         = `git ls-files`.split("\n")
         
     | 
| 
      
 15 
     | 
    
         
            +
              s.test_files    = `git ls-files -- {test,spec,features}/*`.split("\n")
         
     | 
| 
      
 16 
     | 
    
         
            +
              s.executables   = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
         
     | 
| 
      
 17 
     | 
    
         
            +
              s.require_paths = ["lib"]
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
              # specify any dependencies here; for example:
         
     | 
| 
      
 20 
     | 
    
         
            +
              s.add_runtime_dependency "jekyll"
         
     | 
| 
      
 21 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,23 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            ---
         
     | 
| 
      
 2 
     | 
    
         
            +
            ---
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            @import "{{ site.theme }}";
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            .pseudocode {
         
     | 
| 
      
 7 
     | 
    
         
            +
              text-indent: 50px;
         
     | 
| 
      
 8 
     | 
    
         
            +
              font-family: "Courier New", Courier, monospace;
         
     | 
| 
      
 9 
     | 
    
         
            +
              white-space: pre-wrap;
         
     | 
| 
      
 10 
     | 
    
         
            +
            }
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
            .symbol {
         
     | 
| 
      
 13 
     | 
    
         
            +
              font-weight: bold;
         
     | 
| 
      
 14 
     | 
    
         
            +
              text-transform: lowercase;
         
     | 
| 
      
 15 
     | 
    
         
            +
            }
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
            .function {
         
     | 
| 
      
 18 
     | 
    
         
            +
              text-transform: uppercase;
         
     | 
| 
      
 19 
     | 
    
         
            +
            }
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
            .variable {
         
     | 
| 
      
 22 
     | 
    
         
            +
              font-style: italic;
         
     | 
| 
      
 23 
     | 
    
         
            +
            }
         
     | 
| 
         @@ -0,0 +1,23 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'liquid'
         
     | 
| 
      
 2 
     | 
    
         
            +
            require 'jekyll-pseudocode/version'
         
     | 
| 
      
 3 
     | 
    
         
            +
            require 'jekyll-pseudocode/grammar'
         
     | 
| 
      
 4 
     | 
    
         
            +
            require 'jekyll-pseudocode/html_brush'
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            module Jekyll
         
     | 
| 
      
 7 
     | 
    
         
            +
              class PseudoCodeBlock < Liquid::Block
         
     | 
| 
      
 8 
     | 
    
         
            +
                def initialize(tag_name, text, tokens)
         
     | 
| 
      
 9 
     | 
    
         
            +
                  super
         
     | 
| 
      
 10 
     | 
    
         
            +
                  @brush = PseudoCode::HtmlBrush.new
         
     | 
| 
      
 11 
     | 
    
         
            +
                  @grammar = PseudoCode::Grammar.new
         
     | 
| 
      
 12 
     | 
    
         
            +
                end
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
                def render(context)
         
     | 
| 
      
 15 
     | 
    
         
            +
                  @text = super
         
     | 
| 
      
 16 
     | 
    
         
            +
                  @formatted = @grammar.format(@text, @brush)
         
     | 
| 
      
 17 
     | 
    
         
            +
                  "<div class='pseudocode'>#{@formatted}</div>"
         
     | 
| 
      
 18 
     | 
    
         
            +
                end
         
     | 
| 
      
 19 
     | 
    
         
            +
              end
         
     | 
| 
      
 20 
     | 
    
         
            +
            end
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
            Liquid::Template.register_tag('pseudocode', Jekyll::PseudoCodeBlock)
         
     | 
| 
         @@ -0,0 +1,40 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module Jekyll
         
     | 
| 
      
 2 
     | 
    
         
            +
              module PseudoCode
         
     | 
| 
      
 3 
     | 
    
         
            +
                class Brush
         
     | 
| 
      
 4 
     | 
    
         
            +
                  # format a symbol
         
     | 
| 
      
 5 
     | 
    
         
            +
                  def sym(txt)
         
     | 
| 
      
 6 
     | 
    
         
            +
                    raise 'not implemented'
         
     | 
| 
      
 7 
     | 
    
         
            +
                  end
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
                  # format a function
         
     | 
| 
      
 10 
     | 
    
         
            +
                  def fn(txt)
         
     | 
| 
      
 11 
     | 
    
         
            +
                    raise 'not implemented'
         
     | 
| 
      
 12 
     | 
    
         
            +
                  end
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
                  # format a variable
         
     | 
| 
      
 15 
     | 
    
         
            +
                  def var(txt, sub)
         
     | 
| 
      
 16 
     | 
    
         
            +
                    raise 'not implemented'
         
     | 
| 
      
 17 
     | 
    
         
            +
                  end
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
                  # format a comment
         
     | 
| 
      
 20 
     | 
    
         
            +
                  def comment(txt)
         
     | 
| 
      
 21 
     | 
    
         
            +
                    raise 'not implemented'
         
     | 
| 
      
 22 
     | 
    
         
            +
                  end
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
                  # format an operator
         
     | 
| 
      
 25 
     | 
    
         
            +
                  def op(txt)
         
     | 
| 
      
 26 
     | 
    
         
            +
                    raise 'not implemented'
         
     | 
| 
      
 27 
     | 
    
         
            +
                  end
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
                  # format a string
         
     | 
| 
      
 30 
     | 
    
         
            +
                  def string(txt)
         
     | 
| 
      
 31 
     | 
    
         
            +
                    raise 'not implemented'
         
     | 
| 
      
 32 
     | 
    
         
            +
                  end
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
      
 34 
     | 
    
         
            +
                  # render plain text
         
     | 
| 
      
 35 
     | 
    
         
            +
                  def plain(txt)
         
     | 
| 
      
 36 
     | 
    
         
            +
                    raise 'not implemented'
         
     | 
| 
      
 37 
     | 
    
         
            +
                  end
         
     | 
| 
      
 38 
     | 
    
         
            +
                end
         
     | 
| 
      
 39 
     | 
    
         
            +
              end
         
     | 
| 
      
 40 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,68 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module Jekyll
         
     | 
| 
      
 2 
     | 
    
         
            +
              module PseudoCode
         
     | 
| 
      
 3 
     | 
    
         
            +
                class Grammar
         
     | 
| 
      
 4 
     | 
    
         
            +
                  # parse a block of text, using the given brush to format output (works in a single pass)
         
     | 
| 
      
 5 
     | 
    
         
            +
                  def format(txt, brush)
         
     | 
| 
      
 6 
     | 
    
         
            +
                    results = []
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
                    mappings = [
         
     | 
| 
      
 9 
     | 
    
         
            +
                      [/\#(.*$)/, :comment],
         
     | 
| 
      
 10 
     | 
    
         
            +
                      [/\b([A-Z]\w+)/, :sym],
         
     | 
| 
      
 11 
     | 
    
         
            +
                      [/(\w+)(?=[(])/, :fn],
         
     | 
| 
      
 12 
     | 
    
         
            +
                      [/(\".*?\")/, :string],
         
     | 
| 
      
 13 
     | 
    
         
            +
                      [/(<-|->|\+\+|<=|>=|--)/, :op],  # try these operators first
         
     | 
| 
      
 14 
     | 
    
         
            +
                      [/([-()\[\]{}=<>+*])/, :op],     # and these second
         
     | 
| 
      
 15 
     | 
    
         
            +
                      [/\b([a-z][a-zA-Z0-9]*)(_[a-zA-Z0-9]+)?/, :var],
         
     | 
| 
      
 16 
     | 
    
         
            +
                      [/^(\s+)/, :indent]
         
     | 
| 
      
 17 
     | 
    
         
            +
                    ]
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
                    # replace tabs with three spaces
         
     | 
| 
      
 20 
     | 
    
         
            +
                    txt.gsub! /^\t/, '   '
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
                    # count leading whitespace
         
     | 
| 
      
 23 
     | 
    
         
            +
                    ws = txt.scan(/^ */).map do |leading|
         
     | 
| 
      
 24 
     | 
    
         
            +
                      leading.size
         
     | 
| 
      
 25 
     | 
    
         
            +
                    end
         
     | 
| 
      
 26 
     | 
    
         
            +
                    leading = (ws.min or 0)
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
                    # remove leading whitespace of the given length
         
     | 
| 
      
 29 
     | 
    
         
            +
                    if leading > 0
         
     | 
| 
      
 30 
     | 
    
         
            +
                      r = /^ {#{leading}}/
         
     | 
| 
      
 31 
     | 
    
         
            +
                      txt.gsub! r, ''
         
     | 
| 
      
 32 
     | 
    
         
            +
                    end
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
      
 34 
     | 
    
         
            +
                    # lazy man's parser (we don't do any of that silly backtracking)
         
     | 
| 
      
 35 
     | 
    
         
            +
                    cursor = 0
         
     | 
| 
      
 36 
     | 
    
         
            +
                    while true
         
     | 
| 
      
 37 
     | 
    
         
            +
                      matches = mappings.map do |pair|
         
     | 
| 
      
 38 
     | 
    
         
            +
                        [pair[0].match(txt, cursor), pair[1]]
         
     | 
| 
      
 39 
     | 
    
         
            +
                      end
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
                      upto = matches.min_by do |pair|
         
     | 
| 
      
 42 
     | 
    
         
            +
                        matchdata = pair[0]
         
     | 
| 
      
 43 
     | 
    
         
            +
                        if matchdata == nil
         
     | 
| 
      
 44 
     | 
    
         
            +
                          txt.size
         
     | 
| 
      
 45 
     | 
    
         
            +
                        else
         
     | 
| 
      
 46 
     | 
    
         
            +
                          matchdata.begin(0)
         
     | 
| 
      
 47 
     | 
    
         
            +
                        end
         
     | 
| 
      
 48 
     | 
    
         
            +
                      end
         
     | 
| 
      
 49 
     | 
    
         
            +
             
     | 
| 
      
 50 
     | 
    
         
            +
                      if upto[0] != nil
         
     | 
| 
      
 51 
     | 
    
         
            +
                        results << brush.plain(txt.slice(cursor, upto[0].begin(0)-cursor))
         
     | 
| 
      
 52 
     | 
    
         
            +
             
     | 
| 
      
 53 
     | 
    
         
            +
                        # which match?
         
     | 
| 
      
 54 
     | 
    
         
            +
                        captures = upto[0].captures
         
     | 
| 
      
 55 
     | 
    
         
            +
                        results << brush.method(upto[1]).call(*captures)
         
     | 
| 
      
 56 
     | 
    
         
            +
                        cursor = upto[0].end(0)
         
     | 
| 
      
 57 
     | 
    
         
            +
                      else
         
     | 
| 
      
 58 
     | 
    
         
            +
                        # no matches remaining
         
     | 
| 
      
 59 
     | 
    
         
            +
                        results << brush.plain(txt.slice(cursor, txt.size))
         
     | 
| 
      
 60 
     | 
    
         
            +
                        break
         
     | 
| 
      
 61 
     | 
    
         
            +
                      end
         
     | 
| 
      
 62 
     | 
    
         
            +
                    end
         
     | 
| 
      
 63 
     | 
    
         
            +
             
     | 
| 
      
 64 
     | 
    
         
            +
                    return results.join('')
         
     | 
| 
      
 65 
     | 
    
         
            +
                  end
         
     | 
| 
      
 66 
     | 
    
         
            +
                end
         
     | 
| 
      
 67 
     | 
    
         
            +
              end
         
     | 
| 
      
 68 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,57 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'jekyll-pseudocode/brush'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            module Jekyll
         
     | 
| 
      
 4 
     | 
    
         
            +
              module PseudoCode
         
     | 
| 
      
 5 
     | 
    
         
            +
                class HtmlBrush < Jekyll::PseudoCode::Brush
         
     | 
| 
      
 6 
     | 
    
         
            +
                  def sym(txt)
         
     | 
| 
      
 7 
     | 
    
         
            +
                    "<span class='symbol'>#{txt}</span>"
         
     | 
| 
      
 8 
     | 
    
         
            +
                  end
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
                  def fn(txt)
         
     | 
| 
      
 11 
     | 
    
         
            +
                    "<span class='function'>#{txt}</span>"
         
     | 
| 
      
 12 
     | 
    
         
            +
                  end
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
                  def var(txt, sub)
         
     | 
| 
      
 15 
     | 
    
         
            +
                    if sub
         
     | 
| 
      
 16 
     | 
    
         
            +
                      "<span class='variable'>#{txt}<sub>#{sub.slice(1,sub.size)}</sub></span>"
         
     | 
| 
      
 17 
     | 
    
         
            +
                    else
         
     | 
| 
      
 18 
     | 
    
         
            +
                      "<span class='variable'>#{txt}</span>"
         
     | 
| 
      
 19 
     | 
    
         
            +
                    end
         
     | 
| 
      
 20 
     | 
    
         
            +
                  end
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
                  def comment(txt)
         
     | 
| 
      
 23 
     | 
    
         
            +
                    "<span class='comment'>/* #{txt.strip} */</span>"
         
     | 
| 
      
 24 
     | 
    
         
            +
                  end
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
                  def string(txt)
         
     | 
| 
      
 27 
     | 
    
         
            +
                    "<span class='string'>#{txt}</span>"
         
     | 
| 
      
 28 
     | 
    
         
            +
                  end
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
                  def indent(txt)
         
     | 
| 
      
 31 
     | 
    
         
            +
                    txt.gsub! "\t", '   '
         
     | 
| 
      
 32 
     | 
    
         
            +
                    "<span class='indent'>#{txt}</span>"
         
     | 
| 
      
 33 
     | 
    
         
            +
                  end
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
                  def op(txt)
         
     | 
| 
      
 36 
     | 
    
         
            +
                    symbol = case txt
         
     | 
| 
      
 37 
     | 
    
         
            +
                    when '<' then '〈'
         
     | 
| 
      
 38 
     | 
    
         
            +
                    when '>' then '〉'
         
     | 
| 
      
 39 
     | 
    
         
            +
                    when '<=' then '≤'
         
     | 
| 
      
 40 
     | 
    
         
            +
                    when '>=' then '≥'
         
     | 
| 
      
 41 
     | 
    
         
            +
                    when '<-' then '←'
         
     | 
| 
      
 42 
     | 
    
         
            +
                    when '->' then '→'
         
     | 
| 
      
 43 
     | 
    
         
            +
                    when '*' then '×'
         
     | 
| 
      
 44 
     | 
    
         
            +
                    when '[' then '['
         
     | 
| 
      
 45 
     | 
    
         
            +
                    when ']' then ']'
         
     | 
| 
      
 46 
     | 
    
         
            +
                    else txt
         
     | 
| 
      
 47 
     | 
    
         
            +
                    end
         
     | 
| 
      
 48 
     | 
    
         
            +
                    # FIXME: html conversion for some operators
         
     | 
| 
      
 49 
     | 
    
         
            +
                    "<span class='op'>#{symbol}</span>"
         
     | 
| 
      
 50 
     | 
    
         
            +
                  end
         
     | 
| 
      
 51 
     | 
    
         
            +
             
     | 
| 
      
 52 
     | 
    
         
            +
                  def plain(txt)
         
     | 
| 
      
 53 
     | 
    
         
            +
                    "#{txt}"
         
     | 
| 
      
 54 
     | 
    
         
            +
                  end
         
     | 
| 
      
 55 
     | 
    
         
            +
                end
         
     | 
| 
      
 56 
     | 
    
         
            +
              end
         
     | 
| 
      
 57 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,43 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'jekyll-pseudocode/brush'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            module Jekyll
         
     | 
| 
      
 4 
     | 
    
         
            +
              module PseudoCode
         
     | 
| 
      
 5 
     | 
    
         
            +
                class MockBrush < Brush
         
     | 
| 
      
 6 
     | 
    
         
            +
                  def sym(txt)
         
     | 
| 
      
 7 
     | 
    
         
            +
                    "sym(#{txt})"
         
     | 
| 
      
 8 
     | 
    
         
            +
                  end
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
                  def fn(txt)
         
     | 
| 
      
 11 
     | 
    
         
            +
                    "fn(#{txt})"
         
     | 
| 
      
 12 
     | 
    
         
            +
                  end
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
                  def var(txt, sub)
         
     | 
| 
      
 15 
     | 
    
         
            +
                    if sub
         
     | 
| 
      
 16 
     | 
    
         
            +
                      "#{txt}sub(#{sub.slice(1,sub.size)})"
         
     | 
| 
      
 17 
     | 
    
         
            +
                    else
         
     | 
| 
      
 18 
     | 
    
         
            +
                      txt
         
     | 
| 
      
 19 
     | 
    
         
            +
                    end
         
     | 
| 
      
 20 
     | 
    
         
            +
                  end
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
                  def comment(txt)
         
     | 
| 
      
 23 
     | 
    
         
            +
                    "c(#{txt})"
         
     | 
| 
      
 24 
     | 
    
         
            +
                  end
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
                  def op(txt)
         
     | 
| 
      
 27 
     | 
    
         
            +
                    "op(#{txt})"
         
     | 
| 
      
 28 
     | 
    
         
            +
                  end
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
                  def string(txt)
         
     | 
| 
      
 31 
     | 
    
         
            +
                    "str(#{txt})"
         
     | 
| 
      
 32 
     | 
    
         
            +
                  end
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
      
 34 
     | 
    
         
            +
                  def indent(txt)
         
     | 
| 
      
 35 
     | 
    
         
            +
                    "i(#{txt})"
         
     | 
| 
      
 36 
     | 
    
         
            +
                  end
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
                  def plain(txt)
         
     | 
| 
      
 39 
     | 
    
         
            +
                    txt
         
     | 
| 
      
 40 
     | 
    
         
            +
                  end
         
     | 
| 
      
 41 
     | 
    
         
            +
                end
         
     | 
| 
      
 42 
     | 
    
         
            +
              end
         
     | 
| 
      
 43 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,51 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require_relative '../lib/jekyll-pseudocode.rb'
         
     | 
| 
      
 2 
     | 
    
         
            +
            require_relative '../lib/jekyll-pseudocode/mock_brush.rb'
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            include Jekyll::PseudoCode
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            describe Grammar do
         
     | 
| 
      
 7 
     | 
    
         
            +
              def format(txt)
         
     | 
| 
      
 8 
     | 
    
         
            +
                g = Grammar.new
         
     | 
| 
      
 9 
     | 
    
         
            +
                g.format(txt, MockBrush.new)
         
     | 
| 
      
 10 
     | 
    
         
            +
              end
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
              describe "#format" do
         
     | 
| 
      
 13 
     | 
    
         
            +
                it "ignores plain text" do
         
     | 
| 
      
 14 
     | 
    
         
            +
                  format("plain text").should eql "plain text"
         
     | 
| 
      
 15 
     | 
    
         
            +
                end
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
                it "formats symbols" do
         
     | 
| 
      
 18 
     | 
    
         
            +
                  format("For").should eql "sym(For)"
         
     | 
| 
      
 19 
     | 
    
         
            +
                  format("For this").should eql "sym(For) this"
         
     | 
| 
      
 20 
     | 
    
         
            +
                  format("If Then").should eql "sym(If) sym(Then)"
         
     | 
| 
      
 21 
     | 
    
         
            +
                  format("If Then that").should eql ("sym(If) sym(Then) that")
         
     | 
| 
      
 22 
     | 
    
         
            +
                end
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
                it "formats comments" do
         
     | 
| 
      
 25 
     | 
    
         
            +
                  format("oh #hi\n there").should eql "oh c(hi)\ni( )there"
         
     | 
| 
      
 26 
     | 
    
         
            +
                end
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
                it "formats operators" do
         
     | 
| 
      
 29 
     | 
    
         
            +
                  format("For a < b").should eql("sym(For) a op(<) b")
         
     | 
| 
      
 30 
     | 
    
         
            +
                end
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
      
 32 
     | 
    
         
            +
                it 'formats strings' do
         
     | 
| 
      
 33 
     | 
    
         
            +
                  format('oh "what" a world!').should eql 'oh str("what") a world!'
         
     | 
| 
      
 34 
     | 
    
         
            +
                end
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
                it 'formats variables' do
         
     | 
| 
      
 37 
     | 
    
         
            +
                  format('x_0').should eql ('xsub(0)')
         
     | 
| 
      
 38 
     | 
    
         
            +
                  format('x_i').should eql ('xsub(i)')
         
     | 
| 
      
 39 
     | 
    
         
            +
                end
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
                it 'formats functions' do
         
     | 
| 
      
 42 
     | 
    
         
            +
                  format('fn(b,c)').should eql('fn(fn)op(()b,cop())')
         
     | 
| 
      
 43 
     | 
    
         
            +
                end
         
     | 
| 
      
 44 
     | 
    
         
            +
             
     | 
| 
      
 45 
     | 
    
         
            +
                it 'strips leading whitespace' do
         
     | 
| 
      
 46 
     | 
    
         
            +
                  format("\thi\n\tthere").should eql("hi\nthere")
         
     | 
| 
      
 47 
     | 
    
         
            +
                  format("\thi\n\t\tthere").should eql("hi\ni(\t)there")
         
     | 
| 
      
 48 
     | 
    
         
            +
                  format("\t\thi\n\tthere").should eql("i(\t)hi\nthere")
         
     | 
| 
      
 49 
     | 
    
         
            +
                end
         
     | 
| 
      
 50 
     | 
    
         
            +
              end
         
     | 
| 
      
 51 
     | 
    
         
            +
            end
         
     | 
    
        data/spec/html_spec.rb
    ADDED
    
    | 
         @@ -0,0 +1,35 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require_relative '../lib/jekyll-pseudocode.rb'
         
     | 
| 
      
 2 
     | 
    
         
            +
            require_relative '../lib/jekyll-pseudocode/mock_brush.rb'
         
     | 
| 
      
 3 
     | 
    
         
            +
            # require 'spec_helper'
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            include Jekyll::PseudoCode
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            describe HtmlBrush do
         
     | 
| 
      
 8 
     | 
    
         
            +
              def format(txt)
         
     | 
| 
      
 9 
     | 
    
         
            +
                g = Grammar.new
         
     | 
| 
      
 10 
     | 
    
         
            +
                g.format(txt, HtmlBrush.new)
         
     | 
| 
      
 11 
     | 
    
         
            +
              end
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
              describe "#format" do
         
     | 
| 
      
 14 
     | 
    
         
            +
                it "symbol span" do
         
     | 
| 
      
 15 
     | 
    
         
            +
                  format("For").should eql "<span class='symbol'>For</span>"
         
     | 
| 
      
 16 
     | 
    
         
            +
                end
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
                it "fn span" do
         
     | 
| 
      
 19 
     | 
    
         
            +
                  format("fn()").should eql "<span class='function'>fn</span><span class='op'>(</span><span class='op'>)</span>"
         
     | 
| 
      
 20 
     | 
    
         
            +
                end
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
                it "comment span" do
         
     | 
| 
      
 23 
     | 
    
         
            +
                  format("# hi!").should eql "<span class='comment'>/* hi! */</span>"
         
     | 
| 
      
 24 
     | 
    
         
            +
                end
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
                it "variable span" do
         
     | 
| 
      
 27 
     | 
    
         
            +
                  format("a_b").should eql "<span class='variable'>a<sub>b</sub></span>"
         
     | 
| 
      
 28 
     | 
    
         
            +
                end
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
                it "operator converstions" do
         
     | 
| 
      
 31 
     | 
    
         
            +
                  format("<").should eql "<span class='op'>〈</span>"
         
     | 
| 
      
 32 
     | 
    
         
            +
                  format("*").should eql "<span class='op'>×</span>"
         
     | 
| 
      
 33 
     | 
    
         
            +
                end
         
     | 
| 
      
 34 
     | 
    
         
            +
              end
         
     | 
| 
      
 35 
     | 
    
         
            +
            end
         
     | 
    
        metadata
    ADDED
    
    | 
         @@ -0,0 +1,78 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            --- !ruby/object:Gem::Specification
         
     | 
| 
      
 2 
     | 
    
         
            +
            name: jekyll-pseudocode
         
     | 
| 
      
 3 
     | 
    
         
            +
            version: !ruby/object:Gem::Version
         
     | 
| 
      
 4 
     | 
    
         
            +
              version: 0.1.3
         
     | 
| 
      
 5 
     | 
    
         
            +
            platform: ruby
         
     | 
| 
      
 6 
     | 
    
         
            +
            authors:
         
     | 
| 
      
 7 
     | 
    
         
            +
            - Victor Bazterra
         
     | 
| 
      
 8 
     | 
    
         
            +
            - " Wiktor Macura"
         
     | 
| 
      
 9 
     | 
    
         
            +
            autorequire: 
         
     | 
| 
      
 10 
     | 
    
         
            +
            bindir: bin
         
     | 
| 
      
 11 
     | 
    
         
            +
            cert_chain: []
         
     | 
| 
      
 12 
     | 
    
         
            +
            date: 2017-09-08 00:00:00.000000000 Z
         
     | 
| 
      
 13 
     | 
    
         
            +
            dependencies:
         
     | 
| 
      
 14 
     | 
    
         
            +
            - !ruby/object:Gem::Dependency
         
     | 
| 
      
 15 
     | 
    
         
            +
              name: jekyll
         
     | 
| 
      
 16 
     | 
    
         
            +
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
      
 17 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 18 
     | 
    
         
            +
                - - ">="
         
     | 
| 
      
 19 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 20 
     | 
    
         
            +
                    version: '0'
         
     | 
| 
      
 21 
     | 
    
         
            +
              type: :runtime
         
     | 
| 
      
 22 
     | 
    
         
            +
              prerelease: false
         
     | 
| 
      
 23 
     | 
    
         
            +
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
      
 24 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 25 
     | 
    
         
            +
                - - ">="
         
     | 
| 
      
 26 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 27 
     | 
    
         
            +
                    version: '0'
         
     | 
| 
      
 28 
     | 
    
         
            +
            description: jekyll-pseudocode helps typeset pseudocode with minimal formatting
         
     | 
| 
      
 29 
     | 
    
         
            +
            email:
         
     | 
| 
      
 30 
     | 
    
         
            +
            - bazterra@gmail.com
         
     | 
| 
      
 31 
     | 
    
         
            +
            - wmacura@gmail.com
         
     | 
| 
      
 32 
     | 
    
         
            +
            executables: []
         
     | 
| 
      
 33 
     | 
    
         
            +
            extensions: []
         
     | 
| 
      
 34 
     | 
    
         
            +
            extra_rdoc_files: []
         
     | 
| 
      
 35 
     | 
    
         
            +
            files:
         
     | 
| 
      
 36 
     | 
    
         
            +
            - ".gitignore"
         
     | 
| 
      
 37 
     | 
    
         
            +
            - ".ruby-version"
         
     | 
| 
      
 38 
     | 
    
         
            +
            - Gemfile
         
     | 
| 
      
 39 
     | 
    
         
            +
            - LICENSE
         
     | 
| 
      
 40 
     | 
    
         
            +
            - README.md
         
     | 
| 
      
 41 
     | 
    
         
            +
            - Rakefile
         
     | 
| 
      
 42 
     | 
    
         
            +
            - doc/screenshot.png
         
     | 
| 
      
 43 
     | 
    
         
            +
            - jekyll-pseudocode.gemspec
         
     | 
| 
      
 44 
     | 
    
         
            +
            - lib/jekyll-pseudocode.css
         
     | 
| 
      
 45 
     | 
    
         
            +
            - lib/jekyll-pseudocode.rb
         
     | 
| 
      
 46 
     | 
    
         
            +
            - lib/jekyll-pseudocode/brush.rb
         
     | 
| 
      
 47 
     | 
    
         
            +
            - lib/jekyll-pseudocode/grammar.rb
         
     | 
| 
      
 48 
     | 
    
         
            +
            - lib/jekyll-pseudocode/html_brush.rb
         
     | 
| 
      
 49 
     | 
    
         
            +
            - lib/jekyll-pseudocode/mock_brush.rb
         
     | 
| 
      
 50 
     | 
    
         
            +
            - lib/jekyll-pseudocode/version.rb
         
     | 
| 
      
 51 
     | 
    
         
            +
            - spec/grammar_spec.rb
         
     | 
| 
      
 52 
     | 
    
         
            +
            - spec/html_spec.rb
         
     | 
| 
      
 53 
     | 
    
         
            +
            homepage: http://github.com/baites/jekyll-pseudocode
         
     | 
| 
      
 54 
     | 
    
         
            +
            licenses: []
         
     | 
| 
      
 55 
     | 
    
         
            +
            metadata: {}
         
     | 
| 
      
 56 
     | 
    
         
            +
            post_install_message: 
         
     | 
| 
      
 57 
     | 
    
         
            +
            rdoc_options: []
         
     | 
| 
      
 58 
     | 
    
         
            +
            require_paths:
         
     | 
| 
      
 59 
     | 
    
         
            +
            - lib
         
     | 
| 
      
 60 
     | 
    
         
            +
            required_ruby_version: !ruby/object:Gem::Requirement
         
     | 
| 
      
 61 
     | 
    
         
            +
              requirements:
         
     | 
| 
      
 62 
     | 
    
         
            +
              - - ">="
         
     | 
| 
      
 63 
     | 
    
         
            +
                - !ruby/object:Gem::Version
         
     | 
| 
      
 64 
     | 
    
         
            +
                  version: '0'
         
     | 
| 
      
 65 
     | 
    
         
            +
            required_rubygems_version: !ruby/object:Gem::Requirement
         
     | 
| 
      
 66 
     | 
    
         
            +
              requirements:
         
     | 
| 
      
 67 
     | 
    
         
            +
              - - ">="
         
     | 
| 
      
 68 
     | 
    
         
            +
                - !ruby/object:Gem::Version
         
     | 
| 
      
 69 
     | 
    
         
            +
                  version: '0'
         
     | 
| 
      
 70 
     | 
    
         
            +
            requirements: []
         
     | 
| 
      
 71 
     | 
    
         
            +
            rubyforge_project: 
         
     | 
| 
      
 72 
     | 
    
         
            +
            rubygems_version: 2.6.11
         
     | 
| 
      
 73 
     | 
    
         
            +
            signing_key: 
         
     | 
| 
      
 74 
     | 
    
         
            +
            specification_version: 4
         
     | 
| 
      
 75 
     | 
    
         
            +
            summary: A trivial jekyll plugin for pseudocode fork from jekyll-pseudo
         
     | 
| 
      
 76 
     | 
    
         
            +
            test_files:
         
     | 
| 
      
 77 
     | 
    
         
            +
            - spec/grammar_spec.rb
         
     | 
| 
      
 78 
     | 
    
         
            +
            - spec/html_spec.rb
         
     |