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:
@@ -4,3 +4,4 @@ pkg
|
|||||||
.bundle
|
.bundle
|
||||||
Gemfile.lock
|
Gemfile.lock
|
||||||
*.gem
|
*.gem
|
||||||
|
*.swp
|
||||||
|
|||||||
@@ -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
|
The block must end with three backticks indented at the same level than the opening
|
||||||
backticks.
|
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
|
## MATHEMATICAL EQUATIONS
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -2,6 +2,7 @@ require 'digest/sha1'
|
|||||||
require 'cgi'
|
require 'cgi'
|
||||||
require 'pygments'
|
require 'pygments'
|
||||||
require 'base64'
|
require 'base64'
|
||||||
|
require File.expand_path( '../gitcode', __FILE__ )
|
||||||
|
|
||||||
# initialize Pygments
|
# initialize Pygments
|
||||||
Pygments.start
|
Pygments.start
|
||||||
@@ -50,6 +51,7 @@ module Gollum
|
|||||||
|
|
||||||
data = @data.dup
|
data = @data.dup
|
||||||
data = extract_metadata(data)
|
data = extract_metadata(data)
|
||||||
|
data = extract_gitcode(data)
|
||||||
data = extract_code(data)
|
data = extract_code(data)
|
||||||
data = extract_tex(data)
|
data = extract_tex(data)
|
||||||
data = extract_wsd(data)
|
data = extract_wsd(data)
|
||||||
@@ -449,6 +451,20 @@ module Gollum
|
|||||||
end
|
end
|
||||||
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
|
# Code
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -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"><ol</span> <span class="na">class=</span><span class="s">"tree"</span><span class="nt">></span>
|
||||||
|
<span class="nt"><li</span> <span class="na">class=</span><span class="s">"file"</span><span class="nt">><a</span> <span class="na">href=</span><span class="s">"0"</span><span class="nt">></span>0<span class="nt"></a></li></span>
|
||||||
|
<span class="nt"></ol></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
@@ -1,17 +1,14 @@
|
|||||||
# ~*~ encoding: utf-8 ~*~
|
# ~*~ 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
|
context "Markup" do
|
||||||
setup do
|
setup do
|
||||||
@path = testpath("examples/test.git")
|
@wiki, @path, @teardown = WikiFactory.create 'examples/test.git'
|
||||||
FileUtils.rm_rf(@path)
|
|
||||||
Grit::Repo.init_bare(@path)
|
|
||||||
Gollum::Wiki.default_options = {:universal_toc => false}
|
|
||||||
@wiki = Gollum::Wiki.new(@path)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
teardown do
|
teardown do
|
||||||
FileUtils.rm_r(File.join(File.dirname(__FILE__), *%w[examples test.git]))
|
@teardown.()
|
||||||
end
|
end
|
||||||
|
|
||||||
test "formats page from Wiki#pages" do
|
test "formats page from Wiki#pages" do
|
||||||
|
|||||||
@@ -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
|
||||||
Reference in New Issue
Block a user