georgi-shinmun 0.4.1 → 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/README.md +23 -31
- data/assets/print.css +76 -0
- data/assets/styles.css +91 -0
- data/bin/shinmun +16 -8
- data/config.ru +16 -0
- data/lib/shinmun.rb +1 -4
- data/lib/shinmun/blog.rb +110 -100
- data/lib/shinmun/comment.rb +1 -1
- data/lib/shinmun/handlers.rb +19 -0
- data/lib/shinmun/helpers.rb +1 -1
- data/lib/shinmun/routes.rb +25 -36
- data/templates/404.rhtml +4 -0
- data/templates/_comment_form.rhtml +21 -0
- data/{test/templates → templates}/_comments.rhtml +0 -0
- data/{example/templates → templates}/archive.rhtml +0 -1
- data/{example/templates → templates}/category.rhtml +1 -2
- data/{example/templates → templates}/category.rxml +0 -0
- data/{example/templates → templates}/index.rhtml +0 -1
- data/{example/templates → templates}/index.rxml +0 -0
- data/templates/layout.rhtml +44 -0
- data/{example/templates → templates}/page.rhtml +0 -2
- data/{example/templates → templates}/post.rhtml +6 -21
- data/test/blog_spec.rb +48 -81
- metadata +17 -44
- data/example/Rakefile +0 -41
- data/example/assets/images/favicon.ico +0 -0
- data/example/assets/images/loading.gif +0 -0
- data/example/assets/javascripts/1-jquery.min.js +0 -32
- data/example/assets/javascripts/2-jquery-form.min.js +0 -5
- data/example/assets/javascripts/3-comments.js +0 -45
- data/example/assets/javascripts/4-coderay.js +0 -13
- data/example/assets/print.css +0 -76
- data/example/assets/stylesheets/1-reset.css +0 -23
- data/example/assets/stylesheets/2-typo.css +0 -40
- data/example/assets/stylesheets/3-table.css +0 -23
- data/example/assets/stylesheets/4-article.css +0 -15
- data/example/assets/stylesheets/5-comments.css +0 -20
- data/example/assets/stylesheets/6-diff.css +0 -25
- data/example/assets/stylesheets/7-blog.css +0 -33
- data/example/config.ru +0 -6
- data/example/config/blog.yml +0 -10
- data/example/pages/about.md +0 -7
- data/example/templates/_comment_form.rhtml +0 -90
- data/example/templates/_comments.rhtml +0 -11
- data/example/templates/_pagination.rhtml +0 -10
- data/example/templates/comments.rhtml +0 -1
- data/example/templates/layout.rhtml +0 -82
- data/lib/shinmun/aggregations/delicious.rb +0 -57
- data/lib/shinmun/aggregations/flickr.rb +0 -81
- data/lib/shinmun/post_handler.rb +0 -16
- data/test/templates/archive.rhtml +0 -6
- data/test/templates/category.rhtml +0 -6
- data/test/templates/category.rxml +0 -20
- data/test/templates/index.rhtml +0 -4
- data/test/templates/index.rxml +0 -21
- data/test/templates/layout.rhtml +0 -9
- data/test/templates/page.rhtml +0 -2
- data/test/templates/post.rhtml +0 -3
@@ -1,25 +0,0 @@
|
|
1
|
-
|
2
|
-
.diff {
|
3
|
-
margin: 1em 0;
|
4
|
-
font-family: monospace;
|
5
|
-
border: 1px solid #ddd;
|
6
|
-
background: #eee;
|
7
|
-
}
|
8
|
-
|
9
|
-
.diff .path {
|
10
|
-
color: blue;
|
11
|
-
padding: 1em;
|
12
|
-
border-bottom: 1px solid #ddd;
|
13
|
-
}
|
14
|
-
|
15
|
-
.diff .line {
|
16
|
-
padding-left: 1em;
|
17
|
-
}
|
18
|
-
|
19
|
-
.diff .added {
|
20
|
-
background: #dfd;
|
21
|
-
}
|
22
|
-
|
23
|
-
.diff .deleted {
|
24
|
-
background: #fdd;
|
25
|
-
}
|
@@ -1,33 +0,0 @@
|
|
1
|
-
body {
|
2
|
-
padding:1em;
|
3
|
-
}
|
4
|
-
|
5
|
-
.container {
|
6
|
-
width: 600px;
|
7
|
-
margin: 0 auto;
|
8
|
-
}
|
9
|
-
|
10
|
-
hr {
|
11
|
-
border: 0;
|
12
|
-
color: #ccc;
|
13
|
-
background-color: #ccc;
|
14
|
-
height: 1px;
|
15
|
-
margin-top: 2em;
|
16
|
-
margin-bottom: 2em;
|
17
|
-
}
|
18
|
-
|
19
|
-
blockquote {
|
20
|
-
border-top: 3px double #69c;
|
21
|
-
border-bottom: 3px double #69c;
|
22
|
-
padding: 5px;
|
23
|
-
font-style: oblique;
|
24
|
-
margin-left: 5%;
|
25
|
-
margin-right: 5%;
|
26
|
-
}
|
27
|
-
|
28
|
-
.pagination {
|
29
|
-
text-align: right;
|
30
|
-
margin-top: 1em;
|
31
|
-
font-weight: bold;
|
32
|
-
}
|
33
|
-
|
data/example/config.ru
DELETED
data/example/config/blog.yml
DELETED
data/example/pages/about.md
DELETED
@@ -1,90 +0,0 @@
|
|
1
|
-
<div class="comment-form">
|
2
|
-
|
3
|
-
<div class="loading" style="display:none">
|
4
|
-
<img src="/assets/images/loading.gif" />
|
5
|
-
Posting Comment...
|
6
|
-
</div>
|
7
|
-
|
8
|
-
<h4 class="preview-header" style="display:none">Comment Preview</h4>
|
9
|
-
|
10
|
-
<div class="preview">
|
11
|
-
</div>
|
12
|
-
|
13
|
-
<form>
|
14
|
-
<input type="hidden" name="path" value="<%= @post.path %>"/>
|
15
|
-
<p>
|
16
|
-
<label>Name</label><br/>
|
17
|
-
<input type="text" name="name" size="40"/>
|
18
|
-
</p>
|
19
|
-
<p>
|
20
|
-
<label>Website</label><br/>
|
21
|
-
<input type="text" name="website" size="40"/>
|
22
|
-
</p>
|
23
|
-
<p>
|
24
|
-
<label>Comment (Use Markdown for formatting) <a href="#markdown-help" onclick="$('#markdown-help').show(); return false">show help</a></label><br/>
|
25
|
-
<textarea name="text" cols="60" rows="10"></textarea>
|
26
|
-
</p>
|
27
|
-
<p>
|
28
|
-
<input type="submit" value="Post comment"/>
|
29
|
-
<input type="button" value="Preview comment" class="preview-button"/>
|
30
|
-
</p>
|
31
|
-
</form>
|
32
|
-
|
33
|
-
<a name="markdown-help"></a>
|
34
|
-
|
35
|
-
<div id="markdown-help" style="display:none; margin-top:2em">
|
36
|
-
<h2>Comment Formatting</h2>
|
37
|
-
|
38
|
-
<ul>
|
39
|
-
<li>Comments may be formatted with Markdown.</li>
|
40
|
-
<li>Syntax highlighting is available (see below).</li>
|
41
|
-
<li>Errors will be shown after your comment, so please check with preview.</li>
|
42
|
-
<li>HTML code is filtered out for security reasons.</li>
|
43
|
-
</ul>
|
44
|
-
|
45
|
-
<h4>Emphasis</h4>
|
46
|
-
<pre>_italic_ __bold__ or *italic* **bold**</pre>
|
47
|
-
|
48
|
-
<h4>Links</h4>
|
49
|
-
<pre>[Link text](http://example.com)</pre>
|
50
|
-
|
51
|
-
<h4>Lists</h4>
|
52
|
-
<pre>
|
53
|
-
1. Lines with beginning cardinal numbers will turn into ordered lists.
|
54
|
-
2. This is the second item.
|
55
|
-
|
56
|
-
* Lines with beginning stars will turn into unordered lists.
|
57
|
-
* This is the second item.
|
58
|
-
</pre>
|
59
|
-
|
60
|
-
<h4>Block quotes</h4>
|
61
|
-
<pre>
|
62
|
-
> Lines with beginning brackets will turn into block quotes.
|
63
|
-
> Block quotes may be nested. </pre>
|
64
|
-
|
65
|
-
<h4>Code blocks</h4>
|
66
|
-
Code blocks are indented with 4 spaces and surrounded by blank lines:
|
67
|
-
<pre>
|
68
|
-
|
69
|
-
$ git commit -m "added markdown help"
|
70
|
-
</pre>
|
71
|
-
|
72
|
-
<h4>Syntax highlighting</h4>
|
73
|
-
|
74
|
-
Following languages are supported:
|
75
|
-
<strong>c, diff, javascript, scheme, css, html, xml, java, json, rhtml, yaml, delphi</strong>.
|
76
|
-
|
77
|
-
You have to declare the language like this:
|
78
|
-
<pre>
|
79
|
-
|
80
|
-
@@ruby
|
81
|
-
|
82
|
-
def method_missing(id, *args, &block)
|
83
|
-
puts "#{id} was called with #{args.inspect}"
|
84
|
-
end
|
85
|
-
|
86
|
-
</pre>
|
87
|
-
|
88
|
-
</div>
|
89
|
-
|
90
|
-
</div>
|
@@ -1,11 +0,0 @@
|
|
1
|
-
<% for comment in @comments %>
|
2
|
-
<div class="comment">
|
3
|
-
<div class="top">
|
4
|
-
<%= comment.website.empty? ? comment.name : link_to(comment.name, comment.website) %> said
|
5
|
-
<%= distance_of_time_in_words(comment.time, Time.now, true) %> ago:
|
6
|
-
</div>
|
7
|
-
<div class="body">
|
8
|
-
<%= markdown(comment.text, :filter_html, :filter_styles) %>
|
9
|
-
</div>
|
10
|
-
</div>
|
11
|
-
<% end %>
|
@@ -1 +0,0 @@
|
|
1
|
-
<%= render '_comments.rhtml', :comments => @comments %>
|
@@ -1,82 +0,0 @@
|
|
1
|
-
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
2
|
-
<html xmlns="http://www.w3.org/1999/xhtml">
|
3
|
-
<head>
|
4
|
-
<title><%= @blog.title %></title>
|
5
|
-
<meta http-equiv="Content-Language" content="English" />
|
6
|
-
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
7
|
-
<link rel="shortcut icon" type="image/x-icon" href="/assets/images/favicon.ico">
|
8
|
-
<link rel="alternate" type="application/rss+xml" title="RSS" href="/index.rss" />
|
9
|
-
<link rel="stylesheet" media="screen" type="text/css" href="/assets/stylesheets.css" />
|
10
|
-
<link rel="stylesheet" media="print" type="text/css" href="/assets/print.css" />
|
11
|
-
</head>
|
12
|
-
<body>
|
13
|
-
<div class="container">
|
14
|
-
<h3><a href="/"><%= @blog.title %></a> - <%= @blog.description %></h3>
|
15
|
-
|
16
|
-
<span>
|
17
|
-
<%= link_to 'Home', '/' %> -
|
18
|
-
<%= link_to 'About', '/about' %> -
|
19
|
-
<%= link_to 'Subscribe RSS', '/index.rss' %>
|
20
|
-
</span>
|
21
|
-
|
22
|
-
<span style="margin-left:1em">
|
23
|
-
Categories:
|
24
|
-
<%= link_to 'Ruby', '/categories/ruby' %> -
|
25
|
-
<%= link_to 'Javascript', '/categories/javascript' %>
|
26
|
-
</span>
|
27
|
-
|
28
|
-
<% if session[:admin] %>
|
29
|
-
<hr/>
|
30
|
-
<div>
|
31
|
-
Admin:
|
32
|
-
<%= link_to 'Posts', '/admin/posts/' %> -
|
33
|
-
<%= link_to 'Pages', '/admin/pages' %> -
|
34
|
-
<%= link_to 'Commits', '/admin/commits' %>
|
35
|
-
<% if @post %> - <%= link_to 'Edit post', "/admin/edit/#{@post.path}" %><% end %>
|
36
|
-
</div>
|
37
|
-
<% end %>
|
38
|
-
|
39
|
-
<hr/>
|
40
|
-
|
41
|
-
<%= @content %>
|
42
|
-
|
43
|
-
<p>
|
44
|
-
Archive:
|
45
|
-
<% for year, month in @blog.archives %>
|
46
|
-
<%= archive_link year, month %>
|
47
|
-
<% end %>
|
48
|
-
</p>
|
49
|
-
|
50
|
-
<% if @blog.aggregations['flickr'] %>
|
51
|
-
|
52
|
-
<h4>Interesting Art @ Flickr</h4>
|
53
|
-
|
54
|
-
<p>
|
55
|
-
<% for pic in @blog.aggregations['flickr'].pics %>
|
56
|
-
<a href="<%= pic.link %>">
|
57
|
-
<img alt="<%= pic.title %>" src="<%= pic.thumbnail %>" width="45" height="45" />
|
58
|
-
</a>
|
59
|
-
<% end %>
|
60
|
-
</p>
|
61
|
-
|
62
|
-
<% end %>
|
63
|
-
|
64
|
-
<% if @blog.aggregations['delicious'] %>
|
65
|
-
|
66
|
-
<h4>Ruby @ Delicious</h4>
|
67
|
-
|
68
|
-
<ul>
|
69
|
-
<% for item in @blog.aggregations['delicious'].items %>
|
70
|
-
<li>
|
71
|
-
<%= link_to item.title, item.link %>
|
72
|
-
</li>
|
73
|
-
<% end %>
|
74
|
-
</ul>
|
75
|
-
|
76
|
-
<% end %>
|
77
|
-
|
78
|
-
<script type="text/javascript" src="/assets/javascripts.js"></script>
|
79
|
-
|
80
|
-
</div>
|
81
|
-
</body>
|
82
|
-
</html>
|
@@ -1,57 +0,0 @@
|
|
1
|
-
require 'open-uri'
|
2
|
-
require 'time'
|
3
|
-
require 'rexml/document'
|
4
|
-
|
5
|
-
class Delicious
|
6
|
-
include REXML
|
7
|
-
|
8
|
-
attr_accessor :url, :items, :link, :title, :days
|
9
|
-
|
10
|
-
# This object holds given information of an item
|
11
|
-
class DeliciousItem < Struct.new(:link, :title, :description, :description_link, :date)
|
12
|
-
def to_s; title end
|
13
|
-
end
|
14
|
-
|
15
|
-
# Pass the url to the RSS feed you would like to keep tabs on
|
16
|
-
# by default this will request the rss from the server right away and
|
17
|
-
# fill the items array
|
18
|
-
def initialize(url, refresh = true)
|
19
|
-
self.items = []
|
20
|
-
self.url = url
|
21
|
-
self.days = {}
|
22
|
-
self.refresh if refresh
|
23
|
-
end
|
24
|
-
|
25
|
-
# This method lets you refresh the items in the items array
|
26
|
-
# useful if you keep the object cached in memory and
|
27
|
-
def refresh
|
28
|
-
open(@url) do |http|
|
29
|
-
parse(http.read)
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
private
|
34
|
-
|
35
|
-
def parse(body)
|
36
|
-
|
37
|
-
xml = Document.new(body)
|
38
|
-
|
39
|
-
self.items = []
|
40
|
-
self.link = XPath.match(xml, "//channel/link/text()").first.value rescue ""
|
41
|
-
self.title = XPath.match(xml, "//channel/title/text()").first.value rescue ""
|
42
|
-
|
43
|
-
XPath.each(xml, "//item/") do |elem|
|
44
|
-
item = DeliciousItem.new
|
45
|
-
item.title = XPath.match(elem, "title/text()").first.value rescue ""
|
46
|
-
item.link = XPath.match(elem, "link/text()").first.value rescue ""
|
47
|
-
item.description = XPath.match(elem, "description/text()").first.value rescue ""
|
48
|
-
item.date = Time.mktime(*ParseDate.parsedate(XPath.match(elem, "dc:date/text()").first.value)) rescue Time.now
|
49
|
-
|
50
|
-
item.description_link = item.description
|
51
|
-
item.description.gsub!(/<\/?a\b.*?>/, "") # remove all <a> tags
|
52
|
-
items << item
|
53
|
-
end
|
54
|
-
|
55
|
-
self.items = items.sort_by { |item| item.date }.reverse
|
56
|
-
end
|
57
|
-
end
|
@@ -1,81 +0,0 @@
|
|
1
|
-
require 'open-uri'
|
2
|
-
require 'time'
|
3
|
-
require 'rexml/document'
|
4
|
-
|
5
|
-
# Example:
|
6
|
-
#
|
7
|
-
# flickr = Flickr.new('http://www.flickr.com/services/feeds/photos_public.gne?id=40235412@N00&format=rss_200')
|
8
|
-
# flickr.pics.each do |pic|
|
9
|
-
# puts "#{pic.title} @ #{pic.link} updated at #{pic.date}"
|
10
|
-
# end
|
11
|
-
#
|
12
|
-
class FlickrAggregation
|
13
|
-
include REXML
|
14
|
-
|
15
|
-
def choose(num)
|
16
|
-
return pics unless pics.size > num
|
17
|
-
bag = []
|
18
|
-
set = pics.dup
|
19
|
-
num.times {|x| bag << set.delete_at(rand(set.size))}
|
20
|
-
bag
|
21
|
-
end
|
22
|
-
|
23
|
-
attr_accessor :url, :pics, :link, :title, :description
|
24
|
-
|
25
|
-
# This object holds given information of a picture
|
26
|
-
class Picture
|
27
|
-
attr_accessor :link, :title, :date, :description, :thumbnail
|
28
|
-
|
29
|
-
def to_s
|
30
|
-
title
|
31
|
-
end
|
32
|
-
|
33
|
-
def date=(value)
|
34
|
-
@date = Time.parse(value)
|
35
|
-
end
|
36
|
-
|
37
|
-
end
|
38
|
-
|
39
|
-
# Pass the url to the RSS feed you would like to keep tabs on
|
40
|
-
# by default this will request the rss from the server right away and
|
41
|
-
# fill the tasks array
|
42
|
-
def initialize(url, refresh = true)
|
43
|
-
self.pics = []
|
44
|
-
self.url = url
|
45
|
-
self.refresh if refresh
|
46
|
-
end
|
47
|
-
|
48
|
-
# This method lets you refresh the tasks int the tasks array
|
49
|
-
# useful if you keep the object cached in memory and
|
50
|
-
def refresh
|
51
|
-
open(@url) do |http|
|
52
|
-
parse(http.read)
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
private
|
57
|
-
|
58
|
-
def parse(body)
|
59
|
-
|
60
|
-
xml = Document.new(body)
|
61
|
-
|
62
|
-
self.pics = []
|
63
|
-
self.link = XPath.match(xml, "//channel/link/text()").to_s
|
64
|
-
self.title = XPath.match(xml, "//channel/title/text()").to_s
|
65
|
-
self.description = XPath.match(xml, "//channel/description/text()").to_s
|
66
|
-
|
67
|
-
XPath.each(xml, "//item/") do |elem|
|
68
|
-
|
69
|
-
picture = Picture.new
|
70
|
-
picture.title = XPath.match(elem, "title/text()").to_s
|
71
|
-
picture.date = XPath.match(elem, "pubDate/text()").to_s
|
72
|
-
picture.link = XPath.match(elem, "link/text()").to_s
|
73
|
-
picture.description = XPath.match(elem, "description/text()").to_s
|
74
|
-
picture.thumbnail = XPath.match(elem, "media:thumbnail/@url").to_s
|
75
|
-
|
76
|
-
pics << picture
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
|
data/lib/shinmun/post_handler.rb
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
module Shinmun
|
2
|
-
|
3
|
-
class PostHandler
|
4
|
-
def read(path, data)
|
5
|
-
Post.new(:path => path, :src => data)
|
6
|
-
end
|
7
|
-
|
8
|
-
def write(path, post)
|
9
|
-
post.dump
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
end
|
14
|
-
|
15
|
-
GitStore::Handler['md'] = Shinmun::PostHandler.new
|
16
|
-
GitStore::Handler['html'] = Shinmun::PostHandler.new
|