ruhoh 2.4 → 2.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,41 @@
1
+ Feature: Date Formatting
2
+ As a content publisher
3
+ I want my dates to be formated correctly
4
+ so that I can ...
5
+
6
+ Scenario Outline: Date with configured date_format and correct dates
7
+ Given a config file with value:
8
+ """
9
+ { "date_format": "<date-format>" }
10
+ """
11
+ And some files with values:
12
+ | file | date | body |
13
+ | _root/index.html | <date> | {{ page.date }} |
14
+ When I compile my site
15
+ Then my compiled site should have the file "index.html"
16
+ And this file should contain the content "<formated-date>"
17
+ Examples:
18
+ | date | date-format | formated-date |
19
+ | 2013-12-11 | %Y.%m | 2013.12 |
20
+ | 2012-01-1 | | |
21
+ | 1991.11.11 | %B %d, %Y | November 11, 1991 |
22
+ | 0-1-2 | %d/%m/%y | 02/01/00 |
23
+
24
+
25
+ Scenario: Date without a configured date_format
26
+ Given some files with values:
27
+ | file | date | body |
28
+ | _root/index.html | 2013.12.11 | {{ page.date }} |
29
+ When I compile my site
30
+ Then my compiled site should have the file "index.html"
31
+ And this file should contain the content "2013-12-11"
32
+
33
+ Scenario: Invalid date
34
+ Given some files with values:
35
+ | file | date | body |
36
+ | _root/index.html | 0-0 | {{ page.date }} |
37
+ When I try to compile my site
38
+ Then it should fail with:
39
+ """
40
+ ArgumentError: The date '0-0' specified in 'index.html' is unparsable.
41
+ """
@@ -2,6 +2,10 @@ Transform(/^(should|should NOT)$/) do |matcher|
2
2
  matcher.downcase.gsub(' ', '_')
3
3
  end
4
4
 
5
+ Given(/^a config file with value:$/) do |string|
6
+ make_config(JSON.parse(string))
7
+ end
8
+
5
9
  Given(/^a config file with values:$/) do |table|
6
10
  data = table.rows_hash
7
11
  data.each{ |key, value| data[key] = JSON.parse(value) }
@@ -21,6 +25,27 @@ Given(/^some files with values:$/) do |table|
21
25
  end
22
26
  end
23
27
 
28
+ When(/^I try to compile my site$/) do
29
+ begin
30
+ compile
31
+ rescue Exception => e
32
+ @exception = e
33
+ end
34
+ end
35
+
36
+ Then(/^it should fail$/) do
37
+ @exception.should_not be_nil
38
+ end
39
+
40
+ Then(/^it (should|should NOT) fail with:$/) do |matcher, content|
41
+ @exception.should_not be_nil
42
+ Ruhoh.log.buffer.last.__send__(matcher, have_content(content))
43
+ end
44
+
45
+ Then(/^the log (should|should NOT) include:$/) do |matcher, content|
46
+ Ruhoh.log.buffer.__send__(matcher, include(content))
47
+ end
48
+
24
49
  When(/^I compile my site$/) do
25
50
  compile
26
51
  end
@@ -1,4 +1,25 @@
1
1
  [
2
+ {
3
+ "version" : "2.5",
4
+ "date" : "22.09.2013",
5
+ "features" : [
6
+ "@stebalien makes dates formattable",
7
+ "Add more helpful 404 not_found page for pages that don't exist.",
8
+ "Add support for `ruhoh server`; builtin web-server spawning.",
9
+ "Add gist view helper.",
10
+ "Add SimpleProxy helper object for views.",
11
+ "Allow converters to run on partials if file ext specified.",
12
+ "Add command line interface for publish.",
13
+ "@amanking add Google Analytics support for _setDomainName"
14
+ ],
15
+ "bugs" : [
16
+ "Fix parse error when trying to parse empty file.",
17
+ "@douo Fix list command fail in verbose mode",
18
+ "@wwchen fix for drafts ommiting title via terminal.",
19
+ "@douo routes should trace all routable resources."
20
+ ]
21
+ }
22
+ ,
2
23
  {
3
24
  "version" : "2.4",
4
25
  "date" : "10.09.2013",
@@ -2,6 +2,7 @@
2
2
  Encoding.default_internal = 'UTF-8'
3
3
  require 'json'
4
4
  require 'time'
5
+ require 'ruhoh/time'
5
6
  require 'cgi'
6
7
  require 'fileutils'
7
8
  require 'ostruct'
@@ -81,6 +82,8 @@ class Ruhoh
81
82
  config['base_path'] += "/" unless config['base_path'][-1] == '/'
82
83
  end
83
84
 
85
+ Time.default_format = config['date_format'] || "%Y-%m-%d"
86
+
84
87
  @config = config
85
88
  end
86
89
 
@@ -233,7 +236,7 @@ class Ruhoh
233
236
  dict[key] || dict.values.find{ |a| key == a['id'].gsub(/.[^.]+$/, '') }
234
237
  end
235
238
 
236
- # Collect all files from the base bascade directories.
239
+ # Collect all files from the base cascade directories.
237
240
  # @return[Hash] dictionary of file pointers
238
241
  def _all_files
239
242
  dict = {}
@@ -66,7 +66,17 @@ module Ruhoh::Base
66
66
  data['id'] = @pointer['id']
67
67
 
68
68
  data['title'] = data['title'] || filename_data['title']
69
- data['date'] ||= filename_data['date'].to_s
69
+ data['date'] ||= filename_data['date']
70
+
71
+ # Parse and store date as an object
72
+ begin
73
+ data['date'] = Time.parse(data['date']) unless data['date'].nil? || data['date'].is_a?(Time)
74
+ rescue
75
+ Ruhoh.log.error(
76
+ "ArgumentError: The date '#{data['date']}' specified in '#{@pointer['id']}' is unparsable."
77
+ )
78
+ data['date'] = nil
79
+ end
70
80
  data['url'] = url(data)
71
81
  data['layout'] = collection.config['layout'] if data['layout'].nil?
72
82
 
@@ -44,10 +44,7 @@ module Ruhoh::Base
44
44
  this_data = __send__(attribute)
45
45
  other_data = other.__send__(attribute)
46
46
  if attribute == "date"
47
- begin
48
- this_data = Time.parse(this_data.to_s)
49
- other_data = Time.parse(other_data.to_s)
50
- rescue ArgumentError, TypeError
47
+ if this_data.nil? || other_data.nil?
51
48
  Ruhoh.log.error(
52
49
  "ArgumentError:" +
53
50
  " The '#{ @model.collection.resource_name }' collection is configured to sort based on 'date'" +
@@ -1,7 +1,12 @@
1
+ require 'benchmark'
2
+
1
3
  require 'ruhoh/programs/compile'
2
4
  require 'ruhoh/console_methods'
3
- require 'irb'
4
- require 'benchmark'
5
+
6
+ module Ruhoh::Publish; end
7
+ Dir[File.join(File.dirname(__FILE__), 'publish', '*.rb')].each { |f|
8
+ require f
9
+ }
5
10
 
6
11
  class Ruhoh
7
12
 
@@ -16,6 +21,10 @@ class Ruhoh
16
21
  "command" => "compile",
17
22
  "desc" => "Compile to static website."
18
23
  },
24
+ {
25
+ "command" => "publish <service>",
26
+ "desc" => "Publish site using a given service library"
27
+ },
19
28
  {
20
29
  "command" => "help",
21
30
  "desc" => "Show this menu."
@@ -25,9 +34,12 @@ class Ruhoh
25
34
  @args = data[:args]
26
35
  @options = data[:options]
27
36
  @opt_parser = data[:opt_parser]
28
- @ruhoh = Ruhoh.new
37
+
29
38
  cmd = (@args[0] == 'new') ? 'blog' : (@args[0] || 'help')
30
39
 
40
+ return server if %w(s serve server).include?(cmd)
41
+
42
+ @ruhoh = Ruhoh.new
31
43
  @ruhoh.setup
32
44
  @ruhoh.setup_paths
33
45
  @ruhoh.setup_plugins
@@ -51,6 +63,7 @@ class Ruhoh
51
63
 
52
64
  # Thanks rails! https://github.com/rails/rails/blob/master/railties/lib/rails/commands/console.rb
53
65
  def console
66
+ require 'irb'
54
67
  require 'pp'
55
68
  Ruhoh::ConsoleMethods.env = @args[1]
56
69
  IRB::ExtendCommandBundle.send :include, Ruhoh::ConsoleMethods
@@ -103,6 +116,37 @@ class Ruhoh
103
116
  }
104
117
  end
105
118
 
119
+ def server
120
+ require 'rack'
121
+ Rack::Server.start({
122
+ app: Ruhoh::Program.preview,
123
+ Port: (@args[1] || 9292)
124
+ })
125
+ end
126
+ alias_method :s, :server
127
+ alias_method :serve, :server
128
+
129
+ def publish
130
+ service = @args[1].to_s.downcase.capitalize
131
+ if service.empty?
132
+ Ruhoh::Friend.say {
133
+ red "Specify a publishing service"
134
+ exit
135
+ }
136
+ end
137
+
138
+ if Ruhoh::Publish.const_defined?(service.to_sym)
139
+ publish_config = Ruhoh::Parse.data_file(@ruhoh.base, "publish") || {}
140
+ Ruhoh::Publish.const_get(service.to_sym).new.run(@args, publish_config[service.downcase])
141
+ else
142
+ Ruhoh::Friend.say {
143
+ red "'#{ service }' not found."
144
+ plain "Ensure the service class is properly namespaced at Ruhoh::Publish::#{ service }"
145
+ exit
146
+ }
147
+ end
148
+ end
149
+
106
150
  # Public: Create a new blog at the directory provided.
107
151
  def blog
108
152
  name = @args[1]
@@ -14,7 +14,7 @@ class Ruhoh
14
14
  front_matter = nil
15
15
  format = nil
16
16
  page = File.open(filepath, 'r:UTF-8') { |f| f.read }
17
- first_line = page.lines.first
17
+ first_line = page.lines.first.to_s
18
18
 
19
19
  begin
20
20
  if (first_line.strip == '---')
@@ -3,7 +3,7 @@ class Ruhoh
3
3
  # Public: A program for compiling to a static website.
4
4
  # The compile environment should always be 'production' in order
5
5
  # to properly omit drafts and other development-only settings.
6
- def self.compile(target)
6
+ def self.compile(target=nil)
7
7
  ruhoh = Ruhoh.new
8
8
  ruhoh.setup
9
9
  ruhoh.env = 'production'
@@ -15,8 +15,10 @@ class Ruhoh
15
15
  elsif ruhoh.config["compiled"]
16
16
  ruhoh.paths.compiled = ruhoh.config["compiled"]
17
17
  end
18
-
18
+
19
19
  ruhoh.compile
20
+
21
+ ruhoh
20
22
  end
21
23
  end
22
24
  end
@@ -0,0 +1,36 @@
1
+ class Ruhoh
2
+ class Publish::Rsync
3
+ # Deploy via rsync
4
+ # @param[opts] - CLI arguments
5
+ # @param[config] - config hash supplied from publish.yml or publish.json
6
+ #
7
+ # Example publish.json file:
8
+ # {
9
+ # "rsync": {
10
+ # "command": nil,
11
+ # "user": "root",
12
+ # "host": "12.345.67.891",
13
+ # "destination": "/var/www/my-site.com"
14
+ # }
15
+ # }
16
+ #
17
+ # Use "command" to specify a customized rsync command to execute.
18
+ def run(opts={}, config={})
19
+ @config = config
20
+ ruhoh = Ruhoh::Program.compile
21
+
22
+ if @config["command"]
23
+ system(@config["command"])
24
+ else
25
+ system('rsync', File.join(ruhoh.paths.compiled, '.'), '-avz', '--delete', '--exclude', '.git', remote)
26
+ end
27
+ FileUtils.rm_r(ruhoh.paths.compiled)
28
+ end
29
+
30
+ private
31
+
32
+ def remote
33
+ "#{ @config["user"] }@#{ @config["host"] }:#{ @config["destination"] }"
34
+ end
35
+ end
36
+ end
@@ -67,7 +67,7 @@ module Ruhoh::Resources::Pages
67
67
  def render_scaffold
68
68
  (@collection.scaffold || '')
69
69
  .gsub('{{DATE}}', Time.now.strftime('%Y-%m-%d'))
70
- .gsub('{{TITLE}}', @args[2])
70
+ .gsub('{{TITLE}}', (@args[2] || ''))
71
71
  end
72
72
 
73
73
  protected
@@ -116,7 +116,7 @@ module Ruhoh::Resources::Pages
116
116
  def _list(data)
117
117
  if @options.verbose
118
118
  Ruhoh::Friend.say {
119
- data.each_value do |p|
119
+ data.each do |p|
120
120
  cyan("- #{p['id']}")
121
121
  plain(" title: #{p['title']}")
122
122
  plain(" url: #{p['url']}")
@@ -41,11 +41,11 @@ module Ruhoh::Resources::Pages
41
41
  collated = []
42
42
  pages = all
43
43
  pages.each_with_index do |page, i|
44
- thisYear = Time.parse(page['date'].to_s).strftime('%Y')
45
- thisMonth = Time.parse(page['date'].to_s).strftime('%B')
44
+ thisYear = page['date'].strftime('%Y')
45
+ thisMonth = page['date'].strftime('%B')
46
46
  if (i-1 >= 0)
47
- prevYear = Time.parse(pages[i-1]['date'].to_s).strftime('%Y')
48
- prevMonth = Time.parse(pages[i-1]['date'].to_s).strftime('%B')
47
+ prevYear = pages[i-1]['date'].strftime('%Y')
48
+ prevMonth = pages[i-1]['date'].strftime('%B')
49
49
  end
50
50
 
51
51
  if(prevYear == thisYear)
@@ -1,3 +1,4 @@
1
+ require 'ruhoh/ui/page_not_found'
1
2
  # Public: Rack application used to render singular pages via their URL.
2
3
  module Ruhoh::Resources::Pages
3
4
  class Previewer
@@ -23,16 +24,7 @@ module Ruhoh::Resources::Pages
23
24
  if view
24
25
  [200, {'Content-Type' => 'text/html'}, [view.render_full]]
25
26
  else
26
- message = "No generated page URL matches '#{ env['PATH_INFO'] }'" +
27
- " using file pointer: '#{ pointer.inspect }'."
28
-
29
- if pointer.nil?
30
- message += " Since the file pointer was nil" +
31
- " we tried to load a pagination view but it didn't work;" +
32
- "\n Expected the format to be: '<valid_resource_name>/page_number'"
33
- end
34
-
35
- raise message
27
+ Ruhoh::UI::PageNotFound.new(@ruhoh, pointer).call(env)
36
28
  end
37
29
  end
38
30
 
@@ -70,4 +62,4 @@ module Ruhoh::Resources::Pages
70
62
  [200, {'Content-Type' => 'image/x-icon'}, ['']]
71
63
  end
72
64
  end
73
- end
65
+ end
@@ -3,9 +3,8 @@ module Ruhoh::Resources::Partials
3
3
  include Ruhoh::Base::Modelable
4
4
 
5
5
  def process
6
- return File.open(@pointer['realpath'], 'r:UTF-8') { |f|
7
- return f.read
8
- }
6
+ content = File.open(@pointer['realpath'], 'r:UTF-8') { |f| f.read }
7
+ Ruhoh::Converter.convert(content, @pointer['id'])
9
8
  end
10
9
  end
11
10
  end
@@ -5,7 +5,7 @@ class Ruhoh
5
5
  end
6
6
 
7
7
  def find(route)
8
- @ruhoh.collections.acting_as_pages.each do |r|
8
+ routable.each do |r|
9
9
  next unless @ruhoh.collection(r).routes[route]
10
10
  return @ruhoh.collection(r).routes[route]
11
11
  break
@@ -20,10 +20,16 @@ class Ruhoh
20
20
  # @returns[Hash map]
21
21
  def all
22
22
  routes = {}
23
- @ruhoh.collections.acting_as_pages.each do |r|
23
+ routable.each do |r|
24
24
  routes.merge!(@ruhoh.collection(r).routes)
25
25
  end
26
26
  routes
27
27
  end
28
+
29
+ def routable
30
+ @ruhoh.collections.all.keep_if do |r|
31
+ @ruhoh.collections.collection(r).include?(Ruhoh::Resources::Pages::Routable) rescue false
32
+ end
33
+ end
28
34
  end
29
35
  end
@@ -0,0 +1,10 @@
1
+ class Time
2
+ class << self
3
+ attr_accessor :default_format
4
+ default_format = "%Y-%m-%d %H:%M:%S %z"
5
+ end
6
+
7
+ def to_s
8
+ strftime Time.default_format
9
+ end
10
+ end
@@ -0,0 +1,103 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <style>
6
+ html, body {
7
+ margin:0;
8
+ padding:0;
9
+ font-family: monospace;
10
+ color: #424254;
11
+ }
12
+ h1, h2, h3, h4, h5 {
13
+ line-height: 1.2em;
14
+ }
15
+ div, p, ul {
16
+ line-height: 1.5em;
17
+ }
18
+ textarea {
19
+ display:block;
20
+ height:250px;
21
+ width:100%;
22
+ padding:0;
23
+ border:1px solid #ccc;
24
+ }
25
+ button {
26
+ font-size:1.4em;
27
+ width:100%;
28
+ padding:5px;
29
+ cursor: pointer;
30
+ }
31
+
32
+ #wrapper {
33
+ padding:20px;
34
+ }
35
+ .pane {
36
+ display:inline-block;
37
+ width:45%;
38
+ vertical-align: top;
39
+ }
40
+ .error {
41
+ color: #CC2A41;
42
+ }
43
+ #heading {
44
+ background-color: #CC2A41;
45
+ color:#FFF;
46
+ padding: 10px 20px;
47
+ margin:0;
48
+ font-weight: normal;
49
+ }
50
+ .success {
51
+ background-color: #64908A;
52
+ color:#FFF;
53
+ border:0;
54
+ }
55
+ .success:hover {
56
+ background-color: hsl(172, 18%, 38%)
57
+ }
58
+ pre, code {
59
+ background-color: #eee;
60
+ padding:3px;
61
+ }
62
+ </style>
63
+ <head>
64
+ </body>
65
+ <h1 id="heading">o_O | No generated page URL matches: {{ url }}</h1>
66
+ <div id="wrapper">
67
+ <p>
68
+ {{# pointer }}
69
+ Using file pointer:
70
+ <br>
71
+ <code>{{ pointer.inspect }}</code>
72
+ {{/ pointer }}
73
+ </p>
74
+
75
+ <p>
76
+ <strong class="error">NOTE:</strong>
77
+ <strong>{{ filepath }}</strong> <em>probably</em> represents this URL. We can't be sure as you may have set custom permalinks,
78
+ <br>but we figure we'd try to help anyway. This service will get better in time ^_^!
79
+ </p>
80
+ <div class="pane" style="margin-right:3%">
81
+ <h2>Create Page Automatically:</h2>
82
+ <form method="POST">
83
+ <textarea name="body">{{ content }}</textarea>
84
+ <button type="submit" class="success">YES - create {{ filepath }} now.</button>
85
+ </form>
86
+ </div>
87
+
88
+ <div class="pane">
89
+ <h2>Create Page Manually:</h2>
90
+ <pre><code>{{ filepath }}</code></pre>
91
+
92
+ <p>Write some sample markdown inside the file:</p>
93
+ <pre><code>{{ content }}</code></pre>
94
+
95
+ <p>
96
+ Save changes and reload the page: <a href="{{ url }}">{{ url }}</a>
97
+ <br>You should see the updated content =D.
98
+ </p>
99
+ </div>
100
+
101
+ </div>
102
+ </body>
103
+ </html>
@@ -0,0 +1,75 @@
1
+ module Ruhoh::UI
2
+ class PageNotFound
3
+ Content = <<-TEXT
4
+ # Hello World =D
5
+
6
+ > A profound quote.
7
+
8
+ ### Fruits I like
9
+
10
+ - apples
11
+ - oranges
12
+ - watermelons
13
+ - tomatoes
14
+ - avocados
15
+ TEXT
16
+
17
+ def initialize(ruhoh, pointer)
18
+ @ruhoh = ruhoh
19
+ @pointer = pointer
20
+ end
21
+
22
+ def call(env)
23
+ @request = Rack::Request.new(env)
24
+ @request.post? ? create : show
25
+ end
26
+
27
+ def show
28
+ template = File.open(File.join(File.dirname(__FILE__), 'page_not_found.html'), 'r:UTF-8').read
29
+ body = Mustache.render(template, {
30
+ pointer: @pointer,
31
+ url: @request.path,
32
+ filepath: File.join(File.basename(@ruhoh.base), filepath),
33
+ content: Content
34
+ })
35
+
36
+ [404, {'Content-Type' => 'text/html'}, [body]]
37
+ end
38
+
39
+ def create
40
+ FileUtils.mkdir_p File.dirname(filepath)
41
+ File.open(filepath, 'w:UTF-8') { |f| f.puts @request.params["body"] }
42
+
43
+ sleep 2 # wait for the watcher to pick up the changes (terrible i know)
44
+
45
+ response = Rack::Response.new
46
+ response.redirect @request.path
47
+ status, header, body = response.finish
48
+ end
49
+
50
+ private
51
+
52
+ # Determine the correct filepath from the URL structure.
53
+ # TODO: This if very rudimentary and only works for a stock configuration.
54
+ def filepath
55
+ parts = @request.path.split('/')
56
+ parts.shift # omit root forward slash
57
+
58
+ path = (parts.length <= 1) ?
59
+ File.join("_root", (parts.empty? ? "index" : parts.first)) :
60
+ File.join(*parts) # collection
61
+
62
+ File.extname(parts.last.to_s).to_s.empty? ?
63
+ (path + @ruhoh.collection(collection_name).config["ext"]) :
64
+ path
65
+ end
66
+
67
+ def collection_name
68
+ parts = @request.path.split('/')
69
+ parts.shift # omit root forward slash
70
+
71
+ (parts.length <= 1) ? "_root" : parts.first
72
+ end
73
+
74
+ end
75
+ end
@@ -1,4 +1,4 @@
1
1
  class Ruhoh
2
- Version = VERSION = '2.4'
2
+ Version = VERSION = '2.5'
3
3
  RuhohSpec = '2.1'
4
4
  end
@@ -0,0 +1,37 @@
1
+ module Ruhoh::Views::Helpers
2
+ # Simple proxy object used to responsd to arbitary method calls on an explicit receiver in views.
3
+ #
4
+ # Example:
5
+ #
6
+ # def gist
7
+ # SimpleProxy.new({
8
+ # matcher: /^[0-9]+$/,
9
+ # function: -> input {
10
+ # "<script src=\"https://gist.github.com/#{ input }.js\"></script>"
11
+ # }
12
+ # })
13
+ # end
14
+ #
15
+ # Usage:
16
+ #
17
+ # {{{ gist.12345 }}}
18
+ #
19
+ # The method "12345" is matched against "matcher" and provided to "function" on success.
20
+ class SimpleProxy
21
+ # @param[opts] Hash
22
+ # - opts[:matcher] A regular expression to match method calls against.
23
+ # - opts[:function] The function to execute when successfully called.
24
+ # The function takes the name of the method as the input.
25
+ def initialize(opts)
26
+ @opts = opts
27
+ end
28
+
29
+ def method_missing(name, *args, &block)
30
+ @opts[:function].call(name.to_s)
31
+ end
32
+
33
+ def respond_to?(method)
34
+ method.to_s.match(@opts[:matcher]).nil? ? super : true
35
+ end
36
+ end
37
+ end
@@ -1,4 +1,5 @@
1
1
  require 'ruhoh/views/rmustache'
2
+ require 'ruhoh/views/helpers/simple_proxy'
2
3
 
3
4
  module Ruhoh::Views
4
5
  module Helpers ; end
@@ -103,7 +104,16 @@ module Ruhoh::Views
103
104
  def to_slug(sub_context)
104
105
  Ruhoh::StringFormat.clean_slug(sub_context)
105
106
  end
106
-
107
+
108
+ def gist
109
+ @gist ||= Ruhoh::Views::Helpers::SimpleProxy.new({
110
+ matcher: /^[0-9]+$/,
111
+ function: -> input {
112
+ "<script src=\"https://gist.github.com/#{ input }.js\"></script>"
113
+ }
114
+ })
115
+ end
116
+
107
117
  # Public: Formats the path to the compiled file based on the URL.
108
118
  #
109
119
  # Returns: [String] The relative path to the compiled file for this page.
@@ -7,6 +7,7 @@ tracking_id : 'UA-123-12'
7
7
  var _gaq = _gaq || [];
8
8
  _gaq.push(['_setAccount', '{{ this_config.tracking_id }}']);
9
9
  _gaq.push(['_trackPageview']);
10
+ {{# this_config.domain_name }}_gaq.push(['_setDomainName', '{{ . }}']);{{/ this_config.domain_name }}
10
11
 
11
12
  (function() {
12
13
  var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
@@ -10,8 +10,20 @@ cdn:
10
10
  {{^ this_config.cdn.enable }}<script src="{{this_path}}/javascripts/prettify.js"></script>{{/ this_config.cdn.enable }}
11
11
  <script>
12
12
  var pres = document.getElementsByTagName("pre");
13
+ var is_gist_present = document.getElementsByClassName("gist"); is_gist_present = is_gist_present.length > 0;
14
+
13
15
  for (var i=0; i < pres.length; ++i) {
14
- pres[i].className = "prettyprint {{# this_config.linenums }}linenums{{/this_config.linenums}}";
16
+ var is_valid;
17
+ if(is_gist_present) {
18
+ is_valid = pres[i].getElementsByTagName("code");
19
+ is_valid = (is_valid.length > 0);
20
+ } else {
21
+ is_valid = true;
22
+ }
23
+
24
+ if(is_valid) {
25
+ pres[i].className = "prettyprint {{# this_config.linenums }}linenums{{/this_config.linenums}}";
26
+ }
15
27
  }
16
28
  prettyPrint();
17
29
  </script>
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruhoh
3
3
  version: !ruby/object:Gem::Version
4
- version: '2.4'
4
+ version: '2.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: 2013-09-10 00:00:00.000000000 Z
12
+ date: 2013-09-22 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rack
@@ -156,6 +156,7 @@ files:
156
156
  - features/config.feature
157
157
  - features/conversion.feature
158
158
  - features/data.feature
159
+ - features/date_format.feature
159
160
  - features/drafts.feature
160
161
  - features/ignore.feature
161
162
  - features/javascripts.feature
@@ -194,6 +195,7 @@ files:
194
195
  - lib/ruhoh/programs/compile.rb
195
196
  - lib/ruhoh/programs/preview.rb
196
197
  - lib/ruhoh/programs/watch.rb
198
+ - lib/ruhoh/publish/rsync.rb
197
199
  - lib/ruhoh/resources/dash/collection.rb
198
200
  - lib/ruhoh/resources/dash/model.rb
199
201
  - lib/ruhoh/resources/dash/model_view.rb
@@ -230,11 +232,15 @@ files:
230
232
  - lib/ruhoh/routes.rb
231
233
  - lib/ruhoh/string_format.rb
232
234
  - lib/ruhoh/summarizer.rb
235
+ - lib/ruhoh/time.rb
236
+ - lib/ruhoh/ui/page_not_found.html
237
+ - lib/ruhoh/ui/page_not_found.rb
233
238
  - lib/ruhoh/url_slug.rb
234
239
  - lib/ruhoh/utils.rb
235
240
  - lib/ruhoh/version.rb
236
241
  - lib/ruhoh/views/helpers/categories.rb
237
242
  - lib/ruhoh/views/helpers/paginator.rb
243
+ - lib/ruhoh/views/helpers/simple_proxy.rb
238
244
  - lib/ruhoh/views/helpers/tags.rb
239
245
  - lib/ruhoh/views/master_view.rb
240
246
  - lib/ruhoh/views/rmustache.rb
@@ -277,12 +283,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
277
283
  - - ! '>='
278
284
  - !ruby/object:Gem::Version
279
285
  version: '0'
286
+ segments:
287
+ - 0
288
+ hash: 4393455842480950745
280
289
  required_rubygems_version: !ruby/object:Gem::Requirement
281
290
  none: false
282
291
  requirements:
283
292
  - - ! '>='
284
293
  - !ruby/object:Gem::Version
285
294
  version: '0'
295
+ segments:
296
+ - 0
297
+ hash: 4393455842480950745
286
298
  requirements: []
287
299
  rubyforge_project:
288
300
  rubygems_version: 1.8.24