Compare commits

...

111 Commits

Author SHA1 Message Date
bootstraponline 9057ec82d8 Release 2.4.2 2012-11-29 19:49:15 -07:00
bootstraponline 1b53e36666 Fix UTF-8 2012-11-29 16:58:47 -07:00
bootstraponline 10fa5c7bd2 Upgrade to stringex 1.5 2012-11-29 16:50:52 -07:00
bootstraponline 06e72a5a60 Release 2.4.1 2012-11-19 17:22:28 -07:00
bootstraponline 8fa62fc300 @css is set in before 2012-11-19 17:16:53 -07:00
bootstraponline 6c345fc508 Update dependencies 2012-11-19 17:14:52 -07:00
bootstraponline a34eac4ecb Merge pull request #592 from dekimsey/global-custom-css
Fixed custom.css to apply to all views
2012-11-19 16:11:53 -08:00
bootstraponline 10c121e603 Merge pull request #585 from dekimsey/gitcode-embed-any-file
Modified gitcode to allow syntax highlighting of arbitrary files
2012-11-19 16:11:21 -08:00
Daniel Kimsey 2b910167f4 Fixed custom.css to apply to all views 2012-11-19 13:21:39 -05:00
Daniel Kimsey 7d5311a075 Modified gitcode to allow syntax highlighting of arbitrary files 2012-11-19 12:59:45 -05:00
bootstraponline f5581c4b49 Merge pull request #589 from shanebdavis/master
Fix #96
2012-11-18 19:25:05 -08:00
Shane Brinkman-Davis e09f7cd49c Proposed fix for https://github.com/github/gollum/issues/96
(statically hosted content in the images/ folder returns 404s)
(the problem was all content in javascript, css, and images folders was hard-coded to return 404s)
2012-11-18 09:53:27 -08:00
bootstraponline 4dab03b61b Merge pull request #588 from sunnyone/fix_host_option
Pass the value of --host parameter to Rack::Server
2012-11-17 13:04:38 -08:00
Yoichi Imai 2b5e017aa1 Pass the value of --host parameter to Rack::Server 2012-11-17 19:42:28 +09:00
bootstraponline 8b3d944fd2 Fix #586
Place ASCIIDOC test behind ENV var
2012-11-16 19:08:45 -07:00
bootstraponline 2d886fd38a Fix tests #587 2012-11-16 18:13:38 -07:00
bootstraponline 80088832b9 Fix #587
The default behavior prevented linking to header anchors. id_prefix
can still be set to 'wiki-' however it is no longer the default.
2012-11-16 17:45:56 -07:00
bootstraponline be1883f317 Use HTTPS rubygems
Update gemspec
2012-11-16 17:07:38 -07:00
bootstraponline 30119e0c77 Fix tests 2012-11-16 17:03:18 -07:00
bootstraponline c90c3b1544 Support git code syntax in live preview
Add autocrlf values for Windows, Linux, and OS X.
2012-11-16 16:57:39 -07:00
bootstraponline 578386f083 Add dir support to write_page 2012-11-16 16:43:43 -07:00
bootstraponline 3d21ed362e Add history view test 2012-11-14 21:03:24 -07:00
bootstraponline 9cf469b035 Fix ruby bits #574 2012-11-14 00:45:28 -07:00
bootstraponline 462c93ae43 Fix crash #574 2012-11-13 23:12:22 -07:00
bootstraponline bda3b7b24d Fix --user-icons 2012-11-13 22:56:30 -07:00
bootstraponline d861a22cdd Fix line endings 2012-11-13 22:55:57 -07:00
bootstraponline 0de1a182da Validate user_icons 2012-11-13 22:48:37 -07:00
bootstraponline b030554348 Fix default 2012-11-13 22:43:05 -07:00
bootstraponline 858bfa9ccd Merge pull request #574 from dekimsey/local-gravatar-identicons
Extendable user-icons with optional identicon js library.
2012-11-13 21:42:15 -08:00
Daniel Kimsey ee8ec78da7 Add --user-icons option: none, gravatar, and identicon. 2012-11-13 21:17:23 -05:00
bootstraponline c8f684895c Merge pull request #581 from dekimsey/log-opt-author
Changed history date to use authored date instead.
2012-11-13 16:54:14 -08:00
bootstraponline 138a155ba4 Merge pull request #582 from dekimsey/set-focus-buttons
On window popup, focus the first text-field, if any.
2012-11-13 16:53:34 -08:00
Daniel Kimsey ad749bf345 On window popup, focus the first text-field, if any. 2012-11-13 17:25:36 -05:00
Daniel Kimsey ff0d59c16b Changed history date to use authored date instead. 2012-11-13 15:02:55 -05:00
bootstraponline df75d2d60c Release 2.4.0 2012-11-11 15:08:45 -07:00
bootstraponline 2713aabeaf Update gemspec 2012-11-11 15:08:21 -07:00
bootstraponline 796d1b44c2 Update README.md 2012-11-11 14:46:58 -07:00
bootstraponline 470a7b8f52 Fix #579 2012-11-11 14:40:47 -07:00
bootstraponline f699b82a9f Fix #539 2012-11-11 14:18:14 -07:00
bootstraponline 44edb8c7da Merge pull request #576 from roman-zaharenkov/title_control
Page title control
2012-11-11 12:29:37 -08:00
bootstraponline bc4fc0edd9 Fix gitcode test 2012-11-11 13:14:25 -07:00
Roman Zaharenkov 6545fa691b Adjust page header / title generation.
Now page header can be generated by first h1 header from page content. But page title generated by URL is it was before.
2012-11-11 13:22:10 +03:00
Roman Zaharenkov 4954553927 Page title control
Allow to set page title by setting header inside page body. It will use header as title If header is present and page URL otherwise.
2012-11-11 13:20:14 +03:00
bootstraponline 9c50ba9eeb XSLT was never used 2012-11-10 17:02:27 -07:00
bootstraponline 9a67da145a Merge pull request #578 from github/fileview-hover-fix
Fileview hover fix
2012-11-10 15:59:28 -08:00
bootstraponline ca7d82278c Pretty print with nokogiri 2012-11-10 16:34:37 -07:00
bootstraponline f6245c53dd Add .gitattributes 2012-11-10 12:15:20 -07:00
bootstraponline 6888420cc6 Update file_view output 2012-11-10 12:15:19 -07:00
Daniel Kimsey c5631f5b7d Fixed a:hover not highlighting the a block correctly 2012-11-10 12:15:19 -07:00
Daniel Kimsey 34e0b49d72 Refactored the template generator to use new_page method 2012-11-10 12:15:19 -07:00
Daniel Kimsey bd072264ef Line-ending fix for _styles.css 2012-11-10 12:15:19 -07:00
bootstraponline cfb2d24c71 Merge pull request #577 from dekimsey/fix-page-metadata
Renamed page.meta_data => page.metadata
2012-11-09 18:03:12 -08:00
Daniel Kimsey fe0eb72fa3 Renamed page.meta_data to page.metadata for consistency with views 2012-11-09 18:29:49 -05:00
Daniel Kimsey 2783257f06 Added page.meta_data to tests 2012-11-09 18:25:33 -05:00
bootstraponline cc11cb866c Add css note
#572
2012-11-08 18:51:57 -07:00
bootstraponline 6a02643bda Merge pull request #573 from dekimsey/license-guidelines
Added bootstraponline's comment about licensing guidelines
2012-11-08 16:12:40 -08:00
Daniel Kimsey 7f269c8da3 Added bootstraponline's comment about licensing guidelines 2012-11-08 16:46:49 -05:00
bootstraponline ef7f7cebd1 Release 2.3.12 2012-11-07 20:37:50 -07:00
bootstraponline 05c24fd5e3 Fix #570
Fix #571
2012-11-07 20:35:57 -07:00
bootstraponline b08b97bd28 Release 2.3.11 2012-11-07 20:18:43 -07:00
bootstraponline dbb6ce2f71 Fix #570
Error in gollum.js broke new page button.
2012-11-07 20:17:50 -07:00
bootstraponline f66f14b593 Release 2.3.10 2012-11-07 19:47:09 -07:00
bootstraponline 8a52315dee Add base url to custom css 2012-11-07 19:46:27 -07:00
bootstraponline 7c4052906c Add custom css 2012-11-07 19:40:52 -07:00
bootstraponline 3a56f39f6a Fix readme 2012-11-07 19:17:49 -07:00
bootstraponline 6585ca5dd0 Fix space 2012-11-07 19:13:57 -07:00
bootstraponline 792abae07e Release 2.3.9 2012-11-07 19:11:04 -07:00
bootstraponline 74ce648c59 Options.fetch 2012-11-07 19:04:36 -07:00
bootstraponline 2686e96046 Release 2.3.8 2012-11-07 18:50:37 -07:00
bootstraponline 213e2bb432 Add config example 2012-11-07 18:48:07 -07:00
bootstraponline 79bb5c10ab Remove lib.so note 2012-11-07 18:46:36 -07:00
bootstraponline 7ea012d786 Fix code style 2012-11-07 18:45:20 -07:00
bootstraponline 43591f75de Merge pull request #570 from dekimsey/only-alert-on-changes
Only alert on changes
2012-11-07 17:39:30 -08:00
Daniel Kimsey 05d82c0569 Attach unsaved changes warning to trigger only after changes are made 2012-11-07 17:51:36 -05:00
Daniel Kimsey 76c8d3206c Consolidated create and edit page's javascript into the global gollum.js 2012-11-07 17:50:12 -05:00
bootstraponline 00751d05b4 Release 2.3.7 2012-11-06 18:27:05 -07:00
bootstraponline b5be5df11a Fix test name 2012-11-06 18:26:49 -07:00
bootstraponline 7d159273fc Merge pull request #569 from dekimsey/issue-568
Fixed #568, triple tilde without language causes Gollum to crash
2012-11-06 17:11:08 -08:00
Daniel Kimsey 70127922ab Added test for #568 2012-11-06 15:49:47 -05:00
Daniel Kimsey b95df93775 Fixes #568, triple-tilde without language causes crash 2012-11-06 15:39:39 -05:00
bootstraponline dc06edcf5b Add x.y.z 2012-11-05 17:30:01 -07:00
bootstraponline fdc437dcd5 Release 2.3.6 2012-11-05 17:28:51 -07:00
bootstraponline f6873c9612 Merge pull request #566 from dekimsey/deterministic-search
Gollum search results now displayed in a deterministic order
2012-11-05 16:17:40 -08:00
Daniel Kimsey 93754ab32d Sort by filename in addition to count 2012-11-05 18:01:50 -05:00
Daniel Kimsey 5759334635 Gollum search results are displayed in a deterministic order 2012-11-05 17:02:19 -05:00
bootstraponline f2f543b72d Release 2.3.5 2012-10-31 20:14:15 -06:00
bootstraponline 598b052be3 Fix clean
Duplicate slashes must be removed everywhere.
2012-10-31 20:11:23 -06:00
bootstraponline a746062422 Merge pull request #564 from nikitug/patch-1
Update README to new Sequence diagram markup style
2012-10-31 19:09:45 -07:00
Nikita Afanasenko c8868d369f Update README to new Sequence diagram markup style 2012-10-31 18:02:28 +04:00
bootstraponline 52c6e7474c Release 2.3.4 2012-10-28 20:59:06 -06:00
bootstraponline be81f09b0e Update gemspec 2012-10-28 12:43:51 -06:00
bootstraponline 6fa4504e31 Fix #551 2012-10-28 12:37:02 -06:00
bootstraponline 992ba01a12 Fix page file dir 2012-10-28 11:57:25 -06:00
bootstraponline 72c5a74cf1 Update test
The test passes when verified manually using bin/gollum. Without a running server the test
will fail so it has been commented out. If there's an easy way to mock Rack::Server
then the test can be restored.
2012-10-27 23:44:11 -06:00
bootstraponline 919f41a0f1 Fix #559 2012-10-27 23:44:11 -06:00
bootstraponline 785921cb0f Fix toc generation 2012-10-27 21:46:30 -06:00
bootstraponline 8c8cda5e7d Fix comment 2012-10-27 21:05:56 -06:00
bootstraponline 64ef74e7e9 Add preview button to live preview 2012-10-27 20:52:54 -06:00
bootstraponline 776df4e6ee Fix nokogiri rendering
https://github.com/sparklemotion/nokogiri/issues/782
2012-10-27 19:52:26 -06:00
bootstraponline 68465a8651 Set indent and encoding 2012-10-27 18:12:32 -06:00
bootstraponline fa16c8960c Fix #560 2012-10-27 17:58:14 -06:00
bootstraponline 2c57915781 Refactor fileview 2012-10-23 23:27:31 -06:00
bootstraponline d0527f1aeb Release 2.3.3 2012-10-23 22:58:41 -06:00
bootstraponline 75083c5b56 Fix collapse tree 2012-10-23 22:36:17 -06:00
bootstraponline 82526594db Add attr reader for collapse tree 2012-10-23 22:22:56 -06:00
bootstraponline 941d39800c Merge pull request #556 from adiknoth/fileview
Documentation and usability enhancement of recent fileview fix
2012-10-23 21:20:28 -07:00
bootstraponline a1ae2e8bc0 Fix #554 2012-10-23 22:14:45 -06:00
bootstraponline 4af6f366ca Fix show_all /pages 2012-10-23 22:09:27 -06:00
Adrian Knoth c7a9534ed9 Add --collapse-tree command line option 2012-10-23 14:27:15 +02:00
Adrian Knoth 00bcbbf72b File View: Add option to collapse file trees.
For potentially large repositories, starting with a collapsed tree may
be beneficial.
2012-10-23 14:27:12 +02:00
Adrian Knoth ed2254ff9f Add missing documentation for --show-all 2012-10-23 14:22:54 +02:00
71 changed files with 1234 additions and 518 deletions
+32
View File
@@ -0,0 +1,32 @@
# https://help.github.com/articles/dealing-with-line-endings
#
# For Mac & Linux
# git config --global core.autocrlf input
#
# For windows
# git config --global core.autocrlf true
#
# Set default behaviour, in case users don't have core.autocrlf set.
* text=auto
# Explicitly declare text files we want to always be normalized and converted
# to native line endings on checkout.
*.txt text
*.md text
*.rb text
*.js text
*.html text
*.yml text
*.mustache text
*.css text
Rakefile text
Gemfile text
LICENSE text
COPYRIGHT text
gollum text
.gitattributes text
.gitignore text
# Denote all files that are truly binary and should not be modified.
*.png binary
*.jpg binary
+2 -1
View File
@@ -5,4 +5,5 @@ notifications:
disabled: true disabled: true
before_install: before_install:
- sudo apt-get update - sudo apt-get update
- sudo apt-get install -y --force-yes asciidoc - sudo apt-get install -y --force-yes asciidoc
- ASCIIDOC=1; export ASCIIDOC
+2 -2
View File
@@ -1,4 +1,4 @@
source 'http://rubygems.org' source 'https://rubygems.org'
gemspec gemspec
gem 'rake', '~> 0.9' gem 'rake', '~> 10.0.2'
+20 -4
View File
@@ -136,7 +136,13 @@ or JavaScript. These tags will be stripped from the converted HTML. See
`docs/sanitization.md` for more details on what tags and attributes are `docs/sanitization.md` for more details on what tags and attributes are
allowed. allowed.
## TITLES
The first defined `h1` will override the default header on a page. There are two ways to set a page title. The metadata syntax:
`<!-- --- title: New Title -->`
The first `h1` tag can be set to always override the page title, without needing to use the metadata syntax. Start gollum with the `--h1-title` flag.
## BRACKET TAGS ## BRACKET TAGS
A variety of Gollum tags use a double bracket syntax. For example: A variety of Gollum tags use a double bracket syntax. For example:
@@ -381,10 +387,10 @@ You may imbed sequence diagrams into your wiki page (rendered by
[WebSequenceDiagrams](http://www.websequencediagrams.com) by using the [WebSequenceDiagrams](http://www.websequencediagrams.com) by using the
following syntax: following syntax:
{{{ blue-modern {{{{{{ blue-modern
alice->bob: Test alice->bob: Test
bob->alice: Test response bob->alice: Test response
}}} }}}}}}
You can replace the string "blue-modern" with any supported style. You can replace the string "blue-modern" with any supported style.
@@ -532,9 +538,17 @@ Your Rack middleware can pass author details to Gollum in a Hash in the session
## WINDOWS FILENAME VALIDATION ## WINDOWS FILENAME VALIDATION
Note that filenames on windows must not contain any of the following characters `\ / : * ? " < > |`. See [this support article](http://support.microsoft.com/kb/177506) for details. Note that filenames on windows must not contain any of the following characters `\ / : * ? " < > |`. See [this support article](http://support.microsoft.com/kb/177506) for details.
## LIB.SO ERROR ## CONFIG FILE
`Could not open library 'lib.so'` may be solved by installing `python-devel` on Fedora or `python-dev` on Ubuntu. Gentoo requires a rubypython [patch](https://gist.github.com/2802480) to use python2.7. Gollum optionally takes a `--config file`. See [config.rb](https://github.com/github/gollum/blob/master/config.rb) for an example.
## CUSTOM CSS
The `--css` flag will inject `custom.css` from the root of your git repository into each page. `custom.css` must be commited to git or you will get a 302 redirect to the create page. Here's an example of floating the sidebar to the left.
```css
#wiki-rightbar { float: left !important; }
```
## CONTRIBUTE ## CONTRIBUTE
@@ -556,6 +570,8 @@ your changes merged back into core is as follows:
1. Send a pull request to the github/gollum project. 1. Send a pull request to the github/gollum project.
## RELEASING ## RELEASING
x.y.z
For z releases: For z releases:
$ rake bump $ rake bump
$ rake release $ rake release
+1 -1
View File
@@ -146,7 +146,7 @@ task :gemspec => :validate do
split("\n"). split("\n").
sort. sort.
reject { |file| file =~ /^\./ }. reject { |file| file =~ /^\./ }.
reject { |file| file =~ /^(rdoc|pkg|test|Home\.md)/ }. reject { |file| file =~ /^(rdoc|pkg|test|Home\.md|\.gitattributes)/ }.
map { |file| " #{file}" }. map { |file| " #{file}" }.
join("\n") join("\n")
+16 -1
View File
@@ -45,6 +45,10 @@ opts = OptionParser.new do |opts|
options['irb'] = true options['irb'] = true
end end
opts.on("--css", "Inject custom css. Uses custom.css from root repository") do
wiki_options[:css] = true
end
opts.on("--page-file-dir [PATH]", "Specify the sub directory for all page files (default: repository root).") do |path| opts.on("--page-file-dir [PATH]", "Specify the sub directory for all page files (default: repository root).") do |path|
wiki_options[:page_file_dir] = path wiki_options[:page_file_dir] = path
end end
@@ -69,9 +73,20 @@ opts = OptionParser.new do |opts|
wiki_options[:mathjax] = true wiki_options[:mathjax] = true
end end
opts.on("--user-icons [SOURCE]", "Set the history user icons. Valid values: gravatar, identicon, none. Default: none.") do |source|
wiki_options[:user_icons] = source
end
opts.on("--show-all", "Shows all files in file view. By default only valid pages are shown.") do opts.on("--show-all", "Shows all files in file view. By default only valid pages are shown.") do
wiki_options[:show_all] = true wiki_options[:show_all] = true
end end
opts.on("--collapse-tree", "Collapse file view tree. By default, expanded tree is shown.") do
wiki_options[:collapse_tree] = true
end
opts.on("--h1-title", "Sets page title to value of first h1") do
wiki_options[:h1_title] = true
end
end end
# Read command line options into `options` hash # Read command line options into `options` hash
@@ -170,6 +185,6 @@ else
end end
end end
# Rack::Handler does not work with Ctrl + C. Use Rack::Server instead. # Rack::Handler does not work with Ctrl + C. Use Rack::Server instead.
Rack::Server.new(:app => MapGollum.new(base_path), :Port => options['port']).start Rack::Server.new(:app => MapGollum.new(base_path), :Port => options['port'], :Host => options['bind']).start
end end
end end
+28
View File
@@ -0,0 +1,28 @@
# Example gollum config
# gollum ../wiki --config config.rb
#
# or run from source with
#
# bundle exec bin/gollum ../wiki/ --config config.rb
# Remove const to avoid
# warning: already initialized constant FORMAT_NAMES
#
# only remove if it's defined.
# constant Gollum::Page::FORMAT_NAMES not defined (NameError)
Gollum::Page.send :remove_const, :FORMAT_NAMES if defined? Gollum::Page::FORMAT_NAMES
# limit to one format
Gollum::Page::FORMAT_NAMES = { :markdown => "Markdown" }
=begin
Valid formats are:
{ :markdown => "Markdown",
:textile => "Textile",
:rdoc => "RDoc",
:org => "Org-mode",
:creole => "Creole",
:rest => "reStructuredText",
:asciidoc => "AsciiDoc",
:mediawiki => "MediaWiki",
:pod => "Pod" }
=end
+18 -8
View File
@@ -5,8 +5,8 @@ Gem::Specification.new do |s|
s.required_ruby_version = ">= 1.8.7" s.required_ruby_version = ">= 1.8.7"
s.name = 'gollum' s.name = 'gollum'
s.version = '2.3.2' s.version = '2.4.2'
s.date = '2012-10-22' s.date = '2012-11-29'
s.rubyforge_project = 'gollum' s.rubyforge_project = 'gollum'
s.summary = "A simple, Git-powered wiki." s.summary = "A simple, Git-powered wiki."
@@ -25,22 +25,25 @@ Gem::Specification.new do |s|
s.add_dependency('grit', '~> 2.5.0') s.add_dependency('grit', '~> 2.5.0')
s.add_dependency('github-markup', ['>= 0.7.4', '< 1.0.0']) s.add_dependency('github-markup', ['>= 0.7.4', '< 1.0.0'])
s.add_dependency('github-markdown', '~> 0.5.1') s.add_dependency('github-markdown', '~> 0.5.3')
s.add_dependency('pygments.rb', '~> 0.3.2') s.add_dependency('pygments.rb', '~> 0.3.2')
s.add_dependency('sinatra', '~> 1.3.3') s.add_dependency('sinatra', '~> 1.3.3')
s.add_dependency('mustache', ['>= 0.99.4', '< 1.0.0']) s.add_dependency('mustache', ['>= 0.99.4', '< 1.0.0'])
s.add_dependency('sanitize', '~> 2.0.3') s.add_dependency('sanitize', '~> 2.0.3')
s.add_dependency('nokogiri', '~> 1.5.5') s.add_dependency('nokogiri', '~> 1.5.5')
s.add_dependency('useragent', '~> 0.4.12') s.add_dependency('useragent', '~> 0.4.13')
s.add_dependency('stringex', '~> 1.4.0') s.add_dependency('stringex', '~> 1.5.0')
s.add_development_dependency('RedCloth', '~> 4.2.9') s.add_development_dependency('RedCloth', '~> 4.2.9')
s.add_development_dependency('mocha', '~> 0.12.7') s.add_development_dependency('mocha', '~> 0.13.0')
s.add_development_dependency('org-ruby', '~> 0.7.2') s.add_development_dependency('org-ruby', '~> 0.7.2')
s.add_development_dependency('shoulda', '~> 3.3.1') s.add_development_dependency('shoulda', '~> 3.3.2')
s.add_development_dependency('rack-test', '~> 0.6.2') s.add_development_dependency('rack-test', '~> 0.6.2')
s.add_development_dependency('wikicloth', '~> 0.8.0') s.add_development_dependency('wikicloth', '~> 0.8.0')
s.add_development_dependency('rake', '~> 0.9') s.add_development_dependency('rake', '~> 10.0.2')
s.add_development_dependency('pry', '~> 0.9.10')
# required by pry
s.add_development_dependency('rb-readline', '~> 0.4.2')
# = MANIFEST = # = MANIFEST =
s.files = %w[ s.files = %w[
@@ -50,6 +53,7 @@ Gem::Specification.new do |s|
README.md README.md
Rakefile Rakefile
bin/gollum bin/gollum
config.rb
docs/sanitization.md docs/sanitization.md
gollum.gemspec gollum.gemspec
lib/gollum.rb lib/gollum.rb
@@ -71,6 +75,7 @@ Gem::Specification.new do |s|
lib/gollum/frontend/public/gollum/images/fileview/toggle-small-expand.png lib/gollum/frontend/public/gollum/images/fileview/toggle-small-expand.png
lib/gollum/frontend/public/gollum/images/fileview/toggle-small.png lib/gollum/frontend/public/gollum/images/fileview/toggle-small.png
lib/gollum/frontend/public/gollum/images/icon-sprite.png lib/gollum/frontend/public/gollum/images/icon-sprite.png
lib/gollum/frontend/public/gollum/images/man_24.png
lib/gollum/frontend/public/gollum/images/para.png lib/gollum/frontend/public/gollum/images/para.png
lib/gollum/frontend/public/gollum/images/pin-16.png lib/gollum/frontend/public/gollum/images/pin-16.png
lib/gollum/frontend/public/gollum/images/pin-20.png lib/gollum/frontend/public/gollum/images/pin-20.png
@@ -87,11 +92,13 @@ Gem::Specification.new do |s|
lib/gollum/frontend/public/gollum/javascript/gollum.dialog.js lib/gollum/frontend/public/gollum/javascript/gollum.dialog.js
lib/gollum/frontend/public/gollum/javascript/gollum.js lib/gollum/frontend/public/gollum/javascript/gollum.js
lib/gollum/frontend/public/gollum/javascript/gollum.placeholder.js lib/gollum/frontend/public/gollum/javascript/gollum.placeholder.js
lib/gollum/frontend/public/gollum/javascript/identicon_canvas.js
lib/gollum/frontend/public/gollum/javascript/jquery-1.7.2.min.js lib/gollum/frontend/public/gollum/javascript/jquery-1.7.2.min.js
lib/gollum/frontend/public/gollum/javascript/jquery.color.js lib/gollum/frontend/public/gollum/javascript/jquery.color.js
lib/gollum/frontend/public/gollum/javascript/mousetrap.min.js lib/gollum/frontend/public/gollum/javascript/mousetrap.min.js
lib/gollum/frontend/public/gollum/livepreview/css/custom.css lib/gollum/frontend/public/gollum/livepreview/css/custom.css
lib/gollum/frontend/public/gollum/livepreview/images/cancel_24.png lib/gollum/frontend/public/gollum/livepreview/images/cancel_24.png
lib/gollum/frontend/public/gollum/livepreview/images/globe_24.png
lib/gollum/frontend/public/gollum/livepreview/images/lr_24.png lib/gollum/frontend/public/gollum/livepreview/images/lr_24.png
lib/gollum/frontend/public/gollum/livepreview/images/save_24.png lib/gollum/frontend/public/gollum/livepreview/images/save_24.png
lib/gollum/frontend/public/gollum/livepreview/images/savecomment_24.png lib/gollum/frontend/public/gollum/livepreview/images/savecomment_24.png
@@ -433,6 +440,9 @@ Gem::Specification.new do |s|
lib/gollum/frontend/templates/error.mustache lib/gollum/frontend/templates/error.mustache
lib/gollum/frontend/templates/file_view.mustache lib/gollum/frontend/templates/file_view.mustache
lib/gollum/frontend/templates/history.mustache lib/gollum/frontend/templates/history.mustache
lib/gollum/frontend/templates/history_authors/gravatar.mustache
lib/gollum/frontend/templates/history_authors/identicon.mustache
lib/gollum/frontend/templates/history_authors/none.mustache
lib/gollum/frontend/templates/layout.mustache lib/gollum/frontend/templates/layout.mustache
lib/gollum/frontend/templates/page.mustache lib/gollum/frontend/templates/page.mustache
lib/gollum/frontend/templates/pages.mustache lib/gollum/frontend/templates/pages.mustache
+6 -1
View File
@@ -1,5 +1,7 @@
# ~*~ encoding: utf-8 ~*~
# stdlib # stdlib
require 'digest/md5' require 'digest/md5'
require 'digest/sha1'
require 'ostruct' require 'ostruct'
# external # external
@@ -21,8 +23,11 @@ require File.expand_path('../gollum/sanitization', __FILE__)
require File.expand_path('../gollum/web_sequence_diagram', __FILE__) require File.expand_path('../gollum/web_sequence_diagram', __FILE__)
require File.expand_path('../gollum/frontend/uri_encode_component', __FILE__) require File.expand_path('../gollum/frontend/uri_encode_component', __FILE__)
# Set ruby to UTF-8 mode
$KCODE = 'U'
module Gollum module Gollum
VERSION = '2.3.2' VERSION = '2.4.2'
def self.assets_path def self.assets_path
::File.expand_path('gollum/frontend/public', ::File.dirname(__FILE__)) ::File.expand_path('gollum/frontend/public', ::File.dirname(__FILE__))
+1
View File
@@ -1,3 +1,4 @@
# ~*~ encoding: utf-8 ~*~
module Gollum module Gollum
class BlobEntry class BlobEntry
# Gets the String SHA for this blob. # Gets the String SHA for this blob.
+1
View File
@@ -1,3 +1,4 @@
# ~*~ encoding: utf-8 ~*~
module Gollum module Gollum
# Responsible for handling the commit process for a Wiki. It sets up the # Responsible for handling the commit process for a Wiki. It sets up the
# Git index, provides methods for modifying the tree, and stores callbacks # Git index, provides methods for modifying the tree, and stores callbacks
+3 -6
View File
@@ -1,3 +1,4 @@
# ~*~ encoding: utf-8 ~*~
module Gollum module Gollum
class File class File
Wiki.file_class = self Wiki.file_class = self
@@ -17,12 +18,8 @@ module Gollum
# #
# Returns the String url_path # Returns the String url_path
def url_path def url_path
path = if self.path.include?('/') path = self.path
self.path.sub(/\/[^\/]+$/, '/') path = path.sub(/\/[^\/]+$/, '/') if path.include?('/')
else
''
end
path path
end end
+9 -12
View File
@@ -1,3 +1,4 @@
# ~*~ encoding: utf-8 ~*~
module Gollum module Gollum
=begin =begin
FileView requires that: FileView requires that:
@@ -8,9 +9,10 @@ module Gollum
# common use cases: # common use cases:
# set pages to wiki.pages and show_all to false # set pages to wiki.pages and show_all to false
# set pages to wiki.pages + wiki.files and show_all to true # set pages to wiki.pages + wiki.files and show_all to true
def initialize pages, show_all = false def initialize pages, options = {}
@pages = pages @pages = pages
@show_all = show_all @show_all = options[:show_all] || false
@checked = options[:collapse_tree] ? '' : "checked"
end end
def enclose_tree string def enclose_tree string
@@ -20,7 +22,7 @@ module Gollum
def new_page page def new_page page
name = page.name name = page.name
url = url_for_page page url = url_for_page page
%Q( <li class="file"><a href="#{url}">#{name}</a></li>\n) %Q( <li class="file"><a href="#{url}"><span class="icon"></span>#{name}</a></li>)
end end
def new_folder folder_path def new_folder folder_path
@@ -30,16 +32,13 @@ module Gollum
def new_sub_folder path def new_sub_folder path
<<-HTML <<-HTML
<li> <li>
<label>#{path}</label> <input type="checkbox" checked /> <label>#{path}</label> <input type="checkbox" #{@checked} />
<ol> <ol>
HTML HTML
end end
def end_folder def end_folder
<<-HTML "</ol></li>\n"
</ol>
</li>
HTML
end end
def url_for_page page def url_for_page page
@@ -83,13 +82,11 @@ module Gollum
# Handle special case of only one folder. # Handle special case of only one folder.
if (count - folder_start == 1) if (count - folder_start == 1)
page = @pages[ folder_start ] page = @pages[ folder_start ]
name = page.name
url = url_for_page page
html += <<-HTML html += <<-HTML
<li> <li>
<label>#{::File.dirname(page.path)}</label> <input type="checkbox" checked /> <label>#{::File.dirname(page.path)}</label> <input type="checkbox" #{@checked} />
<ol> <ol>
<li class="file"><a href="#{url}">#{name}</a></li> #{new_page page}
</ol> </ol>
</li> </li>
HTML HTML
+28 -28
View File
@@ -1,3 +1,4 @@
# ~*~ encoding: utf-8 ~*~
require 'cgi' require 'cgi'
require 'sinatra' require 'sinatra'
require 'gollum' require 'gollum'
@@ -17,8 +18,7 @@ class String
# _Header => header which causes errors # _Header => header which causes errors
def to_url def to_url
return nil if self.nil? return nil if self.nil?
return self if ['_Header', '_Footer', '_Sidebar'].include? self upstream_to_url :exclude => ['_Header', '_Footer', '_Sidebar']
upstream_to_url
end end
end end
@@ -82,11 +82,13 @@ module Precious
before do before do
@base_url = url('/', false).chomp('/') @base_url = url('/', false).chomp('/')
settings.wiki_options.merge!({ :base_path => @base_url }) unless settings.wiki_options.has_key? :base_path # above will detect base_path when it's used with map in a config.ru
settings.wiki_options.merge!({ :base_path => @base_url })
@css = settings.wiki_options[:css]
end end
get '/' do get '/' do
redirect File.join(settings.wiki_options[:page_file_dir].to_s,settings.wiki_options[:base_path].to_s, 'Home') redirect ::File.join(@base_url, 'Home')
end end
# path is set to name if path is nil. # path is set to name if path is nil.
@@ -187,24 +189,18 @@ module Precious
post '/create' do post '/create' do
name = params[:page].to_url name = params[:page].to_url
path = sanitize_empty_params(params[:path]) path = sanitize_empty_params(params[:path]) || ''
path = '' if path.nil?
format = params[:format].intern format = params[:format].intern
page_dir = File.join(settings.wiki_options[:page_file_dir].to_s, # ensure pages are created in page_file_dir
settings.wiki_options[:base_path].to_s) page_dir = settings.wiki_options[:page_file_dir].to_s
# Home is a special case. path = clean_url(::File.join(page_dir, path)) unless path.start_with?(page_dir)
path = '' if name.downcase == 'home'
page_dir = File.join(page_dir, path) wiki = wiki_new
# write_page is not directory aware so use wiki_options to emulate dir support.
wiki_options = settings.wiki_options.merge({ :page_file_dir => page_dir })
wiki = Gollum::Wiki.new(settings.gollum_path, wiki_options)
begin begin
wiki.write_page(name, format, params[:content], commit_message) wiki.write_page(name, format, params[:content], commit_message, path)
redirect to("/#{clean_url(CGI.escape(::File.join(page_dir,name)))}") redirect to("/#{clean_url(::File.join(path,name))}")
rescue Gollum::DuplicatePageError => e rescue Gollum::DuplicatePageError => e
@message = "Duplicate page: #{e.message}" @message = "Duplicate page: #{e.message}"
mustache :error mustache :error
@@ -240,6 +236,7 @@ module Precious
@content = @page.formatted_data @content = @page.formatted_data
@toc_content = wiki.universal_toc ? @page.toc_data : nil @toc_content = wiki.universal_toc ? @page.toc_data : nil
@mathjax = wiki.mathjax @mathjax = wiki.mathjax
@h1_title = wiki.h1_title
@editable = false @editable = false
mustache :page mustache :page
end end
@@ -284,10 +281,6 @@ module Precious
mustache :compare mustache :compare
end end
get %r{^/(javascript|css|images)} do
halt 404
end
get %r{/(.+?)/([0-9a-f]{40})} do get %r{/(.+?)/([0-9a-f]{40})} do
file_path = params[:captures][0] file_path = params[:captures][0]
version = params[:captures][1] version = params[:captures][1]
@@ -308,7 +301,8 @@ module Precious
get '/search' do get '/search' do
@query = params[:q] @query = params[:q]
wiki = wiki_new wiki = wiki_new
@results = wiki.search @query # Sort wiki search results by count (desc) and then by name (asc)
@results = wiki.search(@query).sort{ |a, b| (a[:count] <=> b[:count]).nonzero? || b[:name] <=> a[:name] }.reverse
@name = @query @name = @query
mustache :search mustache :search
end end
@@ -329,11 +323,15 @@ module Precious
end end
get '/fileview' do get '/fileview' do
wiki = Gollum::Wiki.new(settings.gollum_path, settings.wiki_options) wiki = wiki_new
show_all = settings.wiki_options[:show_all] options = settings.wiki_options
content = wiki.pages
# if showing all files include wiki.files # if showing all files include wiki.files
@results = show_all ? Gollum::FileView.new(wiki.pages + wiki.files, show_all).render_files : content += wiki.files if options[:show_all]
Gollum::FileView.new(wiki.pages).render_files
# must pass wiki_options to FileView
# --show-all and --collapse-tree can be set.
@results = Gollum::FileView.new(content, options).render_files
@ref = wiki.ref @ref = wiki.ref
mustache :file_view, { :layout => false } mustache :file_view, { :layout => false }
end end
@@ -344,10 +342,11 @@ module Precious
def show_page_or_file(fullpath) def show_page_or_file(fullpath)
name = extract_name(fullpath) name = extract_name(fullpath)
path = extract_path(fullpath) path = extract_path(fullpath) || '/'
wiki = wiki_new wiki = wiki_new
path = '/' if path.nil? page_dir = settings.wiki_options[:page_file_dir].to_s
path = ::File.join(page_dir, path) unless path.start_with?(page_dir)
if page = wiki.paged(name, path, exact = true) if page = wiki.paged(name, path, exact = true)
@page = page @page = page
@@ -356,6 +355,7 @@ module Precious
@content = page.formatted_data @content = page.formatted_data
@toc_content = wiki.universal_toc ? @page.toc_data : nil @toc_content = wiki.universal_toc ? @page.toc_data : nil
@mathjax = wiki.mathjax @mathjax = wiki.mathjax
@h1_title = wiki.h1_title
mustache :page mustache :page
elsif file = wiki.file(fullpath) elsif file = wiki.file(fullpath)
content_type file.mime_type content_type file.mime_type
+3 -1
View File
@@ -1,3 +1,4 @@
# ~*~ encoding: utf-8 ~*~
module Precious module Precious
module Helpers module Helpers
# Extract the path string that Gollum::Wiki expects # Extract the path string that Gollum::Wiki expects
@@ -19,9 +20,10 @@ module Precious
end end
# Remove all slashes from the start of string. # Remove all slashes from the start of string.
# Remove all double slashes
def clean_url url def clean_url url
return url if url.nil? return url if url.nil?
url.gsub('%2F','/').gsub(/^\/+/,'') url.gsub('%2F','/').gsub(/^\/+/,'').gsub('//','/')
end end
def trim_leading_slash url def trim_leading_slash url
+128 -121
View File
@@ -1,121 +1,128 @@
*, html { *, html {
font-family: Verdana, Arial, Helvetica, sans-serif; font-family: Verdana, Arial, Helvetica, sans-serif;
} }
#results a:hover { #results a:hover {
background-color: #4c4c4c; background-color: #4c4c4c;
} }
#home_button { #home_button {
position: absolute; position: absolute;
top: 10px; top: 10px;
left: 50%; left: 50%;
} }
#home_button .minibutton { #home_button .minibutton {
font-size: 1em; font-size: 1em;
text-align: center; text-align: center;
} }
#results { #results {
position: absolute; position: absolute;
top: 60px; top: 60px;
left: 10px; left: 10px;
} }
body, form, ul, li, p, h1, h2, h3, h4, h5 { body, form, ul, li, p, h1, h2, h3, h4, h5 {
margin: 0; margin: 0;
padding: 0; padding: 0;
} }
body { body {
background-color: #606061; background-color: #606061;
color: #ffffff; color: #ffffff;
margin: 0; margin: 0;
} }
img { img {
border: none; border: none;
} }
p { p {
font-size: 1em; font-size: 1em;
margin: 0 0 1em 0; margin: 0 0 1em 0;
} }
html { font-size: 100%; /* IE hack */ } html { font-size: 100%; /* IE hack */ }
body { font-size: 1em; /* Sets base font size to 16px */ } body { font-size: 1em; /* Sets base font size to 16px */ }
table { font-size: 100%; /* IE hack */ } table { font-size: 100%; /* IE hack */ }
input, select, textarea, th, td { font-size: 1em; } input, select, textarea, th, td { font-size: 1em; }
/* Prevent wrapping on large file names. */ /* Prevent wrapping on large file names. */
li.file { li.file {
white-space: nowrap; white-space: nowrap;
} }
/* CSS Tree menu styles */ /* CSS Tree menu styles */
ol.tree ol.tree
{ {
padding: 0 0 0 30px; padding: 0 0 0 30px;
width: 300px; width: 300px;
} }
li li
{ {
position: relative; position: relative;
margin-left: -15px; margin-left: -15px;
list-style: none; list-style: none;
} }
li.file li.file
{ {
margin-left: -1px !important; margin-left: -1px !important;
height: 1.5em; height: 1.5em;
} }
li.file a li.file a
{ {
background: url(../images/fileview/document.png) 0 0 no-repeat; color: #fff;
color: #fff; text-decoration: none;
padding-left: 21px; display: inline-block;
text-decoration: none; }
display: block; li.file a span.icon
} {
li.file a[href *= '.pdf'] { background: url(../images/fileview/document.png) 0 0 no-repeat; } width: 14px;
li.file a[href *= '.html'] { background: url(../images/fileview/document.png) 0 0 no-repeat; } height: 18px;
li.file a[href $= '.css'] { background: url(../images/fileview/document.png) 0 0 no-repeat; } background: url(../images/fileview/document.png) 0 0 no-repeat;
li.file a[href $= '.js'] { background: url(../images/fileview/document.png) 0 0 no-repeat; } display: inline-block;
li input margin-right: 7px;
{ vertical-align: text-top;
position: absolute; }
left: 0; li.file a[href *= '.pdf'] span.icon { background: url(../images/fileview/document.png) 0 0 no-repeat; }
margin-left: 0; li.file a[href *= '.html'] span.icon { background: url(../images/fileview/document.png) 0 0 no-repeat; }
opacity: 0; li.file a[href $= '.css'] span.icon { background: url(../images/fileview/document.png) 0 0 no-repeat; }
z-index: 2; li.file a[href $= '.js'] span.icon { background: url(../images/fileview/document.png) 0 0 no-repeat; }
cursor: pointer; li input
height: 1em; {
width: 1em; position: absolute;
top: 0; left: 0;
} margin-left: 0;
li input + ol opacity: 0;
{ z-index: 2;
background: url(../images/fileview/toggle-small-expand.png) 40px 0 no-repeat; cursor: pointer;
margin: -1.188em 0 0 -44px; /* 15px */ height: 1em;
height: 1.5em; width: 1em;
} top: 0;
li input + ol > li { display: none; margin-left: -14px !important; padding-left: 1px; } }
li label li input + ol
{ {
background: url(../images/fileview/folder-horizontal.png) 15px 1px no-repeat; background: url(../images/fileview/toggle-small-expand.png) 40px 0 no-repeat;
cursor: pointer; margin: -1.188em 0 0 -44px; /* 15px */
display: block; height: 1.5em;
padding-left: 37px; }
} li input + ol > li { display: none; margin-left: -14px !important; padding-left: 1px; }
li label
li input:checked + ol {
{ background: url(../images/fileview/folder-horizontal.png) 15px 1px no-repeat;
background: url(../images/fileview/toggle-small.png) 40px 5px no-repeat; cursor: pointer;
margin: -1.5em 0 0 -44px; /* 20px */ display: block;
padding: 1.563em 0 0 80px; padding-left: 37px;
height: auto; }
}
li input:checked + ol > li { display: block; margin: 0 0 0.125em; /* 2px */} li input:checked + ol
li input:checked + ol > li:last-child { margin: 0 0 0.063em; /* 1px */ } {
background: url(../images/fileview/toggle-small.png) 40px 5px no-repeat;
margin: -1.5em 0 0 -44px; /* 20px */
padding: 1.563em 0 0 80px;
height: auto;
}
li input:checked + ol > li { display: block; margin: 0 0 0.125em; /* 2px */}
li input:checked + ol > li:last-child { margin: 0 0 0.063em; /* 1px */ }
Binary file not shown.

After

Width:  |  Height:  |  Size: 376 B

@@ -233,6 +233,7 @@
$('#gollum-dialog-dialog').animate({ opacity: 1 }, { $('#gollum-dialog-dialog').animate({ opacity: 1 }, {
duration: 500 duration: 500
}); });
$($('#gollum-dialog-dialog input[type="text"]').get(0)).focus();
} }
}); });
} }
@@ -212,4 +212,37 @@ $(document).ready(function() {
$('#gollum-revert-form').submit(); $('#gollum-revert-form').submit();
}); });
} }
if( $('#wiki-wrapper.edit').length ){
$("#gollum-editor-submit").click( function() { window.onbeforeunload = null; } );
$("#gollum-editor-body").one('change', function(){
window.onbeforeunload = function(){ return "Leaving will discard all edits!" };
});
$.GollumEditor();
}
if( $('#wiki-wrapper.create').length ){
$("#gollum-editor-submit").click( function() { window.onbeforeunload = null; } );
$("#gollum-editor-body").one('change', function(){
window.onbeforeunload = function(){ return "Leaving will not create a new page!" };
});
$.GollumEditor({ NewFile: true, MarkupType: default_markup });
}
if( $('#wiki-history').length ){
var lookup = {};
$('img.identicon').each(function(index, element){
var $item = $(element);
var code = parseInt($item.data('identicon'), 10);
var img_bin = lookup[code];
if( img_bin === undefined ){
var size = 16;
var canvas = $('<canvas width=16 height=16/>').get(0);
render_identicon(canvas, code, 16);
img_bin = canvas.toDataURL("image/png");
lookup[code] = img_bin;
}
$item.attr('src', img_bin);
});
}
}); });
@@ -0,0 +1,111 @@
/*
Client-side Canvas tag based Identicon rendering code
@author Don Park
@version 0.2
@date January 21th, 2007
*/
var patch0 = new Array( 0, 4, 24, 20 );
var patch1 = new Array( 0, 4, 20 );
var patch2 = new Array( 2, 24, 20 );
var patch3 = new Array( 0, 2, 20, 22 );
var patch4 = new Array( 2, 14, 22, 10 );
var patch5 = new Array( 0, 14, 24, 22 );
var patch6 = new Array( 2, 24, 22, 13, 11, 22, 20 );
var patch7 = new Array( 0, 14, 22 );
var patch8 = new Array( 6, 8, 18, 16 );
var patch9 = new Array( 4, 20, 10, 12, 2 );
var patch10 = new Array( 0, 2, 12, 10 );
var patch11 = new Array( 10, 14, 22 );
var patch12 = new Array( 20, 12, 24 );
var patch13 = new Array( 10, 2, 12 );
var patch14 = new Array( 0, 2, 10 );
var patchTypes = new Array( patch0, patch1, patch2, patch3, patch4,
patch5, patch6, patch7, patch8, patch9, patch10, patch11,
patch12, patch13, patch14, patch0 );
var centerPatchTypes = new Array(0, 4, 8, 15);
function render_identicon_patch(ctx, x, y, size, patch, turn, invert, foreColor, backColor) {
patch %= patchTypes.length;
turn %= 4;
if (patch == 15)
invert = !invert;
var vertices = patchTypes[patch];
var offset = size / 2;
var scale = size / 4;
ctx.save();
// paint background
ctx.fillStyle = invert ? foreColor : backColor;
ctx.fillRect(x, y, size, size);
// build patch path
ctx.translate(x + offset, y + offset);
ctx.rotate(turn * Math.PI / 2);
ctx.beginPath();
ctx.moveTo((vertices[0] % 5 * scale - offset), (Math.floor(vertices[0] / 5) * scale - offset));
for (var i = 1; i < vertices.length; i++)
ctx.lineTo((vertices[i] % 5 * scale - offset), (Math.floor(vertices[i] / 5) * scale - offset));
ctx.closePath();
// offset and rotate coordinate space by patch position (x, y) and
// 'turn' before rendering patch shape
// render rotated patch using fore color (back color if inverted)
ctx.fillStyle = invert ? backColor : foreColor;
ctx.fill();
// restore rotation
ctx.restore();
}
function render_identicon(node, code, size) {
if (!node || !code || !size) return;
var patchSize = size / 3;
var middleType = centerPatchTypes[code & 3];
var middleInvert = ((code >> 2) & 1) != 0;
var cornerType = (code >> 3) & 15;
var cornerInvert = ((code >> 7) & 1) != 0;
var cornerTurn = (code >> 8) & 3;
var sideType = (code >> 10) & 15;
var sideInvert = ((code >> 14) & 1) != 0;
var sideTurn = (code >> 15) & 3;
var blue = (code >> 16) & 31;
var green = (code >> 21) & 31;
var red = (code >> 27) & 31;
var foreColor = "rgb(" + (red << 3) + "," + (green << 3) + "," + (blue << 3) + ")";
var backColor = "rgb(255,255,255)";
var ctx = node.getContext("2d");
// middle patch
render_identicon_patch(ctx, patchSize, patchSize, patchSize, middleType, 0, middleInvert, foreColor, backColor);
// side patchs, starting from top and moving clock-wise
render_identicon_patch(ctx, patchSize, 0, patchSize, sideType, sideTurn++, sideInvert, foreColor, backColor);
render_identicon_patch(ctx, patchSize * 2, patchSize, patchSize, sideType, sideTurn++, sideInvert, foreColor, backColor);
render_identicon_patch(ctx, patchSize, patchSize * 2, patchSize, sideType, sideTurn++, sideInvert, foreColor, backColor);
render_identicon_patch(ctx, 0, patchSize, patchSize, sideType, sideTurn++, sideInvert, foreColor, backColor);
// corner patchs, starting from top left and moving clock-wise
render_identicon_patch(ctx, 0, 0, patchSize, cornerType, cornerTurn++, cornerInvert, foreColor, backColor);
render_identicon_patch(ctx, patchSize * 2, 0, patchSize, cornerType, cornerTurn++, cornerInvert, foreColor, backColor);
render_identicon_patch(ctx, patchSize * 2, patchSize * 2, patchSize, cornerType, cornerTurn++, cornerInvert, foreColor, backColor);
render_identicon_patch(ctx, 0, patchSize * 2, patchSize, cornerType, cornerTurn++, cornerInvert, foreColor, backColor);
}
function render_identicon_canvases(prefix) {
var canvases = document.getElementsByTagName("canvas");
var n = canvases.length;
for (var i = 0; i < n; i++) {
var node = canvases[i];
if (node.title && node.title.indexOf(prefix) == 0) {
if (node.style.display == 'none') node.style.display = "inline";
var code = node.title.substring(prefix.length) * 1;
var size = node.width;
render_identicon(node, code, size);
}
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 630 B

@@ -11,6 +11,7 @@
<div id='previewframe'><div id='contentframe' class='markdown-body'></div></div> <div id='previewframe'><div id='contentframe' class='markdown-body'></div></div>
<!-- tool panel from notepage.es. save & savecomment icons from Retina Display Icon Set. --> <!-- tool panel from notepage.es. save & savecomment icons from Retina Display Icon Set. -->
<div id='toolpanel' class='toolpanel edit' style='width: 500px; right: 0px; visibility: hidden;'> <div id='toolpanel' class='toolpanel edit' style='width: 500px; right: 0px; visibility: hidden;'>
<a id='preview' class='edit'><img src='images/globe_24.png' alt='Preview' title='Preview'></a>
<a id='save' class='edit'><img src='images/save_24.png' alt='Save' title='Save'></a> <a id='save' class='edit'><img src='images/save_24.png' alt='Save' title='Save'></a>
<a id='savecomment' class='edit'><img src='images/savecomment_24.png' alt='Save with comment' title='Save with comment'></a> <a id='savecomment' class='edit'><img src='images/savecomment_24.png' alt='Save with comment' title='Save with comment'></a>
<a id='toggle' class='edit' href='javascript:void(0)' onclick='jsm.toggleLeftRight();'><img src='images/lr_24.png' alt='Toggle left to right' title='Toggle left to right'></a> <a id='toggle' class='edit' href='javascript:void(0)' onclick='jsm.toggleLeftRight();'><img src='images/lr_24.png' alt='Toggle left to right' title='Toggle left to right'></a>
@@ -1,58 +1,58 @@
/* ***** BEGIN LICENSE BLOCK ***** /* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
* *
* The contents of this file are subject to the Mozilla Public License Version * The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with * 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/ * http://www.mozilla.org/MPL/
* *
* Software distributed under the License is distributed on an "AS IS" basis, * Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the * for the specific language governing rights and limitations under the
* License. * License.
* *
* The Original Code is Ajax.org Code Editor (ACE). * The Original Code is Ajax.org Code Editor (ACE).
* *
* The Initial Developer of the Original Code is * The Initial Developer of the Original Code is
* Ajax.org B.V. * Ajax.org B.V.
* Portions created by the Initial Developer are Copyright (C) 2010 * Portions created by the Initial Developer are Copyright (C) 2010
* the Initial Developer. All Rights Reserved. * the Initial Developer. All Rights Reserved.
* *
* Contributor(s): * Contributor(s):
* *
* Alternatively, the contents of this file may be used under the terms of * Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or * either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead * in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only * of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to * under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your * use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice * decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete * and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under * the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL. * the terms of any one of the MPL, the GPL or the LGPL.
* *
* ***** END LICENSE BLOCK ***** */ * ***** END LICENSE BLOCK ***** */
define(function(require, exports, module) { define(function(require, exports, module) {
"use strict"; "use strict";
var oop = require("../lib/oop"); var oop = require("../lib/oop");
var TextMode = require("./text").Mode; var TextMode = require("./text").Mode;
var Tokenizer = require("../tokenizer").Tokenizer; var Tokenizer = require("../tokenizer").Tokenizer;
var HighlightRules = require("./diff_highlight_rules").DiffHighlightRules; var HighlightRules = require("./diff_highlight_rules").DiffHighlightRules;
var FoldMode = require("./folding/diff").FoldMode; var FoldMode = require("./folding/diff").FoldMode;
var Mode = function() { var Mode = function() {
this.$tokenizer = new Tokenizer(new HighlightRules().getRules(), "i"); this.$tokenizer = new Tokenizer(new HighlightRules().getRules(), "i");
this.foldingRules = new FoldMode(["diff", "index", "\\+{3}", "@@|\\*{5}"], "i"); this.foldingRules = new FoldMode(["diff", "index", "\\+{3}", "@@|\\*{5}"], "i");
}; };
oop.inherits(Mode, TextMode); oop.inherits(Mode, TextMode);
(function() { (function() {
}).call(Mode.prototype); }).call(Mode.prototype);
exports.Mode = Mode; exports.Mode = Mode;
}); });
@@ -1,108 +1,108 @@
/* ***** BEGIN LICENSE BLOCK ***** /* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
* *
* The contents of this file are subject to the Mozilla Public License Version * The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with * 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/ * http://www.mozilla.org/MPL/
* *
* Software distributed under the License is distributed on an "AS IS" basis, * Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the * for the specific language governing rights and limitations under the
* License. * License.
* *
* The Original Code is Ajax.org Code Editor (ACE). * The Original Code is Ajax.org Code Editor (ACE).
* *
* The Initial Developer of the Original Code is * The Initial Developer of the Original Code is
* Ajax.org B.V. * Ajax.org B.V.
* Portions created by the Initial Developer are Copyright (C) 2010 * Portions created by the Initial Developer are Copyright (C) 2010
* the Initial Developer. All Rights Reserved. * the Initial Developer. All Rights Reserved.
* *
* Contributor(s): * Contributor(s):
* *
* Alternatively, the contents of this file may be used under the terms of * Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or * either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead * in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only * of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to * under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your * use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice * decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete * and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under * the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL. * the terms of any one of the MPL, the GPL or the LGPL.
* *
* ***** END LICENSE BLOCK ***** */ * ***** END LICENSE BLOCK ***** */
define(function(require, exports, module) { define(function(require, exports, module) {
"use strict"; "use strict";
var oop = require("../lib/oop"); var oop = require("../lib/oop");
var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
var DiffHighlightRules = function() { var DiffHighlightRules = function() {
// regexp must not have capturing parentheses. Use (?:) instead. // regexp must not have capturing parentheses. Use (?:) instead.
// regexps are ordered -> the first match is used // regexps are ordered -> the first match is used
this.$rules = { this.$rules = {
"start" : [{ "start" : [{
"regex": "^(?:\\*{15}|={67}|-{3}|\\+{3})$", "regex": "^(?:\\*{15}|={67}|-{3}|\\+{3})$",
"token": "punctuation.definition.separator.diff", "token": "punctuation.definition.separator.diff",
"name": "keyword" "name": "keyword"
}, { //diff.range.unified }, { //diff.range.unified
"regex": "^(@@)(\\s*.+?\\s*)(@@)(.*)$", "regex": "^(@@)(\\s*.+?\\s*)(@@)(.*)$",
"token": [ "token": [
"constant", "constant",
"constant.numeric", "constant.numeric",
"constant", "constant",
"comment.doc.tag" "comment.doc.tag"
] ]
}, { //diff.range.normal }, { //diff.range.normal
"regex": "^(\\d+)([,\\d]+)(a|d|c)(\\d+)([,\\d]+)(.*)$", "regex": "^(\\d+)([,\\d]+)(a|d|c)(\\d+)([,\\d]+)(.*)$",
"token": [ "token": [
"constant.numeric", "constant.numeric",
"punctuation.definition.range.diff", "punctuation.definition.range.diff",
"constant.function", "constant.function",
"constant.numeric", "constant.numeric",
"punctuation.definition.range.diff", "punctuation.definition.range.diff",
"invalid" "invalid"
], ],
"name": "meta." "name": "meta."
}, { }, {
"regex": "^(?:(\\-{3}|\\+{3}|\\*{3})( .+))$", "regex": "^(?:(\\-{3}|\\+{3}|\\*{3})( .+))$",
"token": [ "token": [
"constant.numeric", "constant.numeric",
"meta.tag" "meta.tag"
] ]
}, { // added }, { // added
"regex": "^([!+>])(.*?)(\\s*)$", "regex": "^([!+>])(.*?)(\\s*)$",
"token": [ "token": [
"support.constant", "support.constant",
"text", "text",
"invalid" "invalid"
], ],
}, { // removed }, { // removed
"regex": "^([<\\-])(.*?)(\\s*)$", "regex": "^([<\\-])(.*?)(\\s*)$",
"token": [ "token": [
"support.function", "support.function",
"string", "string",
"invalid" "invalid"
], ],
}, { }, {
"regex": "^(diff)(\\s+--\\w+)?(.+?)( .+)?$", "regex": "^(diff)(\\s+--\\w+)?(.+?)( .+)?$",
"token": ["variable", "variable", "keyword", "variable"] "token": ["variable", "variable", "keyword", "variable"]
}, { }, {
"regex": "^Index.+$", "regex": "^Index.+$",
"token": "variable" "token": "variable"
}, { }, {
"regex": "^(.*?)(\\s*)$", "regex": "^(.*?)(\\s*)$",
"token": ["invisible", "invalid"] "token": ["invisible", "invalid"]
} }
] ]
}; };
}; };
oop.inherits(DiffHighlightRules, TextHighlightRules); oop.inherits(DiffHighlightRules, TextHighlightRules);
exports.DiffHighlightRules = DiffHighlightRules; exports.DiffHighlightRules = DiffHighlightRules;
}); });
@@ -87,6 +87,18 @@ defaultCommitMessage = function() {
// Set comment using the default commit message. // Set comment using the default commit message.
commentEditorSession.setValue( defaultCommitMessage() ); commentEditorSession.setValue( defaultCommitMessage() );
$.preview = function( previewWindow ) {
jQuery.ajax( {
type: 'POST',
url: baseUrl + '/preview',
data: { page: 'Preview: ' + pageName, format: 'markdown', content: editorSession.getValue() },
success: function( html ) {
previewWindow.document.write( html );
previewWindow.focus();
}
});
}
$.save = function( commitMessage ) { $.save = function( commitMessage ) {
win.onbeforeunload = null; win.onbeforeunload = null;
@@ -96,8 +108,9 @@ $.save = function( commitMessage ) {
var msg = defaultCommitMessage(); var msg = defaultCommitMessage();
var newLocation = baseUrl; var newLocation = baseUrl;
// Remove all duplicate slashes
function clean( str ) { function clean( str ) {
return str.replace(/^\/+/, '/'); return str.replace(/\/+/g, '/');
} }
// 'a%2Fb' => a/b // 'a%2Fb' => a/b
@@ -285,6 +298,8 @@ var makePreviewHtml = function () {
} }
var prevTime = new Date().getTime(); var prevTime = new Date().getTime();
// Handle gollum file code insertion syntax.
text = text.replace(/^[ \t]*``` ?([^:\n\r]+:[^`\n\r]+)```/gm, '``$1``');
text = md_to_html( text ); text = md_to_html( text );
// Calculate the processing time of the HTML creation. // Calculate the processing time of the HTML creation.
@@ -377,8 +392,16 @@ var applyTimeout = function () {
}); });
} }
$( '#preview' ).click( function() {
$(this).target = "_blank";
// pass window into preview
$.preview( window.open() );
return false;
});
$( '#save' ).click( function() { $( '#save' ).click( function() {
$.save(); $.save();
return false;
}); });
// Hide dimmer, comment tool panel, and comment. // Hide dimmer, comment tool panel, and comment.
@@ -15,7 +15,10 @@ CC BY-SA 3.0 Unported
http://blog.twg.ca/2010/11/retina-display-icon-set/ http://blog.twg.ca/2010/11/retina-display-icon-set/
http://creativecommons.org/licenses/by-sa/3.0/legalcode.txt http://creativecommons.org/licenses/by-sa/3.0/legalcode.txt
lib/gollum/frontend/public/images/savecomment_24.png
lib/gollum/frontend/public/images/cancel_24.png
lib/gollum/frontend/public/images/save_24.png lib/gollum/frontend/public/images/save_24.png
lib/gollum/frontend/public/images/globe_24.png
--- ---
@@ -1,4 +1,4 @@
<div id="wiki-wrapper"> <div id="wiki-wrapper" class="create">
<div id="head"> <div id="head">
<h1>Create New Page</h1> <h1>Create New Page</h1>
</div> </div>
@@ -9,12 +9,6 @@
</div> </div>
</div> </div>
<script type="text/javascript"> <script type="text/javascript">
window.onbeforeunload = function(){ return "Leaving will not create a new page!" }; var default_markup = '{{default_markup}}';
$("#gollum-editor-submit").click( function() { window.onbeforeunload = null; } );
jQuery(document).ready(function() {
$.GollumEditor({ NewFile: true, MarkupType: '{{default_markup}}' });
});
</script> </script>
{{something}} {{something}}
@@ -10,11 +10,3 @@
</div> </div>
<div id="wiki-content">{{>editor}}</div> <div id="wiki-content">{{>editor}}</div>
</div> </div>
<script type="text/javascript">
window.onbeforeunload = function(){ return "Leaving will discard all edits!" };
$("#gollum-editor-submit").click( function() { window.onbeforeunload = null; } );
jQuery(document).ready(function() {
$.GollumEditor();
});
</script>
@@ -5,6 +5,7 @@
<link rel="stylesheet" type="text/css" href="{{base_url}}/css/gollum.css" media="all"> <link rel="stylesheet" type="text/css" href="{{base_url}}/css/gollum.css" media="all">
<link rel="stylesheet" type="text/css" href="{{base_url}}/css/template.css" media="all"> <link rel="stylesheet" type="text/css" href="{{base_url}}/css/template.css" media="all">
<link rel="stylesheet" type="text/css" href="{{base_url}}/css/_styles.css" media="all"> <link rel="stylesheet" type="text/css" href="{{base_url}}/css/_styles.css" media="all">
{{#css}}<link rel="stylesheet" type="text/css" href="{{base_url}}/custom.css" media="all">{{/css}}
<title>{{title}}</title> <title>{{title}}</title>
</head> </head>
<body> <body>
@@ -30,11 +30,7 @@
<input type="checkbox" name="versions[]" value="{{id}}"> <input type="checkbox" name="versions[]" value="{{id}}">
</td> </td>
<td class="author"> <td class="author">
<a href="javascript:void(0)"> {{>author_template}}
<img src="https://secure.gravatar.com/avatar/{{gravatar}}?s=16"
alt="avatar: {{author}}" class="mini-gravatar">
<span class="username">{{author}}</span>
</a>
</td> </td>
<td class="commit-name"> <td class="commit-name">
<span class="time-elapsed">{{date}}:</span>&nbsp; <span class="time-elapsed">{{date}}:</span>&nbsp;
@@ -0,0 +1,5 @@
<a href="javascript:void(0)">
<img src="https://secure.gravatar.com/avatar/{{gravatar}}?s=16"
alt="avatar: {{author}}" class="mini-gravatar"/>
<span class="username">{{author}}</span>
</a>
@@ -0,0 +1,5 @@
<a href="javascript:void(0)">
<img src="{{base_url}}/images/man_24.png" alt="avatar: {{author}}"
class="mini-gravatar identicon" data-identicon="{{identicon}}"/>
<span class="username">{{author}}</span>
</a>
@@ -0,0 +1,3 @@
<a href="javascript:void(0)">
<span class="username">{{author}}</span>
</a>
@@ -6,6 +6,7 @@
<link rel="stylesheet" type="text/css" href="{{base_url}}/css/editor.css" media="all"> <link rel="stylesheet" type="text/css" href="{{base_url}}/css/editor.css" media="all">
<link rel="stylesheet" type="text/css" href="{{base_url}}/css/dialog.css" media="all"> <link rel="stylesheet" type="text/css" href="{{base_url}}/css/dialog.css" media="all">
<link rel="stylesheet" type="text/css" href="{{base_url}}/css/template.css" media="all"> <link rel="stylesheet" type="text/css" href="{{base_url}}/css/template.css" media="all">
{{#css}}<link rel="stylesheet" type="text/css" href="{{base_url}}/custom.css" media="all">{{/css}}
<!--[if IE 7]> <!--[if IE 7]>
<link rel="stylesheet" type="text/css" href="{{base_url}}/css/ie7.css" media="all"> <link rel="stylesheet" type="text/css" href="{{base_url}}/css/ie7.css" media="all">
@@ -18,6 +19,9 @@
<script type="text/javascript" src="{{base_url}}/javascript/gollum.dialog.js"></script> <script type="text/javascript" src="{{base_url}}/javascript/gollum.dialog.js"></script>
<script type="text/javascript" src="{{base_url}}/javascript/gollum.placeholder.js"></script> <script type="text/javascript" src="{{base_url}}/javascript/gollum.placeholder.js"></script>
<script type="text/javascript" src="{{base_url}}/javascript/editor/gollum.editor.js"></script> <script type="text/javascript" src="{{base_url}}/javascript/editor/gollum.editor.js"></script>
{{#use_identicon}}
<script type="text/javascript" src="{{base_url}}/javascript/identicon_canvas.js"></script>
{{/use_identicon}}
{{#mathjax}} {{#mathjax}}
<script type="text/x-mathjax-config"> <script type="text/x-mathjax-config">
MathJax.Hub.Config({ MathJax.Hub.Config({
+1 -1
View File
@@ -7,7 +7,7 @@ Mousetrap.bind(['e'], function( e ) {
</script> </script>
<div id="wiki-wrapper" class="page"> <div id="wiki-wrapper" class="page">
<div id="head"> <div id="head">
<h1>{{title}}</h1> <h1>{{page_header}}</h1>
<ul class="actions"> <ul class="actions">
<li class="minibutton"> <li class="minibutton">
{{>searchbar}} {{>searchbar}}
+41 -2
View File
@@ -19,8 +19,47 @@ module Precious
:selected => @page.version.id == v.id, :selected => @page.version.id == v.id,
:author => v.author.name.respond_to?(:force_encoding) ? v.author.name.force_encoding('UTF-8') : v.author.name, :author => v.author.name.respond_to?(:force_encoding) ? v.author.name.force_encoding('UTF-8') : v.author.name,
:message => v.message.respond_to?(:force_encoding) ? v.message.force_encoding('UTF-8') : v.message, :message => v.message.respond_to?(:force_encoding) ? v.message.force_encoding('UTF-8') : v.message,
:date => v.committed_date.strftime("%B %d, %Y"), :date => v.authored_date.strftime("%B %d, %Y"),
:gravatar => Digest::MD5.hexdigest(v.author.email) } :gravatar => Digest::MD5.hexdigest(v.author.email),
:identicon => self._identicon_code(v.author.email),
}
end
end
# http://stackoverflow.com/questions/9445760/bit-shifting-in-ruby
def left_shift int, shift
r = ((int & 0xFF) << (shift & 0x1F)) & 0xFFFFFFFF
# 1>>31, 2**32
(r & 2147483648) == 0 ? r : r - 4294967296
end
def string_to_code string
# sha bytes
b = [Digest::SHA1.hexdigest(string)[0,20]].pack('H*').bytes.to_a
# Thanks donpark's IdenticonUtil.java for this.
# Match the following Java code
# ((b[0] & 0xFF) << 24) | ((b[1] & 0xFF) << 16) |
# ((b[2] & 0xFF) << 8) | (b[3] & 0xFF)
return left_shift(b[0], 24) |
left_shift(b[1], 16) |
left_shift(b[2], 8) |
b[3] & 0xFF
end
def _identicon_code(blob)
string_to_code blob + @request.host
end
def use_identicon
@page.wiki.user_icons == 'identicon'
end
def partial(name)
if name == :author_template
self.class.partial("history_authors/#{@page.wiki.user_icons}")
else
super
end end
end end
+5
View File
@@ -23,6 +23,11 @@ module Precious
def base_url def base_url
@base_url @base_url
end end
def css # custom css
@css
end
end end
end end
end end
+56 -1
View File
@@ -8,7 +8,16 @@ module Precious
DEFAULT_AUTHOR = 'you' DEFAULT_AUTHOR = 'you'
def title def title
@page.url_path.gsub("-", " ") h1 = @h1_title ? page_header_from_content(@content) : false
h1 || @page.url_path_title
end
def page_header
page_header_from_content(@content) || title
end
def content
content_without_page_header(@content)
end end
def author def author
@@ -80,6 +89,10 @@ module Precious
@mathjax @mathjax
end end
def use_identicon
@page.wiki.user_icons == 'identicon'
end
# Access to embedded metadata. # Access to embedded metadata.
# #
# Examples # Examples
@@ -90,6 +103,48 @@ module Precious
def metadata def metadata
@page.metadata @page.metadata
end end
private
# Wraps page formatted data to Nokogiri::HTML document.
#
def build_document(content)
Nokogiri::HTML(%{<div id="gollum-root">} + content + %{</div>})
end
# Finds header node inside Nokogiri::HTML document.
#
def find_header_node(doc)
case self.format
when :asciidoc
doc.css("div#gollum-root > div#header > h1:first-child")
when :org
doc.css("div#gollum-root > p.title:first-child")
when :pod
doc.css("div#gollum-root > a.dummyTopAnchor:first-child + h1")
when :rest
doc.css("div#gollum-root > div > div > h1:first-child")
else
doc.css("div#gollum-root > h1:first-child")
end
end
# Extracts title from page if present.
#
def page_header_from_content(content)
doc = build_document(content)
title = find_header_node(doc)
Sanitize.clean(title.to_html).strip unless title.empty?
end
# Returns page content without title if it was extracted.
#
def content_without_page_header(content)
doc = build_document(content)
title = find_header_node(doc)
title.remove unless title.empty?
doc.css("div#gollum-root").inner_html
end
end end
end end
end end
+1
View File
@@ -1,3 +1,4 @@
# ~*~ encoding: utf-8 ~*~
module Gollum module Gollum
# Controls all access to the Git objects from Gollum. Extend this class to # Controls all access to the Git objects from Gollum. Extend this class to
# add custom caching for special cases. # add custom caching for special cases.
+1
View File
@@ -1,3 +1,4 @@
# ~*~ encoding: utf-8 ~*~
require 'net/http' require 'net/http'
require 'net/https' # ruby 1.8.7 fix, remove at upgrade require 'net/https' # ruby 1.8.7 fix, remove at upgrade
require 'uri' require 'uri'
+29 -14
View File
@@ -1,3 +1,4 @@
# ~*~ encoding: utf-8 ~*~
require 'digest/sha1' require 'digest/sha1'
require 'cgi' require 'cgi'
require 'pygments' require 'pygments'
@@ -37,6 +38,7 @@ module Gollum
@premap = {} @premap = {}
@toc = nil @toc = nil
@metadata = nil @metadata = nil
@to_xml = { :save_with => Nokogiri::XML::Node::SaveOptions::DEFAULT_XHTML ^ 1, :indent => 0, :encoding => 'UTF-8' }
end end
# Render the content with Gollum wiki syntax on top of the file's own # Render the content with Gollum wiki syntax on top of the file's own
@@ -74,13 +76,18 @@ module Gollum
doc,toc = process_headers(doc) doc,toc = process_headers(doc)
@toc = @sub_page ? ( @parent_page ? @parent_page.toc_data : "[[_TOC_]]" ) : toc @toc = @sub_page ? ( @parent_page ? @parent_page.toc_data : "[[_TOC_]]" ) : toc
yield doc if block_given? yield doc if block_given?
data = doc.to_xhtml # nokogiri's save options are ored together. FORMAT has a value of 1 so ^ 1 removes it.
# formatting will create extra spaces in pre tags.
# https://github.com/sparklemotion/nokogiri/issues/782
# DEFAULT_HTML encodes unicode so XHTML is used for proper unicode support in href.
data = doc.to_xml( @to_xml )
data = process_toc_tags(data) data = process_toc_tags(data)
data = process_wsd(data) data = process_wsd(data)
data.gsub!(/<p><\/p>/) do data.gsub!(/<p><\/p>/) do
'' ''
end end
data data
end end
@@ -119,7 +126,7 @@ module Gollum
node.add_child(%Q{<a href="##{h_name}">#{h.content}</a>}) node.add_child(%Q{<a href="##{h_name}">#{h.content}</a>})
tail.add_child(node) tail.add_child(node)
end end
toc = toc.to_xhtml if toc != nil toc = toc.to_xml(@to_xml) if toc != nil
[doc, toc] [doc, toc]
end end
@@ -388,12 +395,12 @@ module Gollum
# name - The String absolute or relative path of the file. # name - The String absolute or relative path of the file.
# #
# Returns the Gollum::File or nil if none was found. # Returns the Gollum::File or nil if none was found.
def find_file(name) def find_file(name, version=@version)
if name =~ /^\// if name =~ /^\//
@wiki.file(name[1..-1], @version) @wiki.file(name[1..-1], version)
else else
path = @dir == '.' ? name : ::File.join(@dir, name) path = @dir == '.' ? name : ::File.join(@dir, name)
@wiki.file(path, @version) @wiki.file(path, version)
end end
end end
@@ -428,6 +435,10 @@ module Gollum
# #
# Gitcode - fetch code from github search path and replace the contents # Gitcode - fetch code from github search path and replace the contents
# to a code-block that gets run the next parse. # to a code-block that gets run the next parse.
# Acceptable formats:
# ```language:local-file.ext```
# ```language:/abs/other-file.ext```
# ```language:github/gollum/master/somefile.txt```
# #
######################################################################### #########################################################################
@@ -438,12 +449,12 @@ module Gollum
uri = $2 || '' uri = $2 || ''
# Detect local file. # Detect local file.
if uri[0..6] != 'github/' if uri[0..6] != 'github/'
if uri[0..0] != '/' # relative file if file = self.find_file(uri, @wiki.ref)
contents = @wiki.page(uri).formatted_data contents = file.raw_data
else # use full path else
contents = @wiki.paged( extract_name( clean_url( uri ) ), # How do we communicate a render error?
'/' + clean_url( extract_path( uri ) ) ).formatted_data next "File not found: #{Rack::Utils::escape_html(uri)}"
end end
else else
contents = Gollum::Gitcode.new(uri).contents contents = Gollum::Gitcode.new(uri).contents
end end
@@ -481,8 +492,10 @@ module Gollum
# extract lang from { .ruby } or { #stuff .ruby .indent } # extract lang from { .ruby } or { #stuff .ruby .indent }
# see http://johnmacfarlane.net/pandoc/README.html#delimited-code-blocks # see http://johnmacfarlane.net/pandoc/README.html#delimited-code-blocks
lang = lang.match(/\.([^}\s]+)/) if lang
lang = lang[1] unless lang.nil? lang = lang.match(/\.([^}\s]+)/)
lang = lang[1] unless lang.nil?
end
@codemap[id] = cached ? @codemap[id] = cached ?
{ :output => cached } : { :output => cached } :
@@ -543,7 +556,9 @@ module Gollum
blocks.each do |lang, code| blocks.each do |lang, code|
encoding ||= 'utf-8' encoding ||= 'utf-8'
begin begin
hl_code = Pygments.highlight(code, :lexer => lang, :options => {:encoding => encoding.to_s}) # must set startinline to true for php to be highlighted without <?
# http://pygments.org/docs/lexers/
hl_code = Pygments.highlight(code, :lexer => lang, :options => {:encoding => encoding.to_s, :startinline => true})
rescue rescue
hl_code = code hl_code = code
end end
+23 -1
View File
@@ -1,3 +1,4 @@
# ~*~ encoding: utf-8 ~*~
module Gollum module Gollum
class Page class Page
include Pagination include Pagination
@@ -167,6 +168,27 @@ module Gollum
path path
end end
# Public: Defines title for page.rb
#
# Returns the String title
def url_path_title
metadata_title || url_path.gsub("-", " ")
end
# Public: Metadata title
#
# Set with <!-- --- title: New Title --> in page content
#
# Returns the String title or nil if not defined
def metadata_title
if metadata
title = metadata['title']
return title unless title.nil?
end
nil
end
# Public: The url_path, but CGI escaped. # Public: The url_path, but CGI escaped.
# #
# Returns the String url_path # Returns the String url_path
@@ -220,7 +242,7 @@ module Gollum
# Public: Embedded metadata. # Public: Embedded metadata.
# #
# Returns Hash of metadata. # Returns Hash of metadata.
def meta_data() def metadata()
formatted_data if markup_class.metadata == nil formatted_data if markup_class.metadata == nil
markup_class.metadata markup_class.metadata
end end
+2 -1
View File
@@ -1,3 +1,4 @@
# ~*~ encoding: utf-8 ~*~
module Gollum module Gollum
module Pagination module Pagination
def self.included(klass) def self.included(klass)
@@ -58,4 +59,4 @@ module Gollum
self.class.log_pagination_options(options) self.class.log_pagination_options(options)
end end
end end
end end
+3 -2
View File
@@ -1,3 +1,4 @@
# ~*~ encoding: utf-8 ~*~
module Gollum module Gollum
# Encapsulate sanitization options. # Encapsulate sanitization options.
# #
@@ -104,7 +105,7 @@ module Gollum
attr_reader :transformers attr_reader :transformers
# Gets or sets a String prefix which is added to ID attributes. # Gets or sets a String prefix which is added to ID attributes.
# Default: 'wiki-' # Default: ''
attr_accessor :id_prefix attr_accessor :id_prefix
# Gets a Hash describing HTML attributes that Sanitize should add. # Gets a Hash describing HTML attributes that Sanitize should add.
@@ -127,7 +128,7 @@ module Gollum
@add_attributes = {} @add_attributes = {}
@remove_contents = REMOVE_CONTENTS.dup @remove_contents = REMOVE_CONTENTS.dup
@allow_comments = false @allow_comments = false
@id_prefix = 'wiki-' @id_prefix = ''
yield self if block_given? yield self if block_given?
end end
+1
View File
@@ -1,3 +1,4 @@
# ~*~ encoding: utf-8 ~*~
require 'net/http' require 'net/http'
require 'uri' require 'uri'
require 'open-uri' require 'open-uri'
+54 -22
View File
@@ -1,3 +1,4 @@
# ~*~ encoding: utf-8 ~*~
module Gollum module Gollum
class Wiki class Wiki
include Pagination include Pagination
@@ -136,6 +137,14 @@ module Gollum
# Gets the boolean live preview value. # Gets the boolean live preview value.
attr_reader :live_preview attr_reader :live_preview
# Injects custom css from custom.css in root repo.
# Defaults to false
attr_reader :css
# Sets page title to value of first h1
# Defaults to false
attr_reader :h1_title
# Public: Initialize a new Gollum Repo. # Public: Initialize a new Gollum Repo.
# #
# path - The String path to the Git repository that holds the Gollum # path - The String path to the Git repository that holds the Gollum
@@ -154,6 +163,11 @@ module Gollum
# :ref - String the repository ref to retrieve pages from # :ref - String the repository ref to retrieve pages from
# :ws_subs - Array of chars to sub for ws in filenames. # :ws_subs - Array of chars to sub for ws in filenames.
# :mathjax - Set to false to disable mathjax. # :mathjax - Set to false to disable mathjax.
# :user_icons - Enable user icons on the history page. [gravatar, identicon, none].
# Default: none
# :show_all - Show all files in file view, not just valid pages.
# Default: false
# :collapse_tree - Start with collapsed file view. Default: false
# #
# Returns a fresh Gollum::Repo. # Returns a fresh Gollum::Repo.
def initialize(path, options = {}) def initialize(path, options = {})
@@ -162,25 +176,36 @@ module Gollum
options[:access] = path options[:access] = path
path = path.path path = path.path
end end
@path = path
@repo_is_bare = options[:repo_is_bare] # Use .fetch instead of ||
@page_file_dir = options[:page_file_dir] #
@access = options[:access] || GitAccess.new(path, @page_file_dir, @repo_is_bare) # o = { :a => false }
@base_path = options[:base_path] || "/" # o[:a] || true # => true
@page_class = options[:page_class] || self.class.page_class # o.fetch :a, true # => false
@file_class = options[:file_class] || self.class.file_class
@markup_classes = options[:markup_classes] || self.class.markup_classes @path = path
@repo = @access.repo @repo_is_bare = options.fetch :repo_is_bare, nil
@ref = options[:ref] || self.class.default_ref @page_file_dir = options.fetch :page_file_dir, nil
@sanitization = options[:sanitization] || self.class.sanitization @access = options.fetch :access, GitAccess.new(path, @page_file_dir, @repo_is_bare)
@ws_subs = options[:ws_subs] || @base_path = options.fetch :base_path, "/"
self.class.default_ws_subs @page_class = options.fetch :page_class, self.class.page_class
@history_sanitization = options[:history_sanitization] || @file_class = options.fetch :file_class, self.class.file_class
self.class.history_sanitization @markup_classes = options.fetch :markup_classes, self.class.markup_classes
@live_preview = options.fetch(:live_preview, true) @repo = @access.repo
@universal_toc = options.fetch(:universal_toc, false) @ref = options.fetch :ref, self.class.default_ref
@mathjax = options[:mathjax] || false @sanitization = options.fetch :sanitization, self.class.sanitization
@show_all = options[:show_all] || false @ws_subs = options.fetch :ws_subs, self.class.default_ws_subs
@history_sanitization = options.fetch :history_sanitization, self.class.history_sanitization
@live_preview = options.fetch :live_preview, true
@universal_toc = options.fetch :universal_toc, false
@mathjax = options.fetch :mathjax, false
@show_all = options.fetch :show_all, false
@collapse_tree = options.fetch :collapse_tree, false
@css = options.fetch :css, false
@h1_title = options.fetch :h1_title, false
@user_icons = ['gravatar', 'identicon'].include?( options[:user_icons] ) ?
options[:user_icons] : 'none'
end end
# Public: check whether the wiki's git repo exists on the filesystem. # Public: check whether the wiki's git repo exists on the filesystem.
@@ -257,10 +282,11 @@ module Gollum
# :committer - Optional Gollum::Committer instance. If provided, # :committer - Optional Gollum::Committer instance. If provided,
# assume that this operation is part of batch of # assume that this operation is part of batch of
# updates and the commit happens later. # updates and the commit happens later.
# # dir - The String subdirectory of the Gollum::Page without any
# prefix or suffix slashes (e.g. "foo/bar").
# Returns the String SHA1 of the newly written version, or the # Returns the String SHA1 of the newly written version, or the
# Gollum::Committer instance if this is part of a batch update. # Gollum::Committer instance if this is part of a batch update.
def write_page(name, format, data, commit = {}) def write_page(name, format, data, commit = {}, dir = '')
multi_commit = false multi_commit = false
committer = if obj = commit[:committer] committer = if obj = commit[:committer]
@@ -272,7 +298,7 @@ module Gollum
filename = Gollum::Page.cname(name) filename = Gollum::Page.cname(name)
committer.add_to_index('', filename, format, data) committer.add_to_index(dir, filename, format, data)
committer.after_commit do |index, sha| committer.after_commit do |index, sha|
@access.refresh @access.refresh
@@ -589,10 +615,16 @@ module Gollum
# Toggles mathjax. # Toggles mathjax.
attr_reader :mathjax attr_reader :mathjax
# Toggles user icons. Default: 'none'
attr_reader :user_icons
# Toggles showing all files in files view. Default is false. # Toggles showing all files in files view. Default is false.
# When false, only valid pages in the git repo are displayed. # When false, only valid pages in the git repo are displayed.
attr_reader :show_all attr_reader :show_all
# Start with collapsed file view. Default: false
attr_reader :collapse_tree
# Normalize the data. # Normalize the data.
# #
# data - The String data to be normalized. # data - The String data to be normalized.
+29
View File
@@ -1,3 +1,12 @@
For gollum code, everything should fall under the existing MIT License.
Alternative permissive licenses (such as BSD) for 3rd party dependencies are
acceptable. For image assets in Gollum, CC BY or CC BY-SA is fine. Anything
released under a copyleft license (for example GPL, AGPL, LGPL, MPL, EPL,
etc.) is not permitted in gollum. Public domain, CC BY or CC BY-SA for code in
gollum is not permitted.
---
The following PNGs are based on Ubuntu 11.10 SVG files located in /usr/share/icons/unity-icon-theme/places/svg/ The following PNGs are based on Ubuntu 11.10 SVG files located in /usr/share/icons/unity-icon-theme/places/svg/
- group-folders.svg - group-folders.svg
- group-files.svg - group-files.svg
@@ -21,3 +30,23 @@ http://www.thecssninja.com/css/css-tree-menu
http://www.thecssninja.com/demo/license.txt http://www.thecssninja.com/demo/license.txt
lib/gollum/frontend/public/css/_styles.css lib/gollum/frontend/public/css/_styles.css
---
Default profile image (man_24.png) is used under the CC BY-SA 3.0 Unported license.
CC BY-SA 3.0 Unported
http://blog.twg.ca/2010/11/retina-display-icon-set/
http://creativecommons.org/licenses/by-sa/3.0/legalcode.txt
lib/gollum/frontend/public/images/man_24.png
---
The canvas_identicon code is used under the MIT license.
https://github.com/donpark/identicon/blob/master/identicon-canvas/identicon_canvas.js
https://github.com/donpark/identicon/blob/master/README
lib/gollum/frontend/public/gollum/javascript/identicon_canvas.js
+1
View File
@@ -5,3 +5,4 @@ a8ad3c09dd842a3517085bfadd37718856dee813 1db89ebba7e2c14d93b94ff98cfa3708a4f0d4e
b16b3d9fad9d78e5a669e7f33d94c96da374eccd b0de6e794dfdc7ef3400e894225bfe23308aae5c kristi <kristi.dev@gmail.com> 1336984025 -0700 push b16b3d9fad9d78e5a669e7f33d94c96da374eccd b0de6e794dfdc7ef3400e894225bfe23308aae5c kristi <kristi.dev@gmail.com> 1336984025 -0700 push
b0de6e794dfdc7ef3400e894225bfe23308aae5c cfea406f5f77afc7fb673a43e97721234385b1bd Darren Oakley <daz.oakley@gmail.com> 1341830099 +0100 push b0de6e794dfdc7ef3400e894225bfe23308aae5c cfea406f5f77afc7fb673a43e97721234385b1bd Darren Oakley <daz.oakley@gmail.com> 1341830099 +0100 push
cfea406f5f77afc7fb673a43e97721234385b1bd 629aa678272b017a4d136d35e77ac94d80b08dc2 Darren Oakley <daz.oakley@gmail.com> 1341830833 +0100 push cfea406f5f77afc7fb673a43e97721234385b1bd 629aa678272b017a4d136d35e77ac94d80b08dc2 Darren Oakley <daz.oakley@gmail.com> 1341830833 +0100 push
629aa678272b017a4d136d35e77ac94d80b08dc2 7d6aeab8b84c895f21f6c66b84a457b0fced9693 Daniel Kimsey <dekimsey@ufl.edu> 1352501984 -0500 push
@@ -5,3 +5,4 @@ a8ad3c09dd842a3517085bfadd37718856dee813 1db89ebba7e2c14d93b94ff98cfa3708a4f0d4e
b16b3d9fad9d78e5a669e7f33d94c96da374eccd b0de6e794dfdc7ef3400e894225bfe23308aae5c kristi <kristi.dev@gmail.com> 1336984025 -0700 push b16b3d9fad9d78e5a669e7f33d94c96da374eccd b0de6e794dfdc7ef3400e894225bfe23308aae5c kristi <kristi.dev@gmail.com> 1336984025 -0700 push
b0de6e794dfdc7ef3400e894225bfe23308aae5c cfea406f5f77afc7fb673a43e97721234385b1bd Darren Oakley <daz.oakley@gmail.com> 1341830099 +0100 push b0de6e794dfdc7ef3400e894225bfe23308aae5c cfea406f5f77afc7fb673a43e97721234385b1bd Darren Oakley <daz.oakley@gmail.com> 1341830099 +0100 push
cfea406f5f77afc7fb673a43e97721234385b1bd 629aa678272b017a4d136d35e77ac94d80b08dc2 Darren Oakley <daz.oakley@gmail.com> 1341830833 +0100 push cfea406f5f77afc7fb673a43e97721234385b1bd 629aa678272b017a4d136d35e77ac94d80b08dc2 Darren Oakley <daz.oakley@gmail.com> 1341830833 +0100 push
629aa678272b017a4d136d35e77ac94d80b08dc2 7d6aeab8b84c895f21f6c66b84a457b0fced9693 Daniel Kimsey <dekimsey@ufl.edu> 1352501984 -0500 push
@@ -0,0 +1,2 @@
xEOK1 Å=÷S<ëEaºzEYð ]¼g·™™`¦•´3ê··ãù½—4ps}{¶=!gtä;°ö.„{wZNѹSÄ<g‹È=^eáYµCN¼vêȘdëlV¶²6³Æ6 
ã‰$q„$÷"1*&«c«!µ`?J? ¼Á“)øwšµ®°·JV|¿&!æ‰}ç²Áï´)<Ò—«þ¦cýƒHРs:²Õf£C»dŸõC8ah.Jß³qªˆl²P•ܤ›·ÿÁ§¶ï”«s¿³6gú
@@ -0,0 +1 @@
xÎ=j1@áÔ:Åt®ô?cC\ù³šY¼Ú ZmáÛ|„t¯ùà•­µy€õþct>èDh*q0Á°ËÅŠµbLbı+è²%õG]ÖÑf¢ˆÉ¢´Aòl\d‘Jöœô¤«è¿[‡ZgYà>·]žðÍòx×å¨Ë—ðqã‚ ÚdÌð©ƒÖª¼‡üǪ+³0Ü–¾­|Ú¡S š b¤^í/M1
+1 -1
View File
@@ -1 +1 @@
629aa678272b017a4d136d35e77ac94d80b08dc2 7d6aeab8b84c895f21f6c66b84a457b0fced9693
+4 -2
View File
@@ -1,3 +1,5 @@
<ol class="tree"> <ol class="tree">
<li class="file"><a href="0">0</a></li> <li class="file">
</ol> <a href="0"><span class="icon"></span>0</a>
</li>
</ol>
+10 -7
View File
@@ -1,8 +1,11 @@
<ol class="tree"> <ol class="tree">
<li> <li>
<label>folder0</label> <input type="checkbox" checked /> <label>folder0</label>
<ol> <input type="checkbox" />
<li class="file"><a href="folder0/0">0</a></li> <ol>
</ol> <li class="file">
</li> <a href="folder0/0"><span class="icon"></span>0</a>
</ol> </li>
</ol>
</li>
</ol>
+10 -7
View File
@@ -1,8 +1,11 @@
<ol class="tree"> <ol class="tree">
<li> <li>
<label>.</label> <input type="checkbox" checked /> <label>.</label>
<ol> <input type="checkbox" />
<li class="file"><a href="folder0">folder0</a></li> <ol>
</ol> <li class="file">
</li> <a href="folder0"><span class="icon"></span>folder0</a>
</ol> </li>
</ol>
</li>
</ol>
+18 -10
View File
@@ -1,12 +1,20 @@
<ol class="tree"> <ol class="tree">
<li> <li>
<label>folder0</label> <input type="checkbox" checked /> <label>folder0</label>
<ol> <input type="checkbox" />
<li class="file"><a href="folder0/0">0</a></li> <ol>
</ol> <li class="file">
<a href="folder0/0"><span class="icon"></span>0</a>
</li> </li>
<li> </ol>
<label>folder1</label> <input type="checkbox" checked /> </li>
<ol> <li>
<li class="file"><a href="folder1/1">1</a></li> <label>folder1</label>
</ol> <input type="checkbox" />
<ol>
<li class="file">
<a href="folder1/1"><span class="icon"></span>1</a>
</li>
</ol>
</li>
</ol>
+21 -11
View File
@@ -1,13 +1,23 @@
<ol class="tree"> <ol class="tree">
<li class="file"><a href="root">root</a></li> <li class="file">
<li> <a href="root"><span class="icon"></span>root</a>
<label>folder0</label> <input type="checkbox" checked /> </li>
<ol> <li>
<li class="file"><a href="folder0/0">0</a></li> <label>folder0</label>
</ol> <input type="checkbox" />
<ol>
<li class="file">
<a href="folder0/0"><span class="icon"></span>0</a>
</li> </li>
<li> </ol>
<label>folder1</label> <input type="checkbox" checked /> </li>
<ol> <li>
<li class="file"><a href="folder1/1">1</a></li> <label>folder1</label>
</ol> <input type="checkbox" />
<ol>
<li class="file">
<a href="folder1/1"><span class="icon"></span>1</a>
</li>
</ol>
</li>
</ol>
+35 -22
View File
@@ -1,28 +1,41 @@
<ol class="tree"> <ol class="tree">
<li>
<label>folder0</label>
<input type="checkbox" />
<ol>
<li> <li>
<label>folder0</label> <input type="checkbox" checked /> <label>folder1</label>
<input type="checkbox" />
<ol> <ol>
<li> <li>
<label>folder1</label> <input type="checkbox" checked /> <label>folder2</label>
<ol> <input type="checkbox" />
<li> <ol>
<label>folder2</label> <input type="checkbox" checked /> <li class="file">
<ol> <a href="folder0/folder1/folder2/0"><span class="icon"></span>0</a>
<li class="file"><a href="folder0/folder1/folder2/0">0</a></li> </li>
</ol>
</li>
<li>
<label>folder3</label>
<input type="checkbox" />
<ol>
<li class="file">
<a href="folder0/folder1/folder3/1"><span class="icon"></span>1</a>
</li>
</ol>
</li>
</ol> </ol>
</li> </li>
<li> </ol>
<label>folder3</label> <input type="checkbox" checked /> </li>
<ol> <li>
<li class="file"><a href="folder0/folder1/folder3/1">1</a></li> <label>folder4</label>
</ol> <input type="checkbox" />
<ol>
<li class="file">
<a href="folder4/2"><span class="icon"></span>2</a>
</li> </li>
</ol> </ol>
</li> </li>
</ol> </ol>
</li>
<li>
<label>folder4</label> <input type="checkbox" checked />
<ol>
<li class="file"><a href="folder4/2">2</a></li>
</ol>
+1 -1
View File
@@ -2,7 +2,7 @@ require 'rubygems'
require 'rack/test' require 'rack/test'
require 'test/unit' require 'test/unit'
require 'shoulda' require 'shoulda'
require 'mocha' require 'mocha/setup'
require 'fileutils' require 'fileutils'
dir = File.dirname(File.expand_path(__FILE__)) dir = File.dirname(File.expand_path(__FILE__))
+56
View File
@@ -15,6 +15,33 @@ context "Frontend" do
FileUtils.rm_rf(@path) FileUtils.rm_rf(@path)
end end
test "urls transform unicode" do
header = '_Header'
footer = '_Footer'
sidebar = '_Sidebar'
# header, footer, and sidebar must be preserved
# or gollum will not recognize them
assert_equal header, header.to_url
assert_equal footer, footer.to_url
assert_equal sidebar, sidebar.to_url
# spaces are converted to dashes in URLs
# and in file names saved to disk
# urls are not case sensitive
assert_equal 'title-space', 'Title Space'.to_url
# ascii only file names prevent UTF8 issues
# when using git repos across operating systems
# as this test demonstrates, translation is not
# great
assert_equal 'm-plus-f', 'μ†ℱ'.to_url
end
test 'utf-8 kcode' do
assert_equal 'μ†ℱ'.scan(/./), ["μ", "", ""]
end
test "retain edit information" do test "retain edit information" do
page1 = 'page1' page1 = 'page1'
user1 = 'user1' user1 = 'user1'
@@ -260,6 +287,9 @@ context "Frontend" do
page2 = @wiki.page('A') page2 = @wiki.page('A')
assert_equal page1.version.sha, page2.version.sha assert_equal page1.version.sha, page2.version.sha
end end
=begin
# redirects are now handled by class MapGollum in bin/gollum
# they should be set in config.ru
test "redirects from 'base_path' or 'base_path/' to 'base_path/Home'" do test "redirects from 'base_path' or 'base_path/' to 'base_path/Home'" do
Precious::App.set(:wiki_options, {}) Precious::App.set(:wiki_options, {})
@@ -277,6 +307,7 @@ context "Frontend" do
# Reset base path # Reset base path
Precious::App.set(:wiki_options, { :base_path => nil }) Precious::App.set(:wiki_options, { :base_path => nil })
end end
=end
test "author details in session are used" do test "author details in session are used" do
page1 = @wiki.page('A') page1 = @wiki.page('A')
@@ -363,6 +394,31 @@ context "Frontend with lotr" do
assert body.include?("Eye Of Sauron"), "/pages/Mordor/ should include the page 'Eye Of Sauron'" assert body.include?("Eye Of Sauron"), "/pages/Mordor/ should include the page 'Eye Of Sauron'"
end end
# base path requires 'map' in a config.ru to work correctly.
test "create pages within sub-directories using base path" do
Precious::App.set(:wiki_options, { :base_path => 'wiki' })
page = 'path'
post "/create", :content => '123', :page => page,
:path => 'Mordor', :format => 'markdown', :message => 'oooh, scary'
# should be wiki/Mordor/path
assert_equal 'http://example.org/Mordor/' + page, last_response.headers['Location']
get '/Mordor/' + page
assert_match /123/, last_response.body
# Reset base path
Precious::App.set(:wiki_options, { :base_path => nil })
end
test "create pages within sub-directories using page file dir" do
post "/create", :content => 'one two', :page => 'base',
:path => 'wiki/Mordor', :format => 'markdown', :message => 'oooh, scary'
assert_equal 'http://example.org/wiki/Mordor/base', last_response.headers['Location']
get "/wiki/Mordor/base"
assert_match /one two/, last_response.body
end
test "create pages within sub-directories" do test "create pages within sub-directories" do
post "/create", :content => 'big smelly creatures', :page => 'Orc', post "/create", :content => 'big smelly creatures', :page => 'Orc',
:path => 'Mordor', :format => 'markdown', :message => 'oooh, scary' :path => 'Mordor', :format => 'markdown', :message => 'oooh, scary'
+1 -1
View File
@@ -50,7 +50,7 @@ context "Wiki" do
end end
test "parents with default master ref" do test "parents with default master ref" do
ref = '629aa678272b017a4d136d35e77ac94d80b08dc2' ref = '7d6aeab8b84c895f21f6c66b84a457b0fced9693'
committer = Gollum::Committer.new(@wiki) committer = Gollum::Committer.new(@wiki)
assert_equal ref, committer.parents.first.sha assert_equal ref, committer.parents.first.sha
end end
+15 -1
View File
@@ -68,10 +68,24 @@ def write file, content
end end
end end
def to_html html
# Remove blank nodes for proper formatting
doc = Nokogiri.XML(html) do |cfg|
cfg.default_xml.noblanks
end
# Save as XHTML
doc.to_xml( { :save_with => Nokogiri::XML::Node::SaveOptions::DEFAULT_XHTML, :indent => 2, :encoding => 'UTF-8' } )
end
def check name, pages_array def check name, pages_array
pages = FakePages.new pages_array pages = FakePages.new pages_array
expected = read name expected = read name
actual = view pages actual = to_html view pages
# Uncomment when updating tests
# write name, actual
assert_equal expected, actual assert_equal expected, actual
end end
+1 -1
View File
@@ -18,7 +18,7 @@ context "GitAccess" do
assert @access.ref_map.empty? assert @access.ref_map.empty?
assert @access.tree_map.empty? assert @access.tree_map.empty?
@access.tree 'master' @access.tree 'master'
assert_equal({"master"=>"629aa678272b017a4d136d35e77ac94d80b08dc2"}, @access.ref_map) assert_equal({"master"=>"7d6aeab8b84c895f21f6c66b84a457b0fced9693"}, @access.ref_map)
@access.tree '1db89ebba7e2c14d93b94ff98cfa3708a4f0d4e3' @access.tree '1db89ebba7e2c14d93b94ff98cfa3708a4f0d4e3'
map = @access.tree_map['1db89ebba7e2c14d93b94ff98cfa3708a4f0d4e3'] map = @access.tree_map['1db89ebba7e2c14d93b94ff98cfa3708a4f0d4e3']
+62 -4
View File
@@ -25,15 +25,73 @@ context "gitcode" do
end end
test 'that the rendered output is correctly fetched and rendered as html code' do test 'that the rendered output is correctly fetched and rendered as html code' do
assert_equal %Q{<p>a</p>\n\n<div class=\"highlight\">\n <pre><span class=\"nt\">&lt;ol</span> <span class=\"na\">class=</span><span class=\"s\">\"tree\"</span><span class=\"nt\">&gt;</span>\n <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>\n<span class=\"nt\">&lt;/ol&gt;</span>\n</pre>\n</div>\n\n<p>b</p>}, @rendered assert_equal %Q{<p>a</p>\n\n<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>\n <span class=\"nt\">&lt;li</span> <span class=\"na\">class=</span><span class=\"s\">\"file\"</span><span class=\"nt\">&gt;</span>\n <span class=\"nt\">&lt;a</span> <span class=\"na\">href=</span><span class=\"s\">\"0\"</span><span class=\"nt\">&gt;&lt;span</span> <span class=\"na\">class=</span><span class=\"s\">\"icon\"</span><span class=\"nt\">&gt;&lt;/span&gt;</span>0<span class=\"nt\">&lt;/a&gt;</span>\n <span class=\"nt\">&lt;/li&gt;</span>\n<span class=\"nt\">&lt;/ol&gt;</span>\n</pre></div>\n\n<p>b</p>}, @rendered
end end
test 'contents' do test 'contents' do
g = Gollum::Gitcode.new 'github/gollum/master/test/file_view/1_file.txt' g = Gollum::Gitcode.new 'github/gollum/master/test/file_view/1_file.txt'
assert_equal g.contents, %{<ol class="tree"> assert_equal g.contents, %{<ol class=\"tree\">\n <li class=\"file\">\n <a href=\"0\"><span class=\"icon\"></span>0</a>\n </li>\n</ol>\n}
<li class="file"><a href="0">0</a></li> end
</ol>}
test "gitcode relative local file" do
@wiki.write_page("Bilbo Baggins", :markdown, "a\n```python:file-exists.py```\nb", commit_details)
page = @wiki.page('Bilbo Baggins')
index = @wiki.repo.index
index.add("file-exists.py", "import sys\n\nprint sys.maxint\n")
index.commit("Add file-exists.py")
@wiki.clear_cache
output = page.formatted_data
assert_equal %Q{<p>a\n</p><div class="highlight"><pre><span class="kn">import</span> <span class="nn">sys</span>\n\n<span class="k">print</span> <span class="n">sys</span><span class="o">.</span><span class="n">maxint</span>\n</pre></div>\n\n<p>b</p>}, output
end
test "gitcode relative local file in subdir" do
index = @wiki.repo.index
index.add("foo/file-exists.py", "import sys\n\nprint sys.maxint\n")
index.commit("Add file-exists.py")
@wiki.write_page("Pippin", :markdown, "a\n```python:file-exists.py```\nb", commit_details, 'foo')
page = @wiki.paged('Pippin', 'foo')
output = page.formatted_data
assert_equal %Q{<p>a\n</p><div class="highlight"><pre><span class="kn">import</span> <span class="nn">sys</span>\n\n<span class="k">print</span> <span class="n">sys</span><span class="o">.</span><span class="n">maxint</span>\n</pre></div>\n\n<p>b</p>}, output
end
test "gitcode relative no file" do
@wiki.write_page("Bilbo Baggins", :markdown, "a\n```python:no-file-exists.py```\nb", commit_details)
page = @wiki.page('Bilbo Baggins')
output = page.formatted_data
assert_equal %Q{<p>a\nFile not found: no-file-exists.py\nb</p>}, output
end
test "gitcode absolute local file" do
@wiki.write_page("Bilbo Baggins", :markdown, "a\n```python:/monkey/file-exists.py```\nb", commit_details)
page = @wiki.page('Bilbo Baggins')
index = @wiki.repo.index
index.add("monkey/file-exists.py", "import sys\n\nprint sys.platform\n")
index.commit("Add monkey/file-exists.py")
@wiki.clear_cache
output = page.formatted_data
assert_equal %Q{<p>a\n</p><div class="highlight"><pre><span class="kn">import</span> <span class="nn">sys</span>\n\n<span class="k">print</span> <span class="n">sys</span><span class="o">.</span><span class="n">platform</span>\n</pre></div>\n\n<p>b</p>}, output
end
test "gitcode absolute no file" do
@wiki.write_page("Bilbo Baggins", :markdown, "a\n```python:/monkey/no-file-exists.py```\nb", commit_details)
page = @wiki.page('Bilbo Baggins')
output = page.formatted_data
assert_equal %Q{<p>a\nFile not found: /monkey/no-file-exists.py\nb</p>}, output
end
test "gitcode error generates santized html" do
@wiki.write_page("Bilbo Baggins", :markdown, "a\n```python:<script>foo</script>```\nb", commit_details)
page = @wiki.page('Bilbo Baggins')
output = page.formatted_data
assert_equal %Q{<p>a\nFile not found: &lt;script&gt;foo&lt;/script&gt;\nb</p>}, output
end end
teardown do teardown do
+25
View File
@@ -0,0 +1,25 @@
# ~*~ encoding: utf-8 ~*~
require File.expand_path(File.join(File.dirname(__FILE__), 'helper'))
require File.expand_path '../../lib/gollum/frontend/views/history', __FILE__
context "Precious::Views::History" do
setup do
@history = Precious::Views::History.new
end
test "string_to_code" do
# Result must match the following Java code.
=begin
public static void main(String[] args) throws Exception {
final String s = "code@example.com";
final byte[] b = MessageDigest.getInstance("SHA1").digest(s.toString().getBytes("UTF-8"));
final int c = ((b[0] & 0xFF) << 24) | ((b[1] & 0xFF) << 16)
| ((b[2] & 0xFF) << 8) | (b[3] & 0xFF);
// 143327882
System.out.println(c);
}
=end
actual = @history.string_to_code 'code@example.com'
assert_equal 143327882, actual
end
end
+46 -30
View File
@@ -193,7 +193,7 @@ context "Markup" do
test "wiki link within inline code block" do test "wiki link within inline code block" do
@wiki.write_page("Potato", :markdown, "`sed -i '' 's/[[:space:]]*$//'`", commit_details) @wiki.write_page("Potato", :markdown, "`sed -i '' 's/[[:space:]]*$//'`", commit_details)
page = @wiki.page("Potato") page = @wiki.page("Potato")
assert_equal "<p>\n <code>sed -i '' 's/[[:space:]]*$//'</code>\n</p>", page.formatted_data assert_equal "<p><code>sed -i '' 's/[[:space:]]*$//'</code></p>", page.formatted_data
end end
test "regexp gsub! backref (#383)" do test "regexp gsub! backref (#383)" do
@@ -208,11 +208,24 @@ context "Markup" do
DATA DATA
), commit_details) ), commit_details)
output = @wiki.page(page).formatted_data output = @wiki.page(page).formatted_data
expected = %Q{<pre>\n <code> <div class=\"highlight\"><pre><span class=\"n\">rot13</span><span class=\"p\">=</span><span class=\"s\">'tr '</span><span class=\"o\">\\</span><span class=\"s\">''</span><span class=\"n\">A</span><span class=\"o\">-</span><span class=\"n\">Za</span><span class=\"o\">-</span><span class=\"n\">z</span><span class=\"o\">'\\</span><span class=\"s\">''</span> <span class=\"s\">'\\''N-ZA-Mn-za-m'</span><span class=\"o\">\\</span><span class=\"s\">'</span>\n</pre></div>\n</code>\n</pre>} expected = %Q{<pre><code> <div class=\"highlight\"><pre><span class=\"n\">rot13</span><span class=\"p\">=</span><span class=\"s\">'tr '</span><span class=\"o\">\\</span><span class=\"s\">''</span><span class=\"n\">A</span><span class=\"o\">-</span><span class=\"n\">Za</span><span class=\"o\">-</span><span class=\"n\">z</span><span class=\"o\">'\\</span><span class=\"s\">''</span> <span class=\"s\">'\\''N-ZA-Mn-za-m'</span><span class=\"o\">\\</span><span class=\"s\">'</span>\n</pre></div>\n</code></pre>}
assert_equal expected, output assert_equal expected, output
end end
test "~~~ code blocks #537" do # Issue #568
test "tilde code blocks without a language" do
page = 'test_rgx'
@wiki.write_page(page, :markdown,
%Q(~~~
'hi'
~~~
), commit_details)
output = @wiki.page(page).formatted_data
expected = %Q{<div class=\"highlight\"><pre><span class=\"s\">'hi'</span>\n</pre></div>}
assert_equal expected, output
end
test "tilde code blocks #537" do
page = 'test_rgx' page = 'test_rgx'
@wiki.write_page(page, :markdown, @wiki.write_page(page, :markdown,
%Q(~~~ {.ruby} %Q(~~~ {.ruby}
@@ -220,11 +233,12 @@ context "Markup" do
~~~ ~~~
), commit_details) ), commit_details)
output = @wiki.page(page).formatted_data output = @wiki.page(page).formatted_data
expected = %Q{<div class=\"highlight\">\n <pre><span class=\"s1\">'hi'</span>\n</pre>\n</div>} expected = %Q{<div class=\"highlight\"><pre><span class=\"s1\">'hi'</span>\n</pre></div>}
assert_equal expected, output assert_equal expected, output
end end
test "~~~ code blocks #537 with more than one class" do # Issue #537
test "tilde code blocks with more than one class" do
page = 'test_rgx' page = 'test_rgx'
@wiki.write_page(page, :markdown, @wiki.write_page(page, :markdown,
%Q(~~~ {#hi .ruby .sauce} %Q(~~~ {#hi .ruby .sauce}
@@ -232,11 +246,12 @@ context "Markup" do
~~~ ~~~
), commit_details) ), commit_details)
output = @wiki.page(page).formatted_data output = @wiki.page(page).formatted_data
expected = %Q{<div class=\"highlight\">\n <pre><span class=\"s1\">'hi'</span>\n</pre>\n</div>} expected = %Q{<div class=\"highlight\"><pre><span class=\"s1\">'hi'</span>\n</pre></div>}
assert_equal expected, output assert_equal expected, output
end end
test "~~~ code blocks #537 with lots of tildes" do # Issue #537
test "tilde code blocks with lots of tildes" do
page = 'test_rgx' page = 'test_rgx'
@wiki.write_page(page, :markdown, @wiki.write_page(page, :markdown,
%Q(~~~~~~ {#hi .ruby .sauce} %Q(~~~~~~ {#hi .ruby .sauce}
@@ -245,20 +260,30 @@ context "Markup" do
~~~~~~ ~~~~~~
), commit_details) ), commit_details)
output = @wiki.page(page).formatted_data output = @wiki.page(page).formatted_data
expected = %Q{<div class=\"highlight\">\n <pre><span class=\"o\">~~</span>\n<span class=\"s1\">'hi'</span><span class=\"o\">~</span>\n</pre>\n</div>} expected = %Q{<div class=\"highlight\"><pre><span class=\"o\">~~</span>\n<span class=\"s1\">'hi'</span><span class=\"o\">~</span>\n</pre></div>}
assert_equal expected, output
end
test "four space indented code block" do
page = 'test_four'
@wiki.write_page(page, :markdown,
%( test
test), commit_details)
output = @wiki.page(page).formatted_data
expected = %(<pre><code>test\ntest\n</code></pre>)
assert_equal expected, output assert_equal expected, output
end end
test "wiki link within code block" do test "wiki link within code block" do
@wiki.write_page("Potato", :markdown, " sed -i '' 's/[[:space:]]*$//'", commit_details) @wiki.write_page("Potato", :markdown, " sed -i '' 's/[[:space:]]*$//'", commit_details)
page = @wiki.page("Potato") page = @wiki.page("Potato")
assert_equal "<pre>\n <code>sed -i '' 's/[[:space:]]*$//'\n</code>\n</pre>", page.formatted_data assert_equal "<pre><code>sed -i '' 's/[[:space:]]*$//'\n</code></pre>", page.formatted_data
end end
test "piped wiki link within code block" do test "piped wiki link within code block" do
@wiki.write_page("Potato", :markdown, "`make a link [[home|sweet home]]`", commit_details) @wiki.write_page("Potato", :markdown, "`make a link [[home|sweet home]]`", commit_details)
page = @wiki.page("Potato") page = @wiki.page("Potato")
assert_equal "<p>\n <code>make a link [[home|sweet home]]</code>\n</p>", page.formatted_data assert_equal "<p><code>make a link [[home|sweet home]]</code></p>", page.formatted_data
end end
######################################################################### #########################################################################
@@ -459,9 +484,9 @@ context "Markup" do
# #
######################################################################### #########################################################################
test "code blocks" do test "regular code blocks" do
content = "a\n\n```ruby\nx = 1\n```\n\nb" content = "a\n\n```ruby\nx = 1\n```\n\nb"
output = %Q{<p>a</p>\n\n<div class=\"highlight\">\n <pre><span class=\"n\">x</span> <span class=\"o\">=</span> <span class=\"mi\">1</span>\n</pre>\n</div>\n\n<p>b</p>} output = %Q{<p>a</p>\n\n<div class=\"highlight\"><pre><span class=\"n\">x</span> <span class=\"o\">=</span> <span class=\"mi\">1</span>\n</pre></div>\n\n<p>b</p>}
index = @wiki.repo.index index = @wiki.repo.index
index.add("Bilbo-Baggins.md", content) index.add("Bilbo-Baggins.md", content)
@@ -474,7 +499,7 @@ context "Markup" do
test "code blocks with carriage returns" do test "code blocks with carriage returns" do
content = "a\r\n\r\n```ruby\r\nx = 1\r\n```\r\n\r\nb" content = "a\r\n\r\n```ruby\r\nx = 1\r\n```\r\n\r\nb"
output = %Q{<p>a</p>\n\n<div class=\"highlight\">\n <pre><span class=\"n\">x</span> <span class=\"o\">=</span> <span class=\"mi\">1</span>\n</pre>\n</div>\n\n<p>b</p>} output = %Q{<p>a</p>\n\n<div class=\"highlight\"><pre><span class=\"n\">x</span> <span class=\"o\">=</span> <span class=\"mi\">1</span>\n</pre></div>\n\n<p>b</p>}
index = @wiki.repo.index index = @wiki.repo.index
index.add("Bilbo-Baggins.md", content) index.add("Bilbo-Baggins.md", content)
@@ -505,7 +530,7 @@ context "Markup" do
test "code blocks with multibyte caracters indent" do test "code blocks with multibyte caracters indent" do
content = "a\n\n```ruby\ns = 'やくしまるえつこ'\n```\n\nb" content = "a\n\n```ruby\ns = 'やくしまるえつこ'\n```\n\nb"
output = %Q{<p>a</p>\n\n<div class=\"highlight\">\n <pre><span class=\"n\">s</span> <span class=\"o\">=</span> <span class=\"s1\">'やくしまるえつこ'</span>\n</pre>\n</div>\n\n<p>b</p>} output = %Q{<p>a</p>\n\n<div class=\"highlight\"><pre><span class=\"n\">s</span> <span class=\"o\">=</span> <span class=\"s1\">'やくしまるえつこ'</span>\n</pre></div>\n\n<p>b</p>}
index = @wiki.repo.index index = @wiki.repo.index
index.add("Bilbo-Baggins.md", content) index.add("Bilbo-Baggins.md", content)
index.commit("Add alpha.jpg") index.commit("Add alpha.jpg")
@@ -557,24 +582,13 @@ np.array([[2,2],[1,3]],np.float)
assert_match /\(\[\[/, rendered, "#{markup_class} parses out wiki links\n#{rendered}" assert_match /\(\[\[/, rendered, "#{markup_class} parses out wiki links\n#{rendered}"
end end
test "embed code is escaped" do
@wiki.write_page("script", :markdown, "a <script></script> b", commit_details)
@wiki.write_page("page", :markdown, "```html:script```", commit_details)
output_script = @wiki.page("script").formatted_data
output_page = @wiki.page("page").formatted_data
assert_equal %Q{<p>a b</p>}, output_script
assert_equal %Q{<div class=\"highlight\">\n <pre><span class=\"nt\">&lt;p&gt;</span>a b<span class=\"nt\">&lt;/p&gt;</span>\n</pre>\n</div>}, output_page
end
test "embed code page absolute link" do test "embed code page absolute link" do
@wiki.write_page("base", :markdown, "a\n!base\b", commit_details) @wiki.write_page("base", :markdown, "a\n!base\b", commit_details)
@wiki.write_page("a", :markdown, "a\n```html:/base```\b", commit_details) @wiki.write_page("a", :markdown, "a\n```html:/base```\b", commit_details)
page = @wiki.page("a") page = @wiki.page("a")
output = page.formatted_data output = page.formatted_data
assert_equal %Q{<p>a\n</p><div class=\"highlight\">\n <pre><span class=\"nt\">&lt;p&gt;</span>a\n!base<span class=\"nt\">&lt;/p&gt;</span>\n</pre>\n</div>\n}, output assert_equal %Q{<p>a\nFile not found: /base</p>}, output
end end
test "embed code page relative link" do test "embed code page relative link" do
@@ -583,7 +597,7 @@ np.array([[2,2],[1,3]],np.float)
page = @wiki.page("a") page = @wiki.page("a")
output = page.formatted_data output = page.formatted_data
assert_equal %Q{<p>a\n</p><div class=\"highlight\">\n <pre><span class=\"nt\">&lt;p&gt;</span>a\n!rel<span class=\"nt\">&lt;/p&gt;</span>\n</pre>\n</div>\n}, output assert_equal %Q{<p>a\nFile not found: base</p>}, output
end end
test "code block in unsupported language" do test "code block in unsupported language" do
@@ -631,7 +645,7 @@ np.array([[2,2],[1,3]],np.float)
page = @wiki.page("Bilbo Baggins") page = @wiki.page("Bilbo Baggins")
rendered = Gollum::Markup.new(page).render rendered = Gollum::Markup.new(page).render
assert_equal output, rendered assert_equal output, rendered
assert_equal result, page.meta_data assert_equal result, page.metadata
end end
test "metadata blocks with newline" do test "metadata blocks with newline" do
@@ -646,7 +660,7 @@ np.array([[2,2],[1,3]],np.float)
page = @wiki.page("Bilbo Baggins") page = @wiki.page("Bilbo Baggins")
rendered = Gollum::Markup.new(page).render rendered = Gollum::Markup.new(page).render
assert_equal output, rendered assert_equal output, rendered
assert_equal result, page.meta_data assert_equal result, page.metadata
end end
test "metadata sanitation" do test "metadata sanitation" do
@@ -661,7 +675,7 @@ np.array([[2,2],[1,3]],np.float)
page = @wiki.page("Bilbo Baggins") page = @wiki.page("Bilbo Baggins")
rendered = Gollum::Markup.new(page).render rendered = Gollum::Markup.new(page).render
assert_equal output, rendered assert_equal output, rendered
assert_equal result, page.meta_data assert_equal result, page.metadata
end end
######################################################################### #########################################################################
@@ -758,6 +772,7 @@ end
] ]
end end
if ENV['ASCIIDOC']
######################################################################### #########################################################################
# Asciidoc # Asciidoc
######################################################################### #########################################################################
@@ -769,6 +784,7 @@ end
test "internal links with asciidoc" do test "internal links with asciidoc" do
compare("= Book Title\n\n[[anid]]\n== Heading", '<div class="sect1"><h2 id="wiki-anid">Heading<a class="anchor" id="Heading" href="#Heading"></a></h2><div class="sectionbody"></div></div>', 'asciidoc') compare("= Book Title\n\n[[anid]]\n== Heading", '<div class="sect1"><h2 id="wiki-anid">Heading<a class="anchor" id="Heading" href="#Heading"></a></h2><div class="sectionbody"></div></div>', 'asciidoc')
end end
end
######################################################################### #########################################################################
# #
+7
View File
@@ -227,5 +227,12 @@ context "within a sub-directory" do
assert page.header.raw_data =~ /^Hobbits/ assert page.header.raw_data =~ /^Hobbits/
assert page.footer.raw_data =~ /^Lord of the Rings/ assert page.footer.raw_data =~ /^Lord of the Rings/
end end
test "get metadata on page" do
page = @wiki.page('Elrond')
assert_equal Gollum::Page, page.class
assert_equal 'elf', page.metadata['race']
end
end end
+8
View File
@@ -198,6 +198,14 @@ context "Wiki page writing" do
assert_equal cd[:email], @wiki.repo.commits.first.author.email assert_equal cd[:email], @wiki.repo.commits.first.author.email
end end
test "page title override with metadata" do
@wiki.write_page("Gollum", :markdown, "<!-- --- title: Over -->", commit_details)
page = @wiki.page("Gollum")
assert_equal 'Over', page.url_path_title
end
test "update page with format change" do test "update page with format change" do
@wiki.write_page("Gollum", :markdown, "# Gollum", commit_details) @wiki.write_page("Gollum", :markdown, "# Gollum", commit_details)
+4 -2
View File
@@ -1,10 +1,12 @@
class WikiFactory class WikiFactory
def self.create p def self.create p, opt={}
path = testpath "examples/test.git" path = testpath "examples/test.git"
Grit::Repo.init_bare(path) Grit::Repo.init_bare(path)
Gollum::Wiki.default_options = {:universal_toc => false} Gollum::Wiki.default_options = {:universal_toc => false}.merge(opt)
cleanup = Proc.new { FileUtils.rm_r File.join(File.dirname(__FILE__), *%w[examples test.git]) } cleanup = Proc.new { FileUtils.rm_r File.join(File.dirname(__FILE__), *%w[examples test.git]) }
wiki = Gollum::Wiki.new(path) wiki = Gollum::Wiki.new(path)
# set 'wiki-' prefix on ids for tests
wiki.sanitization.id_prefix = 'wiki-'
return wiki, path, cleanup return wiki, path, cleanup
end end
end end