Compare commits
17 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| f3fd06ef7a | |||
| d97721f38b | |||
| 8d3ec8605e | |||
| 7517389072 | |||
| b7011139cf | |||
| 6e8a68dd0d | |||
| 4e8309d3e4 | |||
| 371ab21d16 | |||
| cbcbc4bc3f | |||
| dc9b2e1766 | |||
| 334df62651 | |||
| 046353cf7e | |||
| 51f2f032d7 | |||
| 70360edb96 | |||
| 2b12ab9206 | |||
| 87a01e04ce | |||
| 5f04200bd0 |
@@ -0,0 +1,39 @@
|
|||||||
|
name: Deploy docker
|
||||||
|
on: [push]
|
||||||
|
env:
|
||||||
|
DEPLOY_NAME: gollumwiki/gollum:latest
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
if: ${{ github.ref == 'refs/heads/master' }}
|
||||||
|
steps:
|
||||||
|
- name: Check Out Repo
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
- name: Login
|
||||||
|
uses: docker/login-action@v1
|
||||||
|
with:
|
||||||
|
username: ${{ secrets.DOCKER_HUB_USERNAME }}
|
||||||
|
password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
id: buildx
|
||||||
|
uses: docker/setup-buildx-action@v1
|
||||||
|
- name: Cache docker layers
|
||||||
|
uses: actions/cache@v2
|
||||||
|
with:
|
||||||
|
path: /tmp/.buildx-cache
|
||||||
|
key: ${{ runner.os }}-buildx-${{ github.sha }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-buildx-
|
||||||
|
- name: Build and push
|
||||||
|
id: docker_build
|
||||||
|
uses: docker/build-push-action@v2
|
||||||
|
with:
|
||||||
|
context: ./
|
||||||
|
file: ./Dockerfile
|
||||||
|
builder: ${{ steps.buildx.outputs.name }}
|
||||||
|
push: true
|
||||||
|
tags: ${{ env.DEPLOY_NAME }}
|
||||||
|
cache-from: type=local,src=/tmp/.buildx-cache
|
||||||
|
cache-to: type=local,dest=/tmp/.buildx-cache
|
||||||
|
- name: Image digest
|
||||||
|
run: echo ${{ steps.docker_build.outputs.digest }}
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
name: Build and Test Docker
|
||||||
|
on: [push, pull_request]
|
||||||
|
env:
|
||||||
|
CI_IMAGE: gollum-ci-img
|
||||||
|
jobs:
|
||||||
|
build-and-test:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Check Out Repo
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
id: buildx
|
||||||
|
uses: docker/setup-buildx-action@v1
|
||||||
|
- name: Cache docker layers
|
||||||
|
uses: actions/cache@v2
|
||||||
|
with:
|
||||||
|
path: /tmp/.buildx-cache
|
||||||
|
key: ${{ runner.os }}-buildx-${{ github.sha }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-buildx-
|
||||||
|
- name: Build
|
||||||
|
id: docker_build
|
||||||
|
uses: docker/build-push-action@v2
|
||||||
|
with:
|
||||||
|
context: ./
|
||||||
|
file: ./Dockerfile
|
||||||
|
builder: ${{ steps.buildx.outputs.name }}
|
||||||
|
push: false
|
||||||
|
tags: ${{ env.CI_IMAGE }}
|
||||||
|
outputs: type=docker
|
||||||
|
cache-from: type=local,src=/tmp/.buildx-cache
|
||||||
|
cache-to: type=local,dest=/tmp/.buildx-cache
|
||||||
|
- name: Image digest
|
||||||
|
run: echo ${{ steps.docker_build.outputs.digest }}
|
||||||
|
- name: docker state
|
||||||
|
run: docker image ls
|
||||||
|
- name: Run tests
|
||||||
|
run: docker run -e CI=true -w /app --entrypoint bundle ${{ env.CI_IMAGE }} exec rake
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
on:
|
||||||
|
push:
|
||||||
|
# Sequence of patterns matched against refs/tags
|
||||||
|
tags:
|
||||||
|
- 'v*' # Push events to matching v*, i.e. v1.0, v20.15.10
|
||||||
|
|
||||||
|
name: Create Release
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
name: Create Release
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
- name: Create Release
|
||||||
|
id: create_release
|
||||||
|
uses: actions/create-release@v1
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # This token is provided by Actions, you do not need to create your own token
|
||||||
|
with:
|
||||||
|
tag_name: ${{ github.ref }}
|
||||||
|
release_name: Release ${{ github.ref }}
|
||||||
|
draft: false
|
||||||
|
prerelease: false
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
name: Ruby Build
|
||||||
|
on: [push, pull_request]
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
ruby: [2.4.0, 2.6.0, 3.0.0, jruby-9.2.18.0]
|
||||||
|
steps:
|
||||||
|
- run: echo "The job was automatically triggered by a ${{ github.event_name }} event."
|
||||||
|
- run: echo "This job is now running on a ${{ runner.os }} server hosted by GitHub!"
|
||||||
|
- run: echo "The name of your branch is ${{ github.ref }} and your repository is ${{ github.repository }}."
|
||||||
|
- name: Check out repository code
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
- run: echo "The ${{ github.repository }} repository has been cloned to the runner."
|
||||||
|
- run: echo "The workflow is now ready to test your code on the runner."
|
||||||
|
- name: List files in the repository
|
||||||
|
run: |
|
||||||
|
ls ${{ github.workspace }}
|
||||||
|
- uses: actions/setup-java@v2
|
||||||
|
with:
|
||||||
|
distribution: 'temurin'
|
||||||
|
java-version: '11'
|
||||||
|
- uses: ruby/setup-ruby@v1
|
||||||
|
with:
|
||||||
|
ruby-version: ${{ matrix.ruby }}
|
||||||
|
bundler-cache: true
|
||||||
|
- name: exec rake
|
||||||
|
run: bundle exec rake
|
||||||
@@ -8,3 +8,4 @@ Gemfile.lock
|
|||||||
.*
|
.*
|
||||||
!.sprockets*
|
!.sprockets*
|
||||||
!lib/gollum/public/gollum/stylesheets/_styles.css
|
!lib/gollum/public/gollum/stylesheets/_styles.css
|
||||||
|
!.github*
|
||||||
|
|||||||
-10
@@ -1,10 +0,0 @@
|
|||||||
rvm:
|
|
||||||
- 2.4.0
|
|
||||||
- 2.6.0
|
|
||||||
- 3.0.0
|
|
||||||
- jruby-9.2.18.0
|
|
||||||
jdk:
|
|
||||||
- oraclejdk9
|
|
||||||
before_install:
|
|
||||||
- sudo apt-get update
|
|
||||||
- sudo apt-get install libicu-dev
|
|
||||||
+29
@@ -0,0 +1,29 @@
|
|||||||
|
FROM ruby:2.7
|
||||||
|
ENV DEBIAN_FRONTEND="noninteractive"
|
||||||
|
|
||||||
|
RUN apt-get update && apt-get install -y \
|
||||||
|
libicu-dev \
|
||||||
|
cmake
|
||||||
|
|
||||||
|
COPY Gemfile* /tmp/
|
||||||
|
COPY gollum.gemspec* /tmp/
|
||||||
|
WORKDIR /tmp
|
||||||
|
RUN bundle install
|
||||||
|
|
||||||
|
RUN gem install \
|
||||||
|
asciidoctor \
|
||||||
|
creole \
|
||||||
|
wikicloth \
|
||||||
|
org-ruby \
|
||||||
|
RedCloth \
|
||||||
|
bibtex-ruby \
|
||||||
|
&& echo "gem-extra complete"
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
COPY . /app
|
||||||
|
RUN bundle exec rake install
|
||||||
|
|
||||||
|
VOLUME /wiki
|
||||||
|
WORKDIR /wiki
|
||||||
|
COPY docker-run.sh /docker-run.sh
|
||||||
|
ENTRYPOINT ["/docker-run.sh"]
|
||||||
@@ -2,10 +2,11 @@ gollum -- A git-based Wiki
|
|||||||
====================================
|
====================================
|
||||||
|
|
||||||
[](http://badge.fury.io/rb/gollum)
|
[](http://badge.fury.io/rb/gollum)
|
||||||
[](https://travis-ci.org/gollum/gollum)
|

|
||||||
[](https://www.codetriage.com/gollum/gollum)
|
[](https://www.codetriage.com/gollum/gollum)
|
||||||
[](https://dometto-cuttingedge.herokuapp.com/github/gollum/gollum/info)
|
[](https://dometto-cuttingedge.herokuapp.com/github/gollum/gollum/info)
|
||||||
|
|
||||||
|
|
||||||
**Gollum version 5.0 is out!** See [here](https://github.com/gollum/gollum/wiki/5.0-release-notes) for a list of changes and new features compared to Gollum version 4.x, and see some [Screenshots](https://github.com/gollum/gollum/wiki/Screenshots) of Gollum's features.
|
**Gollum version 5.0 is out!** See [here](https://github.com/gollum/gollum/wiki/5.0-release-notes) for a list of changes and new features compared to Gollum version 4.x, and see some [Screenshots](https://github.com/gollum/gollum/wiki/Screenshots) of Gollum's features.
|
||||||
|
|
||||||
## DESCRIPTION
|
## DESCRIPTION
|
||||||
@@ -36,16 +37,16 @@ Gollum runs on Unix-like systems using its [adapter](https://github.com/gollum/r
|
|||||||
## INSTALLATION
|
## INSTALLATION
|
||||||
|
|
||||||
1. Ruby is best installed either via [RVM](https://rvm.io/) or a package manager of choice.
|
1. Ruby is best installed either via [RVM](https://rvm.io/) or a package manager of choice.
|
||||||
2. Gollum is best installed via RubyGems:
|
2. Gollum is best installed via RubyGems:
|
||||||
```
|
```
|
||||||
[sudo] gem install gollum
|
[sudo] gem install gollum
|
||||||
```
|
```
|
||||||
|
|
||||||
Installation examples for individual systems can be seen [here](https://github.com/gollum/gollum/wiki/Installation).
|
Installation examples for individual systems can be seen [here](https://github.com/gollum/gollum/wiki/Installation).
|
||||||
|
|
||||||
To run, simply:
|
To run, simply:
|
||||||
|
|
||||||
1. Run: `gollum /path/to/wiki`.
|
1. Run: `gollum /path/to/wiki` where `/path/to/wiki` is an initialized Git repository.
|
||||||
2. Open `http://localhost:4567` in your browser.
|
2. Open `http://localhost:4567` in your browser.
|
||||||
|
|
||||||
See [below](#running-from-source) for information on running Gollum from source, as a Rack app, and more.
|
See [below](#running-from-source) for information on running Gollum from source, as a Rack app, and more.
|
||||||
@@ -83,19 +84,19 @@ See [here](https://github.com/gollum/gollum/wiki/Custom-rendering-gems) for inst
|
|||||||
|
|
||||||
### Rack
|
### Rack
|
||||||
|
|
||||||
Gollum can also be ran with any [rack-compatible web server](https://github.com/rack/rack#supported-web-servers). More on that [over here](https://github.com/gollum/gollum/wiki/Gollum-via-Rack).
|
Gollum can also be run with any [rack-compatible web server](https://github.com/rack/rack#supported-web-servers). More on that [over here](https://github.com/gollum/gollum/wiki/Gollum-via-Rack).
|
||||||
|
|
||||||
### Rack, with an authentication server
|
### Rack, with an authentication server
|
||||||
|
|
||||||
Gollum can also be ran alongside a CAS (Central Authentication Service) SSO (single sign-on) server. With a bit of tweaking, this adds basic user-support to Gollum. To see an example and an explanation, navigate [over here](https://github.com/gollum/gollum/wiki/Gollum-via-Rack-and-CAS-SSO).
|
Gollum can also be run alongside a CAS (Central Authentication Service) SSO (single sign-on) server. With a bit of tweaking, this adds basic user-support to Gollum. To see an example and an explanation, navigate [over here](https://github.com/gollum/gollum/wiki/Gollum-via-Rack-and-CAS-SSO).
|
||||||
|
|
||||||
### Docker
|
### Docker
|
||||||
|
|
||||||
Gollum can also be ran via [Docker](https://www.docker.com/). More on that [over here](https://github.com/gollum/gollum/wiki/Gollum-via-Docker).
|
Gollum can also be run via [Docker](https://www.docker.com/). More on that [over here](https://github.com/gollum/gollum/wiki/Gollum-via-Docker).
|
||||||
|
|
||||||
### Service
|
### Service
|
||||||
|
|
||||||
Gollum can also be ran as a service. More on that [over here](https://github.com/gollum/gollum/wiki/Gollum-as-a-service).
|
Gollum can also be run as a service. More on that [over here](https://github.com/gollum/gollum/wiki/Gollum-as-a-service).
|
||||||
|
|
||||||
## CONFIGURATION
|
## CONFIGURATION
|
||||||
|
|
||||||
@@ -125,7 +126,7 @@ Gollum comes with the following command line options:
|
|||||||
| --no-display-metadata | none | Do not render metadata tables in pages. |
|
| --no-display-metadata | none | Do not render metadata tables in pages. |
|
||||||
| --user-icons | [MODE] | Tell Gollum to use specific user icons for history view. Can be set to `gravatar`, `identicon` or `none`. Default: `none`. |
|
| --user-icons | [MODE] | Tell Gollum to use specific user icons for history view. Can be set to `gravatar`, `identicon` or `none`. Default: `none`. |
|
||||||
| --mathjax-config | [FILE] | Specify path to a custom MathJax configuration. If not specified, uses the `mathjax.config.js` file from repository root. |
|
| --mathjax-config | [FILE] | Specify path to a custom MathJax configuration. If not specified, uses the `mathjax.config.js` file from repository root. |
|
||||||
| --template-dir | [PATH] | Specify custom mustache template directory. |
|
| --template-dir | [PATH] | Specify custom mustache template directory. Only overrides templates that exist in this directory. |
|
||||||
| --template-page | none | Use _Template in root as a template for new pages. Must be committed. |
|
| --template-page | none | Use _Template in root as a template for new pages. Must be committed. |
|
||||||
| --emoji | none | Parse and interpret emoji tags (e.g. `:heart:`) except when the leading colon is backslashed (e.g. `\:heart:`). |
|
| --emoji | none | Parse and interpret emoji tags (e.g. `:heart:`) except when the leading colon is backslashed (e.g. `\:heart:`). |
|
||||||
| --lenient-tag-lookup | none | Internal links resolve case-insensitively, will treat spaces as hyphens, and will match the first page found with a certain filename, anywhere in the repository. Provides compatibility with Gollum 4.x. |
|
| --lenient-tag-lookup | none | Internal links resolve case-insensitively, will treat spaces as hyphens, and will match the first page found with a certain filename, anywhere in the repository. Provides compatibility with Gollum 4.x. |
|
||||||
@@ -149,3 +150,7 @@ When `--config` option is used, certain inner parts of Gollum can be customized.
|
|||||||
## CONTRIBUTING
|
## CONTRIBUTING
|
||||||
|
|
||||||
Please consider helping out! See [CONTRIBUTING](CONTRIBUTING.md) for information on how to submit issues, and how to start hacking on gollum.
|
Please consider helping out! See [CONTRIBUTING](CONTRIBUTING.md) for information on how to submit issues, and how to start hacking on gollum.
|
||||||
|
|
||||||
|
## THANKS TO
|
||||||
|
|
||||||
|
[](https://saucelabs.com)
|
||||||
|
|||||||
+1
-2
@@ -149,7 +149,7 @@ MSG
|
|||||||
'Can be set to \'gravatar\' or \'identicon\'. Default: standard avatar.') do |mode|
|
'Can be set to \'gravatar\' or \'identicon\'. Default: standard avatar.') do |mode|
|
||||||
wiki_options[:user_icons] = mode.to_s
|
wiki_options[:user_icons] = mode.to_s
|
||||||
end
|
end
|
||||||
opts.on('--template-dir [PATH]', 'Specify custom mustache template directory.') do |path|
|
opts.on('--template-dir [PATH]', 'Specify custom mustache template directory. Only overrides templates that exist in this directory.') do |path|
|
||||||
wiki_options[:template_dir] = path
|
wiki_options[:template_dir] = path
|
||||||
end
|
end
|
||||||
opts.on('--template-page', 'Use _Template.{ext} as a template for new pages.') do
|
opts.on('--template-page', 'Use _Template.{ext} as a template for new pages.') do
|
||||||
@@ -271,7 +271,6 @@ else
|
|||||||
Precious::App.set(:environment, ENV.fetch('RACK_ENV', :production).to_sym)
|
Precious::App.set(:environment, ENV.fetch('RACK_ENV', :production).to_sym)
|
||||||
Precious::App.set(:gollum_path, gollum_path)
|
Precious::App.set(:gollum_path, gollum_path)
|
||||||
Precious::App.set(:wiki_options, wiki_options)
|
Precious::App.set(:wiki_options, wiki_options)
|
||||||
Precious::App.settings.mustache[:templates] = wiki_options[:template_dir] if wiki_options[:template_dir]
|
|
||||||
|
|
||||||
if cfg = options[:config]
|
if cfg = options[:config]
|
||||||
# If the path begins with a '/' it will be considered an absolute path,
|
# If the path begins with a '/' it will be considered an absolute path,
|
||||||
|
|||||||
Executable
+9
@@ -0,0 +1,9 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Initialize the wiki
|
||||||
|
if [ ! -d .git ]; then
|
||||||
|
git init
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Start gollum service
|
||||||
|
gollum --mathjax
|
||||||
+2
-1
@@ -28,7 +28,7 @@ Gem::Specification.new do |s|
|
|||||||
s.add_dependency 'kramdown-parser-gfm', '~> 1.1.0'
|
s.add_dependency 'kramdown-parser-gfm', '~> 1.1.0'
|
||||||
s.add_dependency 'sinatra', '~> 2.0'
|
s.add_dependency 'sinatra', '~> 2.0'
|
||||||
s.add_dependency 'sinatra-contrib', '~> 2.0'
|
s.add_dependency 'sinatra-contrib', '~> 2.0'
|
||||||
s.add_dependency 'mustache-sinatra', '~> 1.0'
|
s.add_dependency 'mustache-sinatra', '>= 1.0.1', '< 2'
|
||||||
s.add_dependency 'useragent', '~> 0.16.2'
|
s.add_dependency 'useragent', '~> 0.16.2'
|
||||||
s.add_dependency 'gemojione', '~> 4.1'
|
s.add_dependency 'gemojione', '~> 4.1'
|
||||||
s.add_dependency 'octicons', '~> 12.0'
|
s.add_dependency 'octicons', '~> 12.0'
|
||||||
@@ -39,6 +39,7 @@ Gem::Specification.new do |s|
|
|||||||
s.add_dependency 'rss', '~> 0.2.9'
|
s.add_dependency 'rss', '~> 0.2.9'
|
||||||
s.add_dependency 'therubyrhino', '~> 2.1.0'
|
s.add_dependency 'therubyrhino', '~> 2.1.0'
|
||||||
s.add_dependency 'webrick', '~> 1.7'
|
s.add_dependency 'webrick', '~> 1.7'
|
||||||
|
s.add_dependency 'i18n', '~> 1.8'
|
||||||
|
|
||||||
s.add_development_dependency 'rack-test', '~> 0.6.3'
|
s.add_development_dependency 'rack-test', '~> 0.6.3'
|
||||||
s.add_development_dependency 'shoulda', '~> 3.6.0'
|
s.add_development_dependency 'shoulda', '~> 3.6.0'
|
||||||
|
|||||||
+6
-3
@@ -5,19 +5,23 @@ require 'digest/sha1'
|
|||||||
require 'ostruct'
|
require 'ostruct'
|
||||||
|
|
||||||
# external
|
# external
|
||||||
|
require 'i18n'
|
||||||
require 'github/markup'
|
require 'github/markup'
|
||||||
require 'rhino' if RUBY_PLATFORM == 'java'
|
require 'rhino' if RUBY_PLATFORM == 'java'
|
||||||
|
|
||||||
# internal
|
# internal
|
||||||
require File.expand_path('../gollum/uri_encode_component', __FILE__)
|
require ::File.expand_path('../gollum/uri_encode_component', __FILE__)
|
||||||
|
|
||||||
module Gollum
|
module Gollum
|
||||||
VERSION = '5.2.3'
|
VERSION = '5.2.3'
|
||||||
|
|
||||||
|
::I18n.available_locales = [:en]
|
||||||
|
::I18n.load_path = Dir[::File.expand_path("lib/gollum/locales") + "/*.yml"]
|
||||||
|
|
||||||
def self.assets_path
|
def self.assets_path
|
||||||
::File.expand_path('gollum/public', ::File.dirname(__FILE__))
|
::File.expand_path('gollum/public', ::File.dirname(__FILE__))
|
||||||
end
|
end
|
||||||
|
|
||||||
class TemplateFilter
|
class TemplateFilter
|
||||||
@@filters = {}
|
@@filters = {}
|
||||||
|
|
||||||
@@ -32,5 +36,4 @@ module Gollum
|
|||||||
data
|
data
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
+24
-15
@@ -1,4 +1,5 @@
|
|||||||
# ~*~ encoding: utf-8 ~*~
|
# encoding: UTF-8
|
||||||
|
|
||||||
require 'cgi'
|
require 'cgi'
|
||||||
require 'sinatra'
|
require 'sinatra'
|
||||||
require 'sinatra/namespace'
|
require 'sinatra/namespace'
|
||||||
@@ -14,12 +15,14 @@ require 'pathname'
|
|||||||
require 'gollum'
|
require 'gollum'
|
||||||
require 'gollum/assets'
|
require 'gollum/assets'
|
||||||
require 'gollum/views/helpers'
|
require 'gollum/views/helpers'
|
||||||
|
require 'gollum/views/helpers/locale_helpers'
|
||||||
require 'gollum/views/layout'
|
require 'gollum/views/layout'
|
||||||
require 'gollum/views/editable'
|
require 'gollum/views/editable'
|
||||||
require 'gollum/views/has_page'
|
require 'gollum/views/has_page'
|
||||||
require 'gollum/views/has_user_icons'
|
require 'gollum/views/has_user_icons'
|
||||||
require 'gollum/views/pagination'
|
require 'gollum/views/pagination'
|
||||||
require 'gollum/views/rss.rb'
|
require 'gollum/views/rss.rb'
|
||||||
|
require 'gollum/views/template_cascade'
|
||||||
|
|
||||||
require File.expand_path '../helpers', __FILE__
|
require File.expand_path '../helpers', __FILE__
|
||||||
|
|
||||||
@@ -40,7 +43,7 @@ Gollum::set_git_max_filesize(190 * 10**6)
|
|||||||
# See the wiki.rb file for more details on wiki options
|
# See the wiki.rb file for more details on wiki options
|
||||||
|
|
||||||
module Precious
|
module Precious
|
||||||
|
|
||||||
# For use with the --base-path option.
|
# For use with the --base-path option.
|
||||||
class MapGollum
|
class MapGollum
|
||||||
def initialize(base_path)
|
def initialize(base_path)
|
||||||
@@ -63,12 +66,14 @@ module Precious
|
|||||||
@mg.call(env)
|
@mg.call(env)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
class App < Sinatra::Base
|
class App < Sinatra::Base
|
||||||
register Mustache::Sinatra
|
register Mustache::Sinatra
|
||||||
register Sinatra::Namespace
|
register Sinatra::Namespace
|
||||||
include Precious::Helpers
|
include Precious::Helpers
|
||||||
|
|
||||||
|
Encoding.default_external = "UTF-8"
|
||||||
|
|
||||||
dir = File.dirname(File.expand_path(__FILE__))
|
dir = File.dirname(File.expand_path(__FILE__))
|
||||||
|
|
||||||
set :sprockets, ::Precious::Assets.sprockets(dir)
|
set :sprockets, ::Precious::Assets.sprockets(dir)
|
||||||
@@ -102,11 +107,15 @@ module Precious
|
|||||||
@critic_markup = settings.wiki_options[:critic_markup]
|
@critic_markup = settings.wiki_options[:critic_markup]
|
||||||
@redirects_enabled = settings.wiki_options.fetch(:redirects_enabled, true)
|
@redirects_enabled = settings.wiki_options.fetch(:redirects_enabled, true)
|
||||||
@per_page_uploads = settings.wiki_options[:per_page_uploads]
|
@per_page_uploads = settings.wiki_options[:per_page_uploads]
|
||||||
|
|
||||||
@wiki_title = settings.wiki_options.fetch(:title, 'Gollum Wiki')
|
@wiki_title = settings.wiki_options.fetch(:title, 'Gollum Wiki')
|
||||||
|
|
||||||
forbid unless @allow_editing || request.request_method == 'GET'
|
forbid unless @allow_editing || request.request_method == 'GET'
|
||||||
Precious::App.set(:mustache, {:templates => settings.wiki_options[:template_dir]}) if settings.wiki_options[:template_dir]
|
|
||||||
|
if settings.wiki_options[:template_dir]
|
||||||
|
Precious::Views::Layout.extend Precious::Views::TemplateCascade
|
||||||
|
Precious::Views::Layout.template_priority_path = settings.wiki_options[:template_dir]
|
||||||
|
end
|
||||||
|
|
||||||
@base_url = url('/', false).chomp('/').force_encoding('utf-8')
|
@base_url = url('/', false).chomp('/').force_encoding('utf-8')
|
||||||
@page_dir = settings.wiki_options[:page_file_dir].to_s
|
@page_dir = settings.wiki_options[:page_file_dir].to_s
|
||||||
@@ -120,7 +129,7 @@ module Precious
|
|||||||
@use_static_assets = settings.wiki_options.fetch(:static, settings.environment != :development)
|
@use_static_assets = settings.wiki_options.fetch(:static, settings.environment != :development)
|
||||||
@static_assets_path = settings.wiki_options.fetch(:static_assets_path, ::File.join(File.dirname(__FILE__), 'public/assets'))
|
@static_assets_path = settings.wiki_options.fetch(:static_assets_path, ::File.join(File.dirname(__FILE__), 'public/assets'))
|
||||||
@mathjax_path = ::File.join(File.dirname(__FILE__), 'public/gollum/javascript/MathJax')
|
@mathjax_path = ::File.join(File.dirname(__FILE__), 'public/gollum/javascript/MathJax')
|
||||||
|
|
||||||
Sprockets::Helpers.configure do |config|
|
Sprockets::Helpers.configure do |config|
|
||||||
config.environment = settings.sprockets
|
config.environment = settings.sprockets
|
||||||
config.environment.context_class.class_variable_set(:@@base_url, @base_url)
|
config.environment.context_class.class_variable_set(:@@base_url, @base_url)
|
||||||
@@ -219,7 +228,7 @@ module Precious
|
|||||||
|
|
||||||
# AJAX calls only
|
# AJAX calls only
|
||||||
post '/upload_file' do
|
post '/upload_file' do
|
||||||
|
|
||||||
wiki = wiki_new
|
wiki = wiki_new
|
||||||
halt 405 unless wiki.allow_uploads
|
halt 405 unless wiki.allow_uploads
|
||||||
|
|
||||||
@@ -235,7 +244,7 @@ module Precious
|
|||||||
dir.sub!(/^#{wiki.base_path}/, '') if wiki.base_path
|
dir.sub!(/^#{wiki.base_path}/, '') if wiki.base_path
|
||||||
# remove base_url and gollum/* subpath if necessary
|
# remove base_url and gollum/* subpath if necessary
|
||||||
dir.sub!(/^\/gollum\/[-\w]+\//, '')
|
dir.sub!(/^\/gollum\/[-\w]+\//, '')
|
||||||
# remove file extension
|
# remove file extension
|
||||||
dir.sub!(/#{::File.extname(dir)}$/, '')
|
dir.sub!(/#{::File.extname(dir)}$/, '')
|
||||||
# revert escaped whitespaces
|
# revert escaped whitespaces
|
||||||
dir.gsub!(/%20/, ' ')
|
dir.gsub!(/%20/, ' ')
|
||||||
@@ -317,7 +326,7 @@ module Precious
|
|||||||
end
|
end
|
||||||
|
|
||||||
post '/edit/*' do
|
post '/edit/*' do
|
||||||
etag = params[:etag]
|
etag = params[:etag]
|
||||||
path = "/#{clean_url(sanitize_empty_params(params[:path]))}"
|
path = "/#{clean_url(sanitize_empty_params(params[:path]))}"
|
||||||
wiki = wiki_new
|
wiki = wiki_new
|
||||||
page = wiki.page(::File.join(path, params[:page]))
|
page = wiki.page(::File.join(path, params[:page]))
|
||||||
@@ -327,7 +336,7 @@ module Precious
|
|||||||
# Signal edit collision and return the page's most recent version
|
# Signal edit collision and return the page's most recent version
|
||||||
halt 412, {etag: page.sha, text_data: page.text_data}.to_json
|
halt 412, {etag: page.sha, text_data: page.text_data}.to_json
|
||||||
end
|
end
|
||||||
|
|
||||||
committer = Gollum::Committer.new(wiki, commit_message)
|
committer = Gollum::Committer.new(wiki, commit_message)
|
||||||
commit = { :committer => committer }
|
commit = { :committer => committer }
|
||||||
|
|
||||||
@@ -348,7 +357,7 @@ module Precious
|
|||||||
commit[:message] = "Deleted #{filepath}"
|
commit[:message] = "Deleted #{filepath}"
|
||||||
wiki.delete_file(filepath, commit)
|
wiki.delete_file(filepath, commit)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
get '/create/*' do
|
get '/create/*' do
|
||||||
forbid unless @allow_editing
|
forbid unless @allow_editing
|
||||||
@@ -625,7 +634,7 @@ module Precious
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def show_file(file)
|
def show_file(file)
|
||||||
return unless file
|
return unless file
|
||||||
if file.on_disk?
|
if file.on_disk?
|
||||||
@@ -638,7 +647,7 @@ module Precious
|
|||||||
|
|
||||||
def load_template(path)
|
def load_template(path)
|
||||||
template_page = wiki_page(::File.join(path, '_Template')).page || wiki_page('/_Template').page
|
template_page = wiki_page(::File.join(path, '_Template')).page || wiki_page('/_Template').page
|
||||||
template_page ? Gollum::TemplateFilter.apply_filters(template_page.raw_data) : nil
|
template_page ? Gollum::TemplateFilter.apply_filters(template_page.text_data) : nil
|
||||||
end
|
end
|
||||||
|
|
||||||
def update_wiki_page(wiki, page, content, commit, name = nil, format = nil)
|
def update_wiki_page(wiki, page, content, commit, name = nil, format = nil)
|
||||||
@@ -683,4 +692,4 @@ module Precious
|
|||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
{"files":{"app-f05401ee374f0c7f48fc2bc08e30b4f4db705861fd5895ed70998683b383bfb5.js":{"logical_path":"app.js","mtime":"2021-07-10T00:40:20+09:00","size":136040,"digest":"f05401ee374f0c7f48fc2bc08e30b4f4db705861fd5895ed70998683b383bfb5","integrity":"sha256-8FQB7jdPDH9I/CvAjjC09NtwWGH9WJXtcJmGg7ODv7U="},"editor-9881d0c7ae663293f0e3a7e72729eec7e940fa613185c076709b76d292f5703a.js":{"logical_path":"editor.js","mtime":"2021-07-10T00:42:29+09:00","size":744886,"digest":"9881d0c7ae663293f0e3a7e72729eec7e940fa613185c076709b76d292f5703a","integrity":"sha256-mIHQx65mMpPw46fnJynux+lA+mExhcB2cJt20pL1cDo="},"app-cb122b4c17500faa5e013cb43334fafcf2dd7d72f694b06d9616f8b33fefb694.css":{"logical_path":"app.css","mtime":"2021-07-10T00:39:36+09:00","size":396625,"digest":"cb122b4c17500faa5e013cb43334fafcf2dd7d72f694b06d9616f8b33fefb694","integrity":"sha256-yxIrTBdQD6peATy0MzT6/PLdfXL2lLBtlhb4sz/vtpQ="},"criticmarkup-31ae5d3282bbb8e7b7c3c9917e9fb68e3315a6b4a75da6cec48d21b8846905c4.css":{"logical_path":"criticmarkup.css","mtime":"2021-07-08T05:19:03+09:00","size":646,"digest":"31ae5d3282bbb8e7b7c3c9917e9fb68e3315a6b4a75da6cec48d21b8846905c4","integrity":"sha256-Ma5dMoK7uOe3w8mRfp+2jjMVprSnXabOxI0huIRpBcQ="},"print-512498c368be0d3fb1ba105dfa84289ae48380ec9fcbef948bd4e23b0b095bfb.css":{"logical_path":"print.css","mtime":"2021-07-08T05:19:03+09:00","size":75,"digest":"512498c368be0d3fb1ba105dfa84289ae48380ec9fcbef948bd4e23b0b095bfb","integrity":"sha256-USSYw2i+DT+xuhBd+oQomuSDgOyfy++Ui9TiOwsJW/s="}},"assets":{"app.js":"app-f05401ee374f0c7f48fc2bc08e30b4f4db705861fd5895ed70998683b383bfb5.js","editor.js":"editor-9881d0c7ae663293f0e3a7e72729eec7e940fa613185c076709b76d292f5703a.js","app.css":"app-cb122b4c17500faa5e013cb43334fafcf2dd7d72f694b06d9616f8b33fefb694.css","criticmarkup.css":"criticmarkup-31ae5d3282bbb8e7b7c3c9917e9fb68e3315a6b4a75da6cec48d21b8846905c4.css","print.css":"print-512498c368be0d3fb1ba105dfa84289ae48380ec9fcbef948bd4e23b0b095bfb.css"}}
|
||||||
@@ -1 +0,0 @@
|
|||||||
{"files":{"app-0fd228e26bfbe6fe31a2da268eb0e98e780c1191c1a918adf383377946e9c838.js":{"logical_path":"app.js","mtime":"2021-03-23T08:40:11-07:00","size":136020,"digest":"0fd228e26bfbe6fe31a2da268eb0e98e780c1191c1a918adf383377946e9c838","integrity":"sha256-D9Io4mv75v4xotomjrDpjngMEZHBqRit84M3eUbpyDg="},"editor-db10c8351306e92f1926ba225d0cd9c8e886482b3b9820a85825ec3abab5f1cf.js":{"logical_path":"editor.js","mtime":"2021-02-24T23:16:14-08:00","size":744866,"digest":"db10c8351306e92f1926ba225d0cd9c8e886482b3b9820a85825ec3abab5f1cf","integrity":"sha256-2xDINRMG6S8ZJroiXQzZyOiGSCs7mCCoWCXsOrq18c8="},"app-ad43ca64b295d8444b10f22ee868f18429268af498f1bc515434878b690e37a2.css":{"logical_path":"app.css","mtime":"2021-03-23T08:40:11-07:00","size":396615,"digest":"ad43ca64b295d8444b10f22ee868f18429268af498f1bc515434878b690e37a2","integrity":"sha256-rUPKZLKV2ERLEPIu6GjxhCkmivSY8bxRVDSHi2kON6I="},"criticmarkup-31ae5d3282bbb8e7b7c3c9917e9fb68e3315a6b4a75da6cec48d21b8846905c4.css":{"logical_path":"criticmarkup.css","mtime":"2021-02-24T23:16:14-08:00","size":646,"digest":"31ae5d3282bbb8e7b7c3c9917e9fb68e3315a6b4a75da6cec48d21b8846905c4","integrity":"sha256-Ma5dMoK7uOe3w8mRfp+2jjMVprSnXabOxI0huIRpBcQ="},"print-512498c368be0d3fb1ba105dfa84289ae48380ec9fcbef948bd4e23b0b095bfb.css":{"logical_path":"print.css","mtime":"2021-02-24T23:16:14-08:00","size":75,"digest":"512498c368be0d3fb1ba105dfa84289ae48380ec9fcbef948bd4e23b0b095bfb","integrity":"sha256-USSYw2i+DT+xuhBd+oQomuSDgOyfy++Ui9TiOwsJW/s="}},"assets":{"app.js":"app-0fd228e26bfbe6fe31a2da268eb0e98e780c1191c1a918adf383377946e9c838.js","editor.js":"editor-db10c8351306e92f1926ba225d0cd9c8e886482b3b9820a85825ec3abab5f1cf.js","app.css":"app-ad43ca64b295d8444b10f22ee868f18429268af498f1bc515434878b690e37a2.css","criticmarkup.css":"criticmarkup-31ae5d3282bbb8e7b7c3c9917e9fb68e3315a6b4a75da6cec48d21b8846905c4.css","print.css":"print-512498c368be0d3fb1ba105dfa84289ae48380ec9fcbef948bd4e23b0b095bfb.css"}}
|
|
||||||
+1
-1
File diff suppressed because one or more lines are too long
BIN
Binary file not shown.
+2
-2
File diff suppressed because one or more lines are too long
BIN
Binary file not shown.
BIN
Binary file not shown.
+2
-2
File diff suppressed because one or more lines are too long
BIN
Binary file not shown.
BIN
Binary file not shown.
@@ -218,7 +218,7 @@
|
|||||||
$form.attr('action', this.href || routePath('preview'));
|
$form.attr('action', this.href || routePath('preview'));
|
||||||
$form.attr('target', '_blank');
|
$form.attr('target', '_blank');
|
||||||
var paths = window.location.pathname.split('/');
|
var paths = window.location.pathname.split('/');
|
||||||
$form.attr('page', paths[ paths.length - 1 ] || '')
|
$form.attr('page', decodeURIComponent(paths[ paths.length - 1 ]) || '')
|
||||||
$form.submit();
|
$form.submit();
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -345,7 +345,7 @@ $(document).ready(function() {
|
|||||||
var formData = new FormData($('#gollum-editor-form').get(0));
|
var formData = new FormData($('#gollum-editor-form').get(0));
|
||||||
var paths = window.location.pathname.split('/');
|
var paths = window.location.pathname.split('/');
|
||||||
var sectionAnchor = window.location.hash.substr(1);
|
var sectionAnchor = window.location.hash.substr(1);
|
||||||
formData.append('page', paths[ paths.length - 1 ] || '')
|
formData.append('page', decodeURIComponent(paths[ paths.length - 1 ]) || '')
|
||||||
$.ajax({
|
$.ajax({
|
||||||
url: routePath('preview'),
|
url: routePath('preview'),
|
||||||
data: formData,
|
data: formData,
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ a.tabnav-tab:focus {
|
|||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
font-family: Consolas, "Liberation Mono", Courier, monospace;
|
font-family: Consolas, "Liberation Mono", Courier, monospace;
|
||||||
font-size: 1em;
|
font-size: 1em;
|
||||||
|
padding: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#gollum-editor {
|
#gollum-editor {
|
||||||
|
|||||||
@@ -0,0 +1,82 @@
|
|||||||
|
module Precious
|
||||||
|
module Views
|
||||||
|
module LocaleHelpers
|
||||||
|
NO_METHOD_MESSAGE = 'Argument must be a view method'
|
||||||
|
YAML_VARIABLE_REGEXP = /\%\{[\w]+\}/
|
||||||
|
|
||||||
|
# Returns all I18n translation strings for the current view class.
|
||||||
|
# This method support YAML arguments. For example:
|
||||||
|
#
|
||||||
|
# last_edited: This content was last edited at %{date}.
|
||||||
|
#
|
||||||
|
# Where the `date` argument must be a method available on the current
|
||||||
|
# class.
|
||||||
|
#
|
||||||
|
# Use this interface within Mustache templates to render any user
|
||||||
|
# interface strings in the current locale. For example:
|
||||||
|
#
|
||||||
|
# {{ t.last_edited }}
|
||||||
|
#
|
||||||
|
def t
|
||||||
|
autofill I18n.t(locale_klass_name)
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
# Recursively looks up I18n translation values and autofills any YAML
|
||||||
|
# arguments with the return value of the current class's matching method.
|
||||||
|
#
|
||||||
|
# When a translation value with an argument has no matching method, we
|
||||||
|
# then return that value transformed to include the `no_method_message`
|
||||||
|
#
|
||||||
|
def autofill(yaml)
|
||||||
|
yaml.map { |i18n_key, i18n_value|
|
||||||
|
if i18n_value.is_a? Hash
|
||||||
|
[i18n_key, autofill(i18n_value)]
|
||||||
|
elsif has_arguments?(i18n_value)
|
||||||
|
fill_argument_content(i18n_key, i18n_value)
|
||||||
|
else
|
||||||
|
[i18n_key, i18n_value]
|
||||||
|
end
|
||||||
|
}.to_h
|
||||||
|
end
|
||||||
|
|
||||||
|
def fill_argument_content(i18n_key, i18n_value)
|
||||||
|
i18n_value.gsub!(YAML_VARIABLE_REGEXP) do |argument|
|
||||||
|
method_name = argument.gsub(/[^\w]/, '')
|
||||||
|
|
||||||
|
next if method_name.nil?
|
||||||
|
|
||||||
|
begin
|
||||||
|
self.public_send(method_name)
|
||||||
|
rescue NoMethodError => error
|
||||||
|
no_method_message(method_name)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
[i18n_key, i18n_value]
|
||||||
|
end
|
||||||
|
|
||||||
|
def has_arguments?(i18n_value)
|
||||||
|
i18n_value.match?(YAML_VARIABLE_REGEXP)
|
||||||
|
end
|
||||||
|
|
||||||
|
# Returns the current class name in a format that is acceptable in YAML.
|
||||||
|
# To summarize its function:
|
||||||
|
#
|
||||||
|
# NameOfConstant => name_of_constant
|
||||||
|
#
|
||||||
|
def locale_klass_name
|
||||||
|
@locale_klass_name ||= self.class.name.gsub(/::/, '/').
|
||||||
|
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
|
||||||
|
gsub(/([a-z\d])([A-Z])/,'\1_\2').
|
||||||
|
tr('-', '_').
|
||||||
|
downcase
|
||||||
|
end
|
||||||
|
|
||||||
|
def no_method_message(method_name, message = NO_METHOD_MESSAGE)
|
||||||
|
"[#{message}: #{method_name}]"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -6,10 +6,11 @@ module Precious
|
|||||||
include Rack::Utils
|
include Rack::Utils
|
||||||
include Sprockets::Helpers
|
include Sprockets::Helpers
|
||||||
include Precious::Views::AppHelpers
|
include Precious::Views::AppHelpers
|
||||||
|
include Precious::Views::LocaleHelpers
|
||||||
include Precious::Views::SprocketsHelpers
|
include Precious::Views::SprocketsHelpers
|
||||||
include Precious::Views::RouteHelpers
|
include Precious::Views::RouteHelpers
|
||||||
include Precious::Views::OcticonHelpers
|
include Precious::Views::OcticonHelpers
|
||||||
|
|
||||||
alias_method :h, :escape_html
|
alias_method :h, :escape_html
|
||||||
|
|
||||||
attr_reader :name, :path
|
attr_reader :name, :path
|
||||||
|
|||||||
@@ -0,0 +1,36 @@
|
|||||||
|
module Precious
|
||||||
|
module Views
|
||||||
|
module TemplateCascade
|
||||||
|
def template_priority_path
|
||||||
|
@@template_priority_path
|
||||||
|
end
|
||||||
|
|
||||||
|
def template_priority_path=(path)
|
||||||
|
@@template_priority_path = File.expand_path(path)
|
||||||
|
@template = nil
|
||||||
|
end
|
||||||
|
|
||||||
|
def first_path_available(name)
|
||||||
|
priority = File.join(template_priority_path, "#{name}.#{template_extension}")
|
||||||
|
default = File.join(template_path, "#{name}.#{template_extension}")
|
||||||
|
File.exists?(priority) ? priority : default
|
||||||
|
end
|
||||||
|
|
||||||
|
# Method should track lib/mustache/settings.rb from Mustache project.
|
||||||
|
def template_file
|
||||||
|
@template_file || first_path_available(template_name)
|
||||||
|
end
|
||||||
|
|
||||||
|
# Method should track lib/mustache.rb from Mustache project.
|
||||||
|
def partial(name)
|
||||||
|
path = first_path_available(name)
|
||||||
|
begin
|
||||||
|
File.read(path)
|
||||||
|
rescue
|
||||||
|
raise if raise_on_context_miss?
|
||||||
|
""
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
<nav>
|
||||||
|
<div style="background-color: red;">NAVBAR_OVERRIDE</div>
|
||||||
|
|
||||||
|
<p>Still include an original partial to ensure the fallback works even when nested from an overriden partial:</p>
|
||||||
|
<div>
|
||||||
|
{{>mobilenav}}
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
<div id="wiki-wrapper" class="page">
|
||||||
|
|
||||||
|
<p>Include an overridden partial:</p>
|
||||||
|
<div id="head">
|
||||||
|
{{#navbar?}}{{>navbar}}{{/navbar?}}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div style="background-color: red;">PAGE_OVERRIDE</div>
|
||||||
|
|
||||||
|
{{>wiki_content}}
|
||||||
|
|
||||||
|
</div>
|
||||||
@@ -0,0 +1,134 @@
|
|||||||
|
require_relative "../../helper"
|
||||||
|
require_relative "../../../lib/gollum/views/helpers"
|
||||||
|
|
||||||
|
describe Precious::Views::LocaleHelpers do
|
||||||
|
class TestClass < Mustache
|
||||||
|
include Precious::Views::LocaleHelpers
|
||||||
|
|
||||||
|
def author
|
||||||
|
"J.R.R."
|
||||||
|
end
|
||||||
|
|
||||||
|
def location
|
||||||
|
"Bloemfontein"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def setup
|
||||||
|
::I18n.available_locales = [:en, :de]
|
||||||
|
::I18n.load_path = Dir[File.expand_path("test/support/locales" + "/*.yml")]
|
||||||
|
end
|
||||||
|
|
||||||
|
def teardown
|
||||||
|
I18n.locale = :en
|
||||||
|
end
|
||||||
|
|
||||||
|
let(:dummy_instance) { TestClass.new }
|
||||||
|
|
||||||
|
describe "#t" do
|
||||||
|
describe "mustache usage" do
|
||||||
|
let(:subject) { dummy_instance.render(mustache_template) }
|
||||||
|
|
||||||
|
let(:mustache_template) { "{{ t.hello_world }}" }
|
||||||
|
|
||||||
|
describe "in the default locale" do
|
||||||
|
it "returns the translation string" do
|
||||||
|
_(subject).must_equal "Hello world"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "in the configured locale" do
|
||||||
|
it "returns the translation string" do
|
||||||
|
I18n.locale = :de
|
||||||
|
|
||||||
|
_(subject).must_equal "Hallo Welt"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "translations with YAML arguments" do
|
||||||
|
let(:mustache_template) { "{{ t.author_info.full }}" }
|
||||||
|
|
||||||
|
describe "in the default locale" do
|
||||||
|
it "autofills YAML arguments" do
|
||||||
|
_(subject).must_equal "Author J.R.R. is from Bloemfontein"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "in the configured locale" do
|
||||||
|
it "autofills YAML arguments" do
|
||||||
|
I18n.locale = :de
|
||||||
|
|
||||||
|
_(subject).must_equal "Autor J.R.R. ist vom Bloemfontein"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "translations with invalid arguments" do
|
||||||
|
let(:mustache_template) { "{{ t.has_invalid_argument }}" }
|
||||||
|
|
||||||
|
it "fails gracefully with embedded error message" do
|
||||||
|
expected_string = "Welcome to " \
|
||||||
|
"[#{TestClass::NO_METHOD_MESSAGE}: no_matching_method]"
|
||||||
|
|
||||||
|
_(subject).must_equal expected_string
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "out of scope translations" do
|
||||||
|
let(:mustache_template) { "{{ t.never_called }}" }
|
||||||
|
|
||||||
|
it "does not include translation keys from other classes" do
|
||||||
|
_(subject).must_be_empty
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "missing translations" do
|
||||||
|
let(:mustache_template) { "{{ t.nested.nonexistent_key }}" }
|
||||||
|
|
||||||
|
it "outputs an empty string" do
|
||||||
|
_(subject).must_be_empty
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "usage" do
|
||||||
|
let(:subject) { dummy_instance.t }
|
||||||
|
|
||||||
|
it "returns a hash" do
|
||||||
|
_(subject).must_be_kind_of Hash
|
||||||
|
end
|
||||||
|
|
||||||
|
it "returns translation keys under 'test_class'" do
|
||||||
|
i18n_keys = I18n.t("test_class").keys
|
||||||
|
|
||||||
|
_(subject.keys).must_equal i18n_keys
|
||||||
|
end
|
||||||
|
|
||||||
|
it "does not return translation keys under other classes" do
|
||||||
|
other_i18n_keys = I18n.t("nonexistant_test_class").keys
|
||||||
|
|
||||||
|
_(subject.keys).wont_include other_i18n_keys
|
||||||
|
end
|
||||||
|
|
||||||
|
it "returns nested keys" do
|
||||||
|
nested_keys = subject[:author_info].keys
|
||||||
|
|
||||||
|
_(nested_keys).must_equal [:full]
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "auto-filled YAML arguments" do
|
||||||
|
let(:subject) { dummy_instance.t[:author_info][:full] }
|
||||||
|
|
||||||
|
it "auto-fills in the default locale" do
|
||||||
|
_(subject).must_equal "Author J.R.R. is from Bloemfontein"
|
||||||
|
end
|
||||||
|
|
||||||
|
it "auto-fills in a configured locale" do
|
||||||
|
I18n.locale = :de
|
||||||
|
|
||||||
|
_(subject).must_equal "Autor J.R.R. ist vom Bloemfontein"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
+2
-1
@@ -5,6 +5,7 @@ require 'shoulda'
|
|||||||
require 'mocha/setup'
|
require 'mocha/setup'
|
||||||
require 'fileutils'
|
require 'fileutils'
|
||||||
require 'minitest/reporters'
|
require 'minitest/reporters'
|
||||||
|
require 'minitest/spec'
|
||||||
require 'twitter_cldr'
|
require 'twitter_cldr'
|
||||||
require 'tmpdir'
|
require 'tmpdir'
|
||||||
|
|
||||||
@@ -93,4 +94,4 @@ def context(*args, &block)
|
|||||||
klass.class_eval &block
|
klass.class_eval &block
|
||||||
end
|
end
|
||||||
|
|
||||||
$contexts = []
|
$contexts = []
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
de:
|
||||||
|
test_class:
|
||||||
|
author_info:
|
||||||
|
full: Autor %{author} ist vom %{location}
|
||||||
|
has_invalid_argument: Willkommen in %{no_matching_method}
|
||||||
|
hello_world: Hallo Welt
|
||||||
|
nonexistant_test_class:
|
||||||
|
never_called: Nie angerufen
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
en:
|
||||||
|
test_class:
|
||||||
|
author_info:
|
||||||
|
full: Author %{author} is from %{location}
|
||||||
|
has_invalid_argument: Welcome to %{no_matching_method}
|
||||||
|
hello_world: Hello world
|
||||||
|
nonexistant_test_class:
|
||||||
|
never_called: Never called
|
||||||
+1
-1
@@ -328,7 +328,7 @@ EOF
|
|||||||
test "create with template succeed if template exists" do
|
test "create with template succeed if template exists" do
|
||||||
Precious::App.set(:wiki_options, { :template_page => true })
|
Precious::App.set(:wiki_options, { :template_page => true })
|
||||||
page='_Template'
|
page='_Template'
|
||||||
post '/gollum/create', :content => 'fake template', :page => page,
|
post '/gollum/create', :content => 'fake template with some Utf-8: Ü', :page => page,
|
||||||
:path => '/', :format => 'markdown', :message => ''
|
:path => '/', :format => 'markdown', :message => ''
|
||||||
follow_redirect!
|
follow_redirect!
|
||||||
assert last_response.ok?
|
assert last_response.ok?
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ def load_script(**args)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
unless ENV['TRAVIS']
|
unless ENV['CI']
|
||||||
|
|
||||||
context '4.x -> 5.x tag migrator' do
|
context '4.x -> 5.x tag migrator' do
|
||||||
include Rack::Test::Methods
|
include Rack::Test::Methods
|
||||||
|
|||||||
@@ -0,0 +1,43 @@
|
|||||||
|
# ~*~ encoding: utf-8 ~*~
|
||||||
|
require File.expand_path(File.join(File.dirname(__FILE__), 'helper'))
|
||||||
|
|
||||||
|
class TestTemplateCascade < Minitest::Unit::TestCase
|
||||||
|
include Rack::Test::Methods
|
||||||
|
|
||||||
|
def setup
|
||||||
|
@path = cloned_testpath('examples/lotr.git')
|
||||||
|
Precious::App.set(:gollum_path, @path)
|
||||||
|
Precious::App.set(:wiki_options, {template_dir: testpath('examples/template_cascade')})
|
||||||
|
@wiki = Gollum::Wiki.new(@path)
|
||||||
|
end
|
||||||
|
|
||||||
|
def teardown
|
||||||
|
FileUtils.rm_rf(@path)
|
||||||
|
end
|
||||||
|
|
||||||
|
def app
|
||||||
|
Precious::App
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_overridden_page_template_is_used
|
||||||
|
get '/Home'
|
||||||
|
|
||||||
|
assert last_response.body.include?('PAGE_OVERRIDE')
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_overridden_navbar_partial_is_used
|
||||||
|
get '/Home'
|
||||||
|
|
||||||
|
assert last_response.body.include?('NAVBAR_OVERRIDE')
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_overridden_templates_are_ignore_without_template_dir_set
|
||||||
|
Precious::App.set(:wiki_options, {template_dir: nil})
|
||||||
|
|
||||||
|
get '/Home'
|
||||||
|
assert_equal '/Home', last_request.fullpath
|
||||||
|
assert last_response.ok?
|
||||||
|
assert_no_match /PAGE_OVERRIDE/, last_response.body
|
||||||
|
assert_no_match /NAVBAR_OVERRIDE/, last_response.body
|
||||||
|
end
|
||||||
|
end
|
||||||
Reference in New Issue
Block a user