Permalink
Browse files

Adding functionality for fetching code from github

hack for 1.8.7

Don't miss test_markup's relative require

need some food now
  • Loading branch information...
1 parent 0cf0fad commit 749b5a5ff85ee514e2d917b0cd7977f668b1e4dc @haf haf committed with bootstraponline Sep 4, 2012
Showing with 159 additions and 7 deletions.
  1. +1 −0 .gitignore
  2. +21 −0 README.md
  3. +46 −0 lib/gollum/gitcode.rb
  4. +16 −0 lib/gollum/markup.rb
  5. +9 −0 templates/helper_wiki.rb
  6. +52 −0 test/test_gitcode.rb
  7. +4 −7 test/test_markup.rb
  8. +10 −0 test/wiki_factory.rb
View
@@ -4,3 +4,4 @@ pkg
.bundle
Gemfile.lock
*.gem
+*.swp
View
@@ -334,6 +334,27 @@ then that whitespace will be ignored (this makes the blocks easier to read in pl
The block must end with three backticks indented at the same level than the opening
backticks.
+### GITHUB SYNTAX HIGHLIGHTING
+
+As an extra feature, you can syntax highlight a file from your repository, allowing
+you keep some of your sample code in the main repository. The code-snippet is
+updated when the wiki is rebuilt. You include github code like this:
+
+ ```html:github/gollum/master/test/file_view/1_file.txt```
+
+This will make the builder look at the **github user**, in the **gollum project**,
+in the **master branch**, at path **test/file_view/1_file.txt**. It will be
+rewritten to:
+
+ ```html
+ <ol class="tree">
+ <li class="file"><a href="0">0</a></li>
+ </ol>
+ ```
+
+Which will be parsed as HTML code during the Pygments run, and thereby coloured
+appropriately.
+
## MATHEMATICAL EQUATIONS
View
@@ -0,0 +1,46 @@
+require 'net/http'
+require 'uri'
+require 'open-uri'
+
+module Gollum
+ class Gitcode
+ def initialize path
+ raise(ArgumentError, 'path is nil or empty') if path.nil? or path.empty?
+ @uri = URI::HTTP.build({
+ :path => self.unchomp(path),
+ :host => 'raw.github.com',
+ :scheme => 'https',
+ :port => 443 })
+ end
+
+ def contents
+ @contents ||= self.req @uri
+ #req @uri
+ end
+
+ def unchomp p
+ p[0] == '/' ? p : ('/' + p)
+ end
+
+ def req uri, cut = 1
+ #puts uri.to_s
+ return "Too many redirects or retries" if cut >= 10
+ http = Net::HTTP.new uri.host, uri.port
+ http.use_ssl = true
+ resp = http.get uri.path, {
+ 'Accept' => 'text/plain',
+ 'Cache-Control' => 'no-cache',
+ 'Connection' => 'keep-alive',
+ 'Host' => uri.host,
+ 'User-Agent' => 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:15.0) Gecko/20100101 Firefox/15.0'
+ }
+ code = resp.code.to_i
+ return resp.body if code == 200
+ return "Not Found" if code == 404
+ return "Unhandled Response Code #{code}" unless code == 304 or not resp.header['location'].nil?
+ loc = URI.parse resp.header['location']
+ uri2 = loc.relative?() ? (uri + loc) : loc # overloads (+)
+ return req uri2, (cut + 1)
+ end
+ end
+end
View
@@ -2,6 +2,7 @@
require 'cgi'
require 'pygments'
require 'base64'
+require File.expand_path( '../gitcode', __FILE__ )
# initialize Pygments
Pygments.start
@@ -50,6 +51,7 @@ def render(no_follow = false, encoding = nil)
data = @data.dup
data = extract_metadata(data)
+ data = extract_gitcode(data)
data = extract_code(data)
data = extract_tex(data)
data = extract_wsd(data)
@@ -449,6 +451,20 @@ def find_page_from_name(cname)
end
end
+ #########################################################################
+ #
+ # Gitcode - fetch code from github search path and replace the contents
+ # to a code-block that gets run the next parse.
+ #
+ #########################################################################
+
+ def extract_gitcode data
+ data.gsub /^[ \t]*``` ?(\w+):(.+)```$/ do
+ gc = Gollum::Gitcode.new $2
+ "```#{$1}\n#{gc.contents}\n```"
+ end
+ end
+
#########################################################################
#
# Code
View
@@ -0,0 +1,9 @@
+class WikiFactory
+ def self.create p
+ path = testpath "examples/test.git"
+ Grit::Repo.init_bare(@path)
+ Gollum::Wiki.default_options = {:universal_toc => false}
+ cleanup = lambda { FileUtils.rm_r File.join(File.dirname(__FILE__), *%w[examples test.git]) }
+ Gollum::Wiki.new(@path), @path, cleanup
+ end
+end
View
@@ -0,0 +1,52 @@
+# ~*~ encoding: utf-8 ~*~
+require File.expand_path( '../helper', __FILE__ )
+require File.expand_path( '../wiki_factory', __FILE__ )
+
+context "gitcode" do
+
+ def page_with_content c
+ index = @wiki.repo.index
+ index.add 'Sample-Html.md', c
+ index.commit 'adding file html sample'
+
+ page = @wiki.page 'Sample Html'
+ page
+ end
+
+ setup do
+ # context
+ @wiki, @path, @cleanup = WikiFactory.create 'examples/test.git'
+
+ # given
+ p = page_with_content "a\n\n```html:github/gollum/master/test/file_view/1_file.txt```\n\nb"
+
+ # when rendering the page
+ @rendered = Gollum::Markup.new(p).render
+ end
+
+ test 'that the rendered output is correctly fetched and rendered as html code' do
+ assert_equal %Q{<p>a</p>
+
+<div class="highlight">
+<pre><span class="nt">&lt;ol</span> <span class="na">class=</span><span class="s">"tree"</span><span class="nt">&gt;</span>
+ <span class="nt">&lt;li</span> <span class="na">class=</span><span class="s">"file"</span><span class="nt">&gt;&lt;a</span> <span class="na">href=</span><span class="s">"0"</span><span class="nt">&gt;</span>0<span class="nt">&lt;/a&gt;&lt;/li&gt;</span>
+<span class="nt">&lt;/ol&gt;</span>
+</pre>
+</div>
+
+
+<p>b</p>}, @rendered
+ end
+
+ test 'contents' do
+ g = Gollum::Gitcode.new 'github/gollum/master/test/file_view/1_file.txt'
+
+ assert_equal g.contents, %{<ol class="tree">
+ <li class="file"><a href="0">0</a></li>
+</ol>}
+ end
+
+ teardown do
+ @cleanup.()
+ end
+end
View
@@ -1,17 +1,14 @@
# ~*~ encoding: utf-8 ~*~
-require File.expand_path(File.join(File.dirname(__FILE__), "helper"))
+require File.expand_path( "../helper", __FILE__ )
+require File.expand_path( "../wiki_factory", __FILE__ )
context "Markup" do
setup do
- @path = testpath("examples/test.git")
- FileUtils.rm_rf(@path)
- Grit::Repo.init_bare(@path)
- Gollum::Wiki.default_options = {:universal_toc => false}
- @wiki = Gollum::Wiki.new(@path)
+ @wiki, @path, @teardown = WikiFactory.create 'examples/test.git'
end
teardown do
- FileUtils.rm_r(File.join(File.dirname(__FILE__), *%w[examples test.git]))
+ @teardown.()
end
test "formats page from Wiki#pages" do
View
@@ -0,0 +1,10 @@
+class WikiFactory
+ def self.create p
+ path = testpath "examples/test.git"
+ Grit::Repo.init_bare(path)
+ Gollum::Wiki.default_options = {:universal_toc => false}
+ cleanup = lambda { FileUtils.rm_r File.join(File.dirname(__FILE__), *%w[examples test.git]) }
+ wiki = Gollum::Wiki.new(path)
+ return wiki, path, cleanup
+ end
+end

0 comments on commit 749b5a5

Please sign in to comment.