Adding functionality for fetching code from github

hack for 1.8.7

Don't miss test_markup's relative require

need some food now
This commit is contained in:
Henrik
2012-09-04 22:25:16 +02:00
committed by bootstraponline
parent 0cf0fad50e
commit 749b5a5ff8
8 changed files with 159 additions and 7 deletions
+1
View File
@@ -4,3 +4,4 @@ pkg
.bundle
Gemfile.lock
*.gem
*.swp
+21
View File
@@ -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
+46
View File
@@ -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
+16
View File
@@ -2,6 +2,7 @@ require 'digest/sha1'
require 'cgi'
require 'pygments'
require 'base64'
require File.expand_path( '../gitcode', __FILE__ )
# initialize Pygments
Pygments.start
@@ -50,6 +51,7 @@ module Gollum
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 @@ module Gollum
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
+9
View File
@@ -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
+52
View File
@@ -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
+4 -7
View File
@@ -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
+10
View File
@@ -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