homeland-wiki 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.md +34 -0
- data/Rakefile +37 -0
- data/app/assets/config/homeland_press_manifest.js +3 -0
- data/app/assets/javascripts/homeland/wiki/application.coffee +32 -0
- data/app/assets/stylesheets/homeland/wiki/application.scss +34 -0
- data/app/controllers/homeland/wiki/admin/page_versions_controller.rb +23 -0
- data/app/controllers/homeland/wiki/admin/pages_controller.rb +55 -0
- data/app/controllers/homeland/wiki/application_controller.rb +5 -0
- data/app/controllers/homeland/wiki/pages_controller.rb +86 -0
- data/app/helpers/homeland/wiki/application_helper.rb +10 -0
- data/app/models/homeland/wiki/ability.rb +26 -0
- data/app/models/page.rb +74 -0
- data/app/models/page_version.rb +7 -0
- data/app/views/homeland/wiki/admin/page_versions/index.html.erb +32 -0
- data/app/views/homeland/wiki/admin/page_versions/show.html.erb +20 -0
- data/app/views/homeland/wiki/admin/pages/_form.html.erb +12 -0
- data/app/views/homeland/wiki/admin/pages/edit.html.erb +6 -0
- data/app/views/homeland/wiki/admin/pages/index.html.erb +31 -0
- data/app/views/homeland/wiki/pages/_form.html.erb +25 -0
- data/app/views/homeland/wiki/pages/_sidebar.html.erb +14 -0
- data/app/views/homeland/wiki/pages/comments.html.erb +18 -0
- data/app/views/homeland/wiki/pages/edit.html.erb +8 -0
- data/app/views/homeland/wiki/pages/index.html.erb +14 -0
- data/app/views/homeland/wiki/pages/new.html.erb +8 -0
- data/app/views/homeland/wiki/pages/recent.html.erb +19 -0
- data/app/views/homeland/wiki/pages/show.html.erb +47 -0
- data/app/views/layouts/homeland/wiki/application.html.erb +18 -0
- data/config/locales/pages.en.yml +9 -0
- data/config/locales/pages.zh-CN.yml +9 -0
- data/config/locales/pages.zh-TW.yml +9 -0
- data/config/routes.rb +21 -0
- data/lib/homeland/wiki.rb +7 -0
- data/lib/homeland/wiki/engine.rb +28 -0
- data/lib/homeland/wiki/version.rb +7 -0
- metadata +92 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: ffedcf29dc9556d5e14b77be5275716ca387310f
|
4
|
+
data.tar.gz: 4de8f046b38214d11606fa3ae1cdae7bd7445dcb
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 7b32ad8f0188cb84499561e28bf11f27d6975269137bec2a9c876a6e68adb19fef47285d2c51d8b0e13d2b9ec35f6b66f4a0c06b83824f7dbaa183714d9016ef
|
7
|
+
data.tar.gz: f398e902ee2126272d128c7beb1c2f6bfa841e8844adbc9d7ea2bedd726dfc8ab54b3b7e7884b114fc02e96e421ec29d05b7e94b41206b244eecc01ee15df9bd
|
data/README.md
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
Homeland::Wiki
|
2
|
+
--------------
|
3
|
+
|
4
|
+
Wiki 栏目插件 for [Homeland](https://gethomeland.com)
|
5
|
+
|
6
|
+
简单的实现 /wiki 栏目,并在导航栏显示。
|
7
|
+
|
8
|
+
## Usage
|
9
|
+
|
10
|
+
## Installation
|
11
|
+
|
12
|
+
在 Homeland 应用的 Gemfile 增加:
|
13
|
+
|
14
|
+
```ruby
|
15
|
+
gem 'homeland-wiki'
|
16
|
+
```
|
17
|
+
|
18
|
+
And then execute:
|
19
|
+
```bash
|
20
|
+
$ bundle
|
21
|
+
```
|
22
|
+
|
23
|
+
## Configuration
|
24
|
+
|
25
|
+
修改 Homeland 的 `modules` 配置,增加 `wiki` 以启用。
|
26
|
+
|
27
|
+
```yml
|
28
|
+
defaults: &defaults
|
29
|
+
# add "press" to modules
|
30
|
+
modules: 'topic,...,wiki'
|
31
|
+
```
|
32
|
+
|
33
|
+
## License
|
34
|
+
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
data/Rakefile
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
begin
|
2
|
+
require 'bundler/setup'
|
3
|
+
rescue LoadError
|
4
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
5
|
+
end
|
6
|
+
|
7
|
+
require 'rdoc/task'
|
8
|
+
|
9
|
+
RDoc::Task.new(:rdoc) do |rdoc|
|
10
|
+
rdoc.rdoc_dir = 'rdoc'
|
11
|
+
rdoc.title = 'Homeland::Wiki'
|
12
|
+
rdoc.options << '--line-numbers'
|
13
|
+
rdoc.rdoc_files.include('README.md')
|
14
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
15
|
+
end
|
16
|
+
|
17
|
+
APP_RAKEFILE = File.expand_path("../test/dummy/Rakefile", __FILE__)
|
18
|
+
load 'rails/tasks/engine.rake'
|
19
|
+
|
20
|
+
|
21
|
+
load 'rails/tasks/statistics.rake'
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
require 'bundler/gem_tasks'
|
26
|
+
|
27
|
+
require 'rake/testtask'
|
28
|
+
|
29
|
+
Rake::TestTask.new(:test) do |t|
|
30
|
+
t.libs << 'test'
|
31
|
+
t.pattern = 'test/**/*_test.rb'
|
32
|
+
t.verbose = false
|
33
|
+
end
|
34
|
+
|
35
|
+
|
36
|
+
task default: :test
|
37
|
+
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# Place all the behaviors and hooks related to the matching controller here.
|
2
|
+
# All this logic will automatically be available in application.js.
|
3
|
+
# You can use CoffeeScript in this file: http://jashkenas.github.com/coffee-script/
|
4
|
+
#
|
5
|
+
window.PageView = Backbone.View.extend
|
6
|
+
el: "body"
|
7
|
+
events:
|
8
|
+
"click .editor-toolbar .edit a": "toggleEditView"
|
9
|
+
"click .editor-toolbar .preview a": "togglePreviewView"
|
10
|
+
|
11
|
+
initialize: (opts) ->
|
12
|
+
@parentView = opts.parentView
|
13
|
+
$("<div id='preview' class='markdown form-control'></div>").insertAfter( $('#page_body') )
|
14
|
+
window._editor = new Editor()
|
15
|
+
|
16
|
+
toggleEditView: (e) ->
|
17
|
+
$(e.target).parent().addClass('active')
|
18
|
+
$('.preview a').parent().removeClass('active')
|
19
|
+
$('#preview').hide()
|
20
|
+
$('#page_body').show()
|
21
|
+
false
|
22
|
+
|
23
|
+
togglePreviewView: (e) ->
|
24
|
+
$(e.target).parent().addClass('active')
|
25
|
+
$('.edit a').parent().removeClass('active')
|
26
|
+
$('#preview').html('Loading...')
|
27
|
+
$('#page_body').hide()
|
28
|
+
$('#preview').show()
|
29
|
+
$.post '/wiki/preview', {body: $('#page_body').val()}, (data)->
|
30
|
+
$('#preview').html(data)
|
31
|
+
false
|
32
|
+
false
|
@@ -0,0 +1,34 @@
|
|
1
|
+
/*
|
2
|
+
*= require_self
|
3
|
+
*/
|
4
|
+
.page-pages {
|
5
|
+
.sidebar {
|
6
|
+
strong { color: #999; }
|
7
|
+
ul {
|
8
|
+
padding: 10px 10px 10px 30px;
|
9
|
+
li { line-height: 180%; }
|
10
|
+
}
|
11
|
+
}
|
12
|
+
|
13
|
+
.page-detail {
|
14
|
+
.panel-heading {
|
15
|
+
padding: 15px;
|
16
|
+
h1 { font-size: 20px; color: #111; margin: 0; margin-bottom: 6px;}
|
17
|
+
}
|
18
|
+
.info {
|
19
|
+
text-align:right;
|
20
|
+
padding:10px;
|
21
|
+
border-bottom:1px solid #eaeaea;
|
22
|
+
margin:-10px -10px 0;
|
23
|
+
background: #f5f5f5;
|
24
|
+
border-radius: 3px 3px 0 0;
|
25
|
+
margin-bottom:20px;
|
26
|
+
}
|
27
|
+
.editors {
|
28
|
+
h3 { font-size:14px; color:#999;}
|
29
|
+
.media-object { display: inline; }
|
30
|
+
.buttons { margin-top: 10px; }
|
31
|
+
}
|
32
|
+
}
|
33
|
+
}
|
34
|
+
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Homeland::Wiki::Admin
|
2
|
+
class PageVersionsController < ::Admin::ApplicationController
|
3
|
+
def index
|
4
|
+
@page = Page.find(params[:page_id])
|
5
|
+
@page_versions = @page.versions.order(version: :desc).page(params[:page])
|
6
|
+
end
|
7
|
+
|
8
|
+
def show
|
9
|
+
@page = Page.find(params[:page_id])
|
10
|
+
@page_version = @page.versions.find(params[:id])
|
11
|
+
end
|
12
|
+
|
13
|
+
def revert
|
14
|
+
@page = Page.find(params[:page_id])
|
15
|
+
@page_version = @page.versions.find(params[:id])
|
16
|
+
if @page.revert_version(@page_version.version)
|
17
|
+
redirect_to admin_page_versions_path(params[:page_id]), notice: "Wiki 内容已经撤销到了版本 #{@page_version.version}"
|
18
|
+
else
|
19
|
+
redirect_to admin_page_versions_path(params[:page_id]), alert: "版本撤销失败,原因: #{@page.errors.full_messages.join('<br />')}"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module Homeland::Wiki::Admin
|
2
|
+
class PagesController < ::Admin::ApplicationController
|
3
|
+
before_action :set_page, only: [:show, :edit, :update, :destroy]
|
4
|
+
|
5
|
+
def index
|
6
|
+
@pages = Page.unscoped.order(id: :desc).page(params[:page])
|
7
|
+
end
|
8
|
+
|
9
|
+
def show
|
10
|
+
end
|
11
|
+
|
12
|
+
def new
|
13
|
+
@page = Page.new
|
14
|
+
end
|
15
|
+
|
16
|
+
def edit
|
17
|
+
end
|
18
|
+
|
19
|
+
def create
|
20
|
+
@page = Page.new(params[:page].permit!)
|
21
|
+
|
22
|
+
if @page.save
|
23
|
+
redirect_to(admin_pages_path, notice: 'Page was successfully created.')
|
24
|
+
else
|
25
|
+
render action: 'new'
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def update
|
30
|
+
@page.title = params[:page][:title]
|
31
|
+
@page.body = params[:page][:body]
|
32
|
+
@page.slug = params[:page][:slug]
|
33
|
+
@page.locked = params[:page][:locked]
|
34
|
+
@page.user_id = current_user.id
|
35
|
+
|
36
|
+
if @page.save
|
37
|
+
redirect_to(admin_pages_path, notice: 'Page was successfully updated.')
|
38
|
+
else
|
39
|
+
render action: 'edit'
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def destroy
|
44
|
+
@page.destroy
|
45
|
+
|
46
|
+
redirect_to(admin_pages_path)
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
def set_page
|
52
|
+
@page = Page.unscoped.find_by_slug(params[:id])
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
module Homeland::Wiki
|
2
|
+
class PagesController < Homeland::Wiki::ApplicationController
|
3
|
+
require_module_enabled! :wiki
|
4
|
+
authorize_resource :page
|
5
|
+
before_action :set_page, only: [:show, :edit, :update, :destroy, :comments]
|
6
|
+
|
7
|
+
etag { Setting.wiki_sidebar_html }
|
8
|
+
|
9
|
+
def index
|
10
|
+
fresh_when(Setting.wiki_index_html)
|
11
|
+
end
|
12
|
+
|
13
|
+
def recent
|
14
|
+
@pages = Page.recent.page(params[:page])
|
15
|
+
fresh_when(@pages)
|
16
|
+
end
|
17
|
+
|
18
|
+
def show
|
19
|
+
if @page.blank?
|
20
|
+
if current_user.blank?
|
21
|
+
render_404
|
22
|
+
return
|
23
|
+
end
|
24
|
+
|
25
|
+
redirect_to new_page_path(title: params[:id]), notice: 'Page not Found, Please create a new page'
|
26
|
+
return
|
27
|
+
end
|
28
|
+
|
29
|
+
@page.hits.incr(1)
|
30
|
+
fresh_when(@page)
|
31
|
+
end
|
32
|
+
|
33
|
+
def comments
|
34
|
+
render_404 if @page.blank?
|
35
|
+
end
|
36
|
+
|
37
|
+
def new
|
38
|
+
@page = Page.new
|
39
|
+
@page.slug = params[:title]
|
40
|
+
respond_to do |format|
|
41
|
+
format.html # new.html.erb
|
42
|
+
format.json { render json: @page }
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def edit
|
47
|
+
end
|
48
|
+
|
49
|
+
def create
|
50
|
+
@page = Page.new(page_params)
|
51
|
+
@page.user_id = current_user.id
|
52
|
+
@page.version_enable = true
|
53
|
+
|
54
|
+
if @page.save
|
55
|
+
redirect_to page_path(@page.slug), notice: t('common.create_success')
|
56
|
+
else
|
57
|
+
render action: 'new'
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def update
|
62
|
+
@page.version_enable = true
|
63
|
+
@page.user_id = current_user.id
|
64
|
+
|
65
|
+
if @page.update(page_params)
|
66
|
+
redirect_to page_path(@page.slug), notice: t('common.update_success')
|
67
|
+
else
|
68
|
+
render action: 'edit'
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def preview
|
73
|
+
render plain: Homeland::Markdown.call(params[:body])
|
74
|
+
end
|
75
|
+
|
76
|
+
protected
|
77
|
+
|
78
|
+
def set_page
|
79
|
+
@page = Page.find_by_slug(params[:id])
|
80
|
+
end
|
81
|
+
|
82
|
+
def page_params
|
83
|
+
params.require(:page).permit(:title, :body, :slug, :change_desc)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Homeland::Wiki
|
2
|
+
class Ability
|
3
|
+
include CanCan::Ability
|
4
|
+
|
5
|
+
attr_reader :user
|
6
|
+
|
7
|
+
def initialize(u)
|
8
|
+
@user = u
|
9
|
+
return roles_for_create_wiki if @user.present? && (@user.roles?(:admin) || @user.roles?(:wiki_editor))
|
10
|
+
roles_for_anonymous
|
11
|
+
end
|
12
|
+
|
13
|
+
protected
|
14
|
+
|
15
|
+
def roles_for_create_wiki
|
16
|
+
can :create, Page
|
17
|
+
can :edit, Page, locked: false
|
18
|
+
can :update, Page, locked: false
|
19
|
+
end
|
20
|
+
|
21
|
+
def roles_for_anonymous
|
22
|
+
can [:read, :recent, :preview, :comments], Page
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
data/app/models/page.rb
ADDED
@@ -0,0 +1,74 @@
|
|
1
|
+
class Page < ApplicationRecord
|
2
|
+
include MarkdownBody
|
3
|
+
include Searchable
|
4
|
+
|
5
|
+
counter :hits, default: 0
|
6
|
+
|
7
|
+
second_level_cache expires_in: 2.weeks
|
8
|
+
|
9
|
+
has_many :versions, class_name: 'PageVersion'
|
10
|
+
|
11
|
+
attr_accessor :user_id, :change_desc, :version_enable
|
12
|
+
|
13
|
+
validates :slug, :title, :body, presence: true
|
14
|
+
# 当需要记录版本时,如果是更新,那么要求填写 :change_desc
|
15
|
+
validates :user_id, if: proc { |p| p.version_enable == true }, presence: true
|
16
|
+
validates :change_desc, if: proc { |p| p.version_enable == true && !p.new_record? }, presence: true
|
17
|
+
validates :slug, format: /\A[a-z0-9\-_]+\z/
|
18
|
+
validates :slug, uniqueness: true
|
19
|
+
|
20
|
+
before_save :append_editor
|
21
|
+
def append_editor
|
22
|
+
unless editor_ids.include?(user_id.to_i)
|
23
|
+
editor_ids << user_id.to_i
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
# 记录更新版本
|
28
|
+
after_save :create_version
|
29
|
+
def create_version
|
30
|
+
# 只有当 version_enable 为 true 的时候才记录版本
|
31
|
+
# 以免后台,以及其他的一些 update 时被误调用
|
32
|
+
return true unless version_enable
|
33
|
+
# 只有 body, title, slug 更改了才更新版本
|
34
|
+
if self.body_changed? || self.title_changed? || self.slug_changed?
|
35
|
+
update_column(:version, self.version + 1)
|
36
|
+
PageVersion.create(user_id: user_id,
|
37
|
+
page_id: id,
|
38
|
+
desc: change_desc || '',
|
39
|
+
version: version,
|
40
|
+
body: body,
|
41
|
+
title: title,
|
42
|
+
slug: slug)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def as_indexed_json(_options = {})
|
47
|
+
as_json(only: [:slug, :title, :body])
|
48
|
+
end
|
49
|
+
|
50
|
+
def indexed_changed?
|
51
|
+
slug_changed? || title_changed? || body_changed?
|
52
|
+
end
|
53
|
+
|
54
|
+
def to_param
|
55
|
+
slug
|
56
|
+
end
|
57
|
+
|
58
|
+
# 撤掉到指定版本
|
59
|
+
def revert_version(version)
|
60
|
+
page_version = PageVersion.where(page_id: id, version: version).first
|
61
|
+
return false if page_version.blank?
|
62
|
+
update(body: page_version.body,
|
63
|
+
title: page_version.title,
|
64
|
+
slug: page_version.slug)
|
65
|
+
end
|
66
|
+
|
67
|
+
def editors
|
68
|
+
User.where(id: editor_ids)
|
69
|
+
end
|
70
|
+
|
71
|
+
def self.find_by_slug(slug)
|
72
|
+
fetch_by_uniq_keys(slug: slug)
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
<% content_for :sitemap do %>
|
2
|
+
<a href="<%= admin_pages_path %>">Wiki</a> <i class="fa fa-angle-right"></i>
|
3
|
+
<a href="<%= admin_page_path(params[:page_id]) %>">Page:<%= params[:page_id] %></a> <i class="fa fa-angle-right"></i>
|
4
|
+
<span class="current">版本历史</span>
|
5
|
+
<% end %>
|
6
|
+
<h1>Wiki 列表</h1>
|
7
|
+
|
8
|
+
<table class="table table-bordered table-striped table-condensed">
|
9
|
+
<tr class="head">
|
10
|
+
<td class="first">Version</td>
|
11
|
+
<td style="width:200px">Slug</td>
|
12
|
+
<td>Title</td>
|
13
|
+
<td>Desc</td>
|
14
|
+
<td>Creator</td>
|
15
|
+
<td>At</td>
|
16
|
+
<td></td>
|
17
|
+
</tr>
|
18
|
+
|
19
|
+
<% @page_versions.each do |item| %>
|
20
|
+
<tr>
|
21
|
+
<td class="first"><%= item.version %></td>
|
22
|
+
<td><%= item.slug %></td>
|
23
|
+
<td><%= item.title %></td>
|
24
|
+
<td><%= item.desc %></td>
|
25
|
+
<td><%= user_name_tag(item.user) %></td>
|
26
|
+
<td><%= l item.created_at, format: :long %></td>
|
27
|
+
<td><%= link_to 'View', admin_page_version_path(item.page_id, item.id) %>
|
28
|
+
<%= link_to 'Revert', revert_admin_page_version_path(item.page_id, item.id), 'data-confirm' => 'Are you sure?', method: :post %></td>
|
29
|
+
</tr>
|
30
|
+
<% end %>
|
31
|
+
</table>
|
32
|
+
<%= paginate @page_versions %>
|
@@ -0,0 +1,20 @@
|
|
1
|
+
<% content_for :sitemap do %>
|
2
|
+
<a href="<%= admin_pages_path %>">Wiki</a> <i class="fa fa-angle-right"></i>
|
3
|
+
<a href="<%= edit_admin_page_path(params[:page_id]) %>">Page:<%= params[:page_id] %></a> <i class="fa fa-angle-right"></i>
|
4
|
+
<a href="<%= admin_page_versions_path(params[:page_id]) %>">版本历史</a> <i class="fa fa-angle-right"></i>
|
5
|
+
<span class="current">明细</span>
|
6
|
+
<% end %>
|
7
|
+
<div class="pull-right">
|
8
|
+
<%= link_to 'Revert', revert_admin_page_version_path(@page_version.page_id, @page_version.id), 'data-confirm' => 'Are you sure?', method: :post, class: "btn btn-danger" %>
|
9
|
+
</div>
|
10
|
+
<div class="field">
|
11
|
+
<%= user_name_tag @page_version.user %> 修改与 <%= l @page_version.created_at, format: :long %>
|
12
|
+
</div>
|
13
|
+
<div class="field">
|
14
|
+
Slug: <%= @page_version.slug %>
|
15
|
+
</div>
|
16
|
+
<div class="field">
|
17
|
+
Title: <%= @page_version.title %>
|
18
|
+
</div>
|
19
|
+
|
20
|
+
<%= @page_version.body_html %>
|
@@ -0,0 +1,12 @@
|
|
1
|
+
<%= simple_form_for([:admin,@page]) do |f| %>
|
2
|
+
<%= render "shared/error_messages", target: @page %>
|
3
|
+
<fieldset>
|
4
|
+
<legend>Wiki页面编辑</legend>
|
5
|
+
<%= f.input :locked, as: :boolean, hint: "锁定后,前台非管理员将无法修改。" %>
|
6
|
+
<%= f.input :slug %>
|
7
|
+
<%= f.input :title, input_html: { class: "xxlarge" } %>
|
8
|
+
<%= f.input :body, as: :text, input_html: { class: "span8", rows: "30"} %>
|
9
|
+
<div class="form-actions">
|
10
|
+
<%= f.submit t("common.save"), class: "btn btn-primary", 'data-disable-with' => t("common.saving") %>
|
11
|
+
</div>
|
12
|
+
<% end %>
|
@@ -0,0 +1,31 @@
|
|
1
|
+
<% content_for :sitemap do %>
|
2
|
+
<span class="current">Wiki</span>
|
3
|
+
<% end %>
|
4
|
+
|
5
|
+
<table class="table table-bordered table-striped table-condensed">
|
6
|
+
<tr class="head">
|
7
|
+
<td class="first">ID</td>
|
8
|
+
<td style="width:200px">Slug</td>
|
9
|
+
<td>Title</td>
|
10
|
+
<td>at</td>
|
11
|
+
<td>lock</td>
|
12
|
+
<td>Version</td>
|
13
|
+
<td style="width:80px;"></td>
|
14
|
+
</tr>
|
15
|
+
|
16
|
+
<% @pages.each do |page| %>
|
17
|
+
<tr class="<%= 'deleted' if !page.deleted_at.blank? %>">
|
18
|
+
<td class="first"><%= page.id %></td>
|
19
|
+
<td><%= page.slug %></td>
|
20
|
+
<td><%= truncate(page.title, length: 30) %></td>
|
21
|
+
<td><%= l page.created_at, format: :short %></td>
|
22
|
+
<td><%= page.locked %></td>
|
23
|
+
<td><%= page.version %></td>
|
24
|
+
<td>
|
25
|
+
<%= link_to '', admin_page_versions_path(page.id), class: "fa fa-clock-o", title: "修改记录" %>
|
26
|
+
<%= link_to '', edit_admin_page_path(page), class: "fa fa-pencil" %>
|
27
|
+
<%= link_to '', admin_page_path(page), 'data-confirm' => 'Are you sure?', method: :delete, class: "fa fa-trash" %></td>
|
28
|
+
</tr>
|
29
|
+
<% end %>
|
30
|
+
</table>
|
31
|
+
<%= paginate @pages %>
|
@@ -0,0 +1,25 @@
|
|
1
|
+
<%= simple_form_for @page do |f| %>
|
2
|
+
<%= render "shared/error_messages", target: @page %>
|
3
|
+
|
4
|
+
<%= f.input :slug, hint: "#{Setting.base_url}/wiki/:slug"%>
|
5
|
+
<%= f.input :title, input_html: { class: "xxlarge" } %>
|
6
|
+
|
7
|
+
<div class="edit-tools">
|
8
|
+
<%= render "/shared/editor_toolbar" %>
|
9
|
+
</div>
|
10
|
+
|
11
|
+
<div class="form-group">
|
12
|
+
<%= f.text_area :body, rows: 30, class: 'form-control topic-editor' %>
|
13
|
+
<p class="help-block">
|
14
|
+
请使用 Markdown 格式编写,可以试试用 <a href='https://www.typora.io' target='_blank'>Typora</a> 这个 App 来编写。
|
15
|
+
</p>
|
16
|
+
</div>
|
17
|
+
|
18
|
+
<% if not @page.new_record? %>
|
19
|
+
<%= f.input :change_desc, as: :text, input_html: { rows: "2" }, hint: t("pages.describe_this_time_change") %>
|
20
|
+
<% end %>
|
21
|
+
<div class="form-group">
|
22
|
+
<%= f.submit t("common.save"), class: "btn btn-primary", 'data-disable-with' => t("common.saving") %>
|
23
|
+
<%= link_to t("common.cancel"), pages_path, class: "btn btn-default reset" %>
|
24
|
+
</div>
|
25
|
+
<% end %>
|
@@ -0,0 +1,14 @@
|
|
1
|
+
<div class="sidebar wiki-sidebar col-sm-3">
|
2
|
+
<div class="panel panel-default">
|
3
|
+
<div class="panel-body">
|
4
|
+
<strong>导航</strong>
|
5
|
+
<ul>
|
6
|
+
<li><a href="/wiki">首页</a></li>
|
7
|
+
<li><%= link_to(t("pages.wiki_index"), recent_pages_path) %></li>
|
8
|
+
<li class="hide-ios"><%= link_to(t("pages.new_page"), new_page_path)%></li>
|
9
|
+
</ul>
|
10
|
+
|
11
|
+
<%= raw Setting.wiki_sidebar_html %>
|
12
|
+
</div>
|
13
|
+
</div>
|
14
|
+
</div>
|
@@ -0,0 +1,18 @@
|
|
1
|
+
<% title_tag [t('pages.comments'), @page.title].join(' · ') %>
|
2
|
+
|
3
|
+
<div class="row">
|
4
|
+
<div class="hide-ios">
|
5
|
+
<%= render 'sidebar' %>
|
6
|
+
</div>
|
7
|
+
<div class="col-md-9">
|
8
|
+
<div class="panel panel-default">
|
9
|
+
<div id="comments" class="panel-body">
|
10
|
+
《<%= link_to @page.title, page_path(@page.slug) %>》 - <%= t('pages.comments') %>
|
11
|
+
</div>
|
12
|
+
</div>
|
13
|
+
|
14
|
+
<div class="hide-ios">
|
15
|
+
<%= render "/shared/comments", commentable: @page %>
|
16
|
+
</div>
|
17
|
+
</div>
|
18
|
+
</div>
|
@@ -0,0 +1,14 @@
|
|
1
|
+
<% title_tag t("menu.wiki") %>
|
2
|
+
|
3
|
+
<div class="row">
|
4
|
+
<%= render 'sidebar' %>
|
5
|
+
<% if !turbolinks_app? %>
|
6
|
+
<div class="col-md-9">
|
7
|
+
<div class="panel panel-default">
|
8
|
+
<div class="panel-body">
|
9
|
+
<%= raw Setting.wiki_index_html %>
|
10
|
+
</div>
|
11
|
+
</div>
|
12
|
+
</div>
|
13
|
+
<% end %>
|
14
|
+
</div>
|
@@ -0,0 +1,19 @@
|
|
1
|
+
<% title_tag t('pages.wiki_index') %>
|
2
|
+
|
3
|
+
<div class="row">
|
4
|
+
<div class="hide-ios">
|
5
|
+
<%= render 'sidebar' %>
|
6
|
+
</div>
|
7
|
+
<div class="col-md-9">
|
8
|
+
<div class="panel panel-default">
|
9
|
+
<div class="panel-heading hide-ios"><%= t('pages.wiki_index') %></div>
|
10
|
+
<div class="panel-body">
|
11
|
+
<ul>
|
12
|
+
<% @pages.each do |item| %>
|
13
|
+
<li><%= page_title_tag(item) %></li>
|
14
|
+
<% end %>
|
15
|
+
</ul>
|
16
|
+
</div>
|
17
|
+
</div>
|
18
|
+
</div>
|
19
|
+
</div>
|
@@ -0,0 +1,47 @@
|
|
1
|
+
<% title_tag @page.title %>
|
2
|
+
|
3
|
+
<div class="row">
|
4
|
+
<div class="hide-ios">
|
5
|
+
<%= render 'sidebar' %>
|
6
|
+
</div>
|
7
|
+
<div class="col-md-9 page-detail">
|
8
|
+
<div class="panel panel-default">
|
9
|
+
<% if !@page.locked or admin? %>
|
10
|
+
<div class="panel-heading">
|
11
|
+
<h1><%= @page.title %></h1>
|
12
|
+
<div class="infos">
|
13
|
+
<%= link_to comments_page_path(@page.slug) do %>
|
14
|
+
<%= @page.comments_count %> 条评论
|
15
|
+
<% end %>,
|
16
|
+
<%= @page.version %> 次修正,<%= @page.hits %> 次阅读, <%= t("common.last_modified_at")%> <%= timeago(@page.updated_at) %>
|
17
|
+
<span class="pull-right opts hide-ios">
|
18
|
+
<%= link_to(icon_tag('pencil'), edit_page_path(@page)) if can? :edit, @page %>
|
19
|
+
</span>
|
20
|
+
</div>
|
21
|
+
</div>
|
22
|
+
|
23
|
+
<% end %>
|
24
|
+
|
25
|
+
<div class="panel-body markdown">
|
26
|
+
<article>
|
27
|
+
<%= @page.body_html %>
|
28
|
+
</article>
|
29
|
+
</div>
|
30
|
+
|
31
|
+
<div class="editors panel-footer clearfix">
|
32
|
+
<div class="heading">
|
33
|
+
<%= t("pages.wiki_page_contributors")%>
|
34
|
+
<span class="pull-right"><%= social_share_button_tag h("#{@page.title} via: @#{Setting.twitter_id} ") %></span>
|
35
|
+
</div>
|
36
|
+
<div class="avatars">
|
37
|
+
<% @page.editors.each do |item| %>
|
38
|
+
<%= user_avatar_tag(item, :xs) %>
|
39
|
+
<% end %>
|
40
|
+
</div>
|
41
|
+
<div class="buttons hide-ios">
|
42
|
+
<%= link_to "发表评论", comments_page_path(@page.slug, anchor: "new_comment"), class: "btn btn-success" %>
|
43
|
+
</div>
|
44
|
+
</div>
|
45
|
+
</div>
|
46
|
+
</div>
|
47
|
+
</div>
|
@@ -0,0 +1,18 @@
|
|
1
|
+
<% content_for :stylesheets do %>
|
2
|
+
<%= stylesheet_link_tag "homeland/wiki/application", media: "all" %>
|
3
|
+
<% end %>
|
4
|
+
|
5
|
+
<% content_for :javascripts do %>
|
6
|
+
<%= javascript_include_tag "homeland/wiki/application" %>
|
7
|
+
<% end %>
|
8
|
+
|
9
|
+
<% content_for :main do %>
|
10
|
+
<script type="text/javascript">
|
11
|
+
$('.navbar-nav .nav-plugin-wiki').addClass("active");
|
12
|
+
</script>
|
13
|
+
<div id="homeland-wiki">
|
14
|
+
<%= yield %>
|
15
|
+
</div>
|
16
|
+
<% end %>
|
17
|
+
|
18
|
+
<%= render template: "/layouts/application" %>
|
@@ -0,0 +1,9 @@
|
|
1
|
+
"en":
|
2
|
+
pages:
|
3
|
+
describe_this_time_change: "Please describe the purpose of this modification."
|
4
|
+
edit_page: "Edit Page"
|
5
|
+
new_page: "New Page"
|
6
|
+
wiki_index: "Wiki Index"
|
7
|
+
wiki_page_contributors: "Contributors:"
|
8
|
+
wiki_page_lock_warning: "This page is locked and only Adminstrators are authorised to modify."
|
9
|
+
comments: 'Comments'
|
data/config/routes.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
Homeland::Wiki::Engine.routes.draw do
|
2
|
+
resources :pages, path: 'wiki' do
|
3
|
+
collection do
|
4
|
+
get :recent
|
5
|
+
post :preview
|
6
|
+
end
|
7
|
+
member do
|
8
|
+
get :comments
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
namespace :admin do
|
13
|
+
resources :pages do
|
14
|
+
resources :versions, controller: :page_versions do
|
15
|
+
member do
|
16
|
+
post :revert
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Homeland
|
2
|
+
module Wiki
|
3
|
+
class Engine < ::Rails::Engine
|
4
|
+
isolate_namespace Homeland::Wiki
|
5
|
+
|
6
|
+
initializer 'homeland.wiki.init' do |app|
|
7
|
+
if Setting.has_module?(:wiki)
|
8
|
+
Homeland.register_plugin do |plugin|
|
9
|
+
plugin.name = 'wiki'
|
10
|
+
plugin.display_name = 'Wiki'
|
11
|
+
plugin.description = Homeland::Wiki::DESCRIPTION
|
12
|
+
plugin.version = Homeland::Wiki::VERSION
|
13
|
+
plugin.navbar_link = true
|
14
|
+
plugin.user_menu_link = true
|
15
|
+
plugin.root_path = "/wiki"
|
16
|
+
plugin.admin_path = "/admin/pages"
|
17
|
+
plugin.admin_navbar_link = true
|
18
|
+
plugin.spec_path = config.root.join('spec')
|
19
|
+
end
|
20
|
+
|
21
|
+
app.routes.prepend do
|
22
|
+
mount Homeland::Wiki::Engine, at: '/'
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
metadata
ADDED
@@ -0,0 +1,92 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: homeland-wiki
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Griffin Qiu
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-03-06 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rails
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '5'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '5'
|
27
|
+
description: Display Wiki channel in navbar for wike pages.
|
28
|
+
email:
|
29
|
+
- griffinqiu@gmail.com
|
30
|
+
executables: []
|
31
|
+
extensions: []
|
32
|
+
extra_rdoc_files: []
|
33
|
+
files:
|
34
|
+
- README.md
|
35
|
+
- Rakefile
|
36
|
+
- app/assets/config/homeland_press_manifest.js
|
37
|
+
- app/assets/javascripts/homeland/wiki/application.coffee
|
38
|
+
- app/assets/stylesheets/homeland/wiki/application.scss
|
39
|
+
- app/controllers/homeland/wiki/admin/page_versions_controller.rb
|
40
|
+
- app/controllers/homeland/wiki/admin/pages_controller.rb
|
41
|
+
- app/controllers/homeland/wiki/application_controller.rb
|
42
|
+
- app/controllers/homeland/wiki/pages_controller.rb
|
43
|
+
- app/helpers/homeland/wiki/application_helper.rb
|
44
|
+
- app/models/homeland/wiki/ability.rb
|
45
|
+
- app/models/page.rb
|
46
|
+
- app/models/page_version.rb
|
47
|
+
- app/views/homeland/wiki/admin/page_versions/index.html.erb
|
48
|
+
- app/views/homeland/wiki/admin/page_versions/show.html.erb
|
49
|
+
- app/views/homeland/wiki/admin/pages/_form.html.erb
|
50
|
+
- app/views/homeland/wiki/admin/pages/edit.html.erb
|
51
|
+
- app/views/homeland/wiki/admin/pages/index.html.erb
|
52
|
+
- app/views/homeland/wiki/pages/_form.html.erb
|
53
|
+
- app/views/homeland/wiki/pages/_sidebar.html.erb
|
54
|
+
- app/views/homeland/wiki/pages/comments.html.erb
|
55
|
+
- app/views/homeland/wiki/pages/edit.html.erb
|
56
|
+
- app/views/homeland/wiki/pages/index.html.erb
|
57
|
+
- app/views/homeland/wiki/pages/new.html.erb
|
58
|
+
- app/views/homeland/wiki/pages/recent.html.erb
|
59
|
+
- app/views/homeland/wiki/pages/show.html.erb
|
60
|
+
- app/views/layouts/homeland/wiki/application.html.erb
|
61
|
+
- config/locales/pages.en.yml
|
62
|
+
- config/locales/pages.zh-CN.yml
|
63
|
+
- config/locales/pages.zh-TW.yml
|
64
|
+
- config/routes.rb
|
65
|
+
- lib/homeland/wiki.rb
|
66
|
+
- lib/homeland/wiki/engine.rb
|
67
|
+
- lib/homeland/wiki/version.rb
|
68
|
+
homepage: https://github.com/ruby-china/homeland-wiki
|
69
|
+
licenses:
|
70
|
+
- MIT
|
71
|
+
metadata: {}
|
72
|
+
post_install_message:
|
73
|
+
rdoc_options: []
|
74
|
+
require_paths:
|
75
|
+
- lib
|
76
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
77
|
+
requirements:
|
78
|
+
- - ">="
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
version: '0'
|
81
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
82
|
+
requirements:
|
83
|
+
- - ">="
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
requirements: []
|
87
|
+
rubyforge_project:
|
88
|
+
rubygems_version: 2.6.8
|
89
|
+
signing_key:
|
90
|
+
specification_version: 4
|
91
|
+
summary: Display Wiki channel in navbar for wike pages.
|
92
|
+
test_files: []
|