dokno 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +130 -0
  4. data/Rakefile +22 -0
  5. data/app/assets/config/dokno_manifest.js +3 -0
  6. data/app/assets/javascripts/dokno.js +144 -0
  7. data/app/assets/javascripts/dokno/application.js +15 -0
  8. data/app/assets/javascripts/feather.min.js +13 -0
  9. data/app/assets/javascripts/init.js +5 -0
  10. data/app/assets/stylesheets/dokno/application.css +137 -0
  11. data/app/assets/stylesheets/dokno/tailwind.min.css +1 -0
  12. data/app/controllers/dokno/application_controller.rb +7 -0
  13. data/app/controllers/dokno/articles_controller.rb +115 -0
  14. data/app/controllers/dokno/categories_controller.rb +63 -0
  15. data/app/controllers/dokno/pagination_concern.rb +15 -0
  16. data/app/controllers/dokno/user_concern.rb +38 -0
  17. data/app/helpers/dokno/application_helper.rb +17 -0
  18. data/app/models/dokno/application_record.rb +5 -0
  19. data/app/models/dokno/article.rb +215 -0
  20. data/app/models/dokno/article_slug.rb +7 -0
  21. data/app/models/dokno/category.rb +100 -0
  22. data/app/models/dokno/log.rb +7 -0
  23. data/app/views/dokno/_article_formatting.html.erb +89 -0
  24. data/app/views/dokno/_article_panel.html.erb +112 -0
  25. data/app/views/dokno/_panel_formatting.html.erb +95 -0
  26. data/app/views/dokno/_reset_formatting.html.erb +55 -0
  27. data/app/views/dokno/articles/_article_form.html.erb +60 -0
  28. data/app/views/dokno/articles/edit.html.erb +7 -0
  29. data/app/views/dokno/articles/new.html.erb +7 -0
  30. data/app/views/dokno/articles/show.html.erb +130 -0
  31. data/app/views/dokno/categories/_category_form.html.erb +33 -0
  32. data/app/views/dokno/categories/edit.html.erb +7 -0
  33. data/app/views/dokno/categories/index.html.erb +96 -0
  34. data/app/views/dokno/categories/new.html.erb +7 -0
  35. data/app/views/layouts/dokno/application.html.erb +100 -0
  36. data/app/views/partials/_form_errors.html.erb +18 -0
  37. data/app/views/partials/_logs.html.erb +52 -0
  38. data/app/views/partials/_pagination.html.erb +35 -0
  39. data/config/routes.rb +11 -0
  40. data/db/migrate/20201203190330_baseline.rb +62 -0
  41. data/lib/dokno.rb +4 -0
  42. data/lib/dokno/config/config.rb +73 -0
  43. data/lib/dokno/engine.rb +27 -0
  44. data/lib/dokno/version.rb +3 -0
  45. data/lib/generators/dokno/install/install_generator.rb +13 -0
  46. data/lib/generators/dokno/templates/config/dokno_template.md +5 -0
  47. data/lib/generators/dokno/templates/config/initializers/dokno.rb +14 -0
  48. data/lib/tasks/dokno_tasks.rake +4 -0
  49. metadata +253 -0
@@ -0,0 +1,18 @@
1
+ <div id="error_explanation" class="bg-white mb-10">
2
+ <i data-feather="alert-octagon" class="float-right"></i>
3
+ <h2 class="font-semibold">
4
+ There
5
+ <% if errors.count == 1 %>
6
+ is a problem
7
+ <% else %>
8
+ are <%= pluralize(errors.count, "problem") %>
9
+ <% end %>
10
+ that must be resolved before saving:
11
+ </h2>
12
+
13
+ <ul class="mt-5 list-disc list-inside bg-gray-100 p-5 rounded">
14
+ <% errors.full_messages.each do |message| %>
15
+ <li><%= message %></li>
16
+ <% end %>
17
+ </ul>
18
+ </div>
@@ -0,0 +1,52 @@
1
+ <% if article&.logs.present? %>
2
+ <div class="py-10 px-16 text-gray-200 bg-gray-900">
3
+ <div class="w-full max-w-screen-xl m-auto">
4
+ <div class="text-xl text-gray-600 cursor-pointer" onclick="toggleVisibility('change-log');">
5
+ Change log for this article
6
+
7
+ <div class="inline toggle-visibility-indicator-container change-log">
8
+ <i data-feather="chevron-left" class="inline toggle-visibility-indicator change-log"></i>
9
+ </div>
10
+ </div>
11
+
12
+ <div id="change-log" class="bg-gray-800 px-10 mt-8 rounded hidden text-gray-500">
13
+ <ul>
14
+ <% article.logs.includes(article: :categories).each do |log| %>
15
+ <li class="my-10">
16
+ <div>
17
+ <% if article.blank? %>
18
+ <div class="text-white text-xl"><a href="<%= article_path log.article.slug %>" title="View Article"><%= log.article.title %></a></div>
19
+ <div class="mb-5"><%= log.article.category_name_list %></div>
20
+ <% end %>
21
+
22
+ <div class="text-gray-500 bg-gray-700 p-5 pr-10 rounded <%= 'cursor-pointer' if log.diff_left != log.diff_right %> flex items-center" onclick="toggleVisibility('article-diff-<%= log.id %>');" title="Show / Hide Diff">
23
+ <div class="w-4/5">
24
+ <%= time_ago_in_words log.created_at %> ago
25
+ <% if log.username.present? %>
26
+ by <%= log.username %>
27
+ <% end %>
28
+
29
+ <% if log.meta.present? %>
30
+ <br /><span class="text-gray-300"><%= log.meta %></span>
31
+ <% end %>
32
+ </div>
33
+
34
+ <div class="w-1/5 text-right toggle-visibility-indicator-container article-diff-<%= log.id %>">
35
+ <% if log.diff_left != log.diff_right %><i data-feather="chevron-left" class="inline toggle-visibility-indicator article-diff-<%= log.id %>"></i><% end %>
36
+ </div>
37
+ </div>
38
+
39
+ <% if log.diff_left != log.diff_right %>
40
+ <div id="article-diff-<%= log.id %>" class="flex hidden">
41
+ <div class="w-1/2 p-5">Before:<br /><%= log.diff_left.html_safe %></div>
42
+ <div class="w-1/2 p-5">After:<br /><%= log.diff_right.html_safe %></div>
43
+ </div>
44
+ <% end %>
45
+ </div>
46
+ </li>
47
+ <% end %>
48
+ </ul>
49
+ </div>
50
+ </div>
51
+ </div>
52
+ <% end %>
@@ -0,0 +1,35 @@
1
+ <span class="mr-5">
2
+ <% if @page > 1 %>
3
+ <span class="mr-1 inline-block"><a href="?search_term=<%= CGI.escape @search_term.to_s %>&order=<%= @order %>&page=<%= (@page - 1) %>"><i data-feather="arrow-left" class="h-5 inline-block" title="Previous page"></i></a></span>
4
+ <% end %>
5
+
6
+ <span class="mr-1 inline-block">Page</span>
7
+
8
+ <%= form_with(url: article_index_path, method: :get, class: 'inline') do %>
9
+ <input type="hidden" name="id" value="<%= @category&.id %>">
10
+ <input type="hidden" name="search_term" value="<%= @search_term %>">
11
+ <input type="hidden" name="order" value="<%= @order %>">
12
+ <input type="text" name="page" id="page" value="<%= @page %>" onclick="this.select();" class="w-10 text-center bg-gray-200 rounded" />
13
+
14
+ <span class="mx-1 inline-block">of</span>
15
+ <span class="text-center inline-block"><%= @total_pages %></span>
16
+ <% end %>
17
+
18
+ <% if @page < @total_pages %>
19
+ <span class="ml-1 inline-block"><a href="?search_term=<%= CGI.escape @search_term.to_s %>&order=<%= @order %>&page=<%= (@page + 1) %>"><i data-feather="arrow-right" class="h-5 inline-block" title="Next page"></i></a></span>
20
+ <% end %>
21
+ </span>
22
+
23
+ <span class="text-gray-400">
24
+ <%= @total_records %>
25
+ <%= 'uncategorized' if @category.blank? && @search_term.blank? %>
26
+ <%= 'article'.pluralize(@total_records) %>
27
+
28
+ <% if @search_term.present? %>
29
+ containing <span class="font-serif">&ldquo;</span><%= @search_term %><span class="font-serif">&rdquo;</span>
30
+ <% end %>
31
+
32
+ <% if @category.present? %>
33
+ in <%= "#{(children_count = @category.branch.count) == 1 ? 'this' : children_count} #{'category'.pluralize(children_count)}" %>
34
+ <% end %>
35
+ </span>
@@ -0,0 +1,11 @@
1
+ Dokno::Engine.routes.draw do
2
+ resources :categories, except: [:show]
3
+ resources :articles
4
+
5
+ get '/(:cat_code)', to: 'categories#index', as: :article_index
6
+ get 'article_panel/(:slug)', to: 'articles#panel', as: :panel
7
+ post 'article_log', to: 'articles#article_log', as: :article_log
8
+ post 'article_preview', to: 'articles#preview', as: :preview
9
+ post 'article_status', to: 'articles#status', as: :status
10
+ root 'categories#index'
11
+ end
@@ -0,0 +1,62 @@
1
+ class Baseline < ActiveRecord::Migration[6.0]
2
+ def change
3
+ create_table "dokno_article_slugs", force: :cascade do |t|
4
+ t.string "slug", null: false
5
+ t.bigint "article_id"
6
+ t.datetime "created_at", precision: 6, null: false
7
+ t.datetime "updated_at", precision: 6, null: false
8
+ t.index ["article_id"], name: "index_dokno_article_slugs_on_article_id"
9
+ t.index ["slug"], name: "index_dokno_article_slugs_on_slug", unique: true
10
+ end
11
+
12
+ create_table "dokno_articles", force: :cascade do |t|
13
+ t.string "slug"
14
+ t.string "title"
15
+ t.text "markdown"
16
+ t.datetime "created_at", precision: 6, null: false
17
+ t.datetime "updated_at", precision: 6, null: false
18
+ t.text "summary"
19
+ t.boolean "active", default: true
20
+ t.bigint "views", default: 0
21
+ t.datetime "last_viewed_at"
22
+ t.index ["slug"], name: "index_dokno_articles_on_slug", unique: true
23
+ end
24
+
25
+ create_table "dokno_articles_categories", id: false, force: :cascade do |t|
26
+ t.bigint "article_id"
27
+ t.bigint "category_id"
28
+ t.index ["article_id", "category_id"], name: "index_dokno_articles_categories_on_article_id_and_category_id", unique: true
29
+ t.index ["article_id"], name: "index_dokno_articles_categories_on_article_id"
30
+ t.index ["category_id"], name: "index_dokno_articles_categories_on_category_id"
31
+ end
32
+
33
+ create_table "dokno_categories", force: :cascade do |t|
34
+ t.string "name"
35
+ t.datetime "created_at", precision: 6, null: false
36
+ t.datetime "updated_at", precision: 6, null: false
37
+ t.bigint "category_id"
38
+ t.string "code", null: false
39
+ t.index ["category_id"], name: "index_dokno_categories_on_category_id"
40
+ t.index ["code"], name: "index_dokno_categories_on_code", unique: true
41
+ t.index ["name"], name: "index_dokno_categories_on_name", unique: true
42
+ end
43
+
44
+ create_table "dokno_logs", force: :cascade do |t|
45
+ t.bigint "article_id"
46
+ t.string "username"
47
+ t.text "meta"
48
+ t.text "diff_left"
49
+ t.text "diff_right"
50
+ t.datetime "created_at", precision: 6, null: false
51
+ t.datetime "updated_at", precision: 6, null: false
52
+ t.index ["article_id"], name: "index_dokno_logs_on_article_id"
53
+ t.index ["username"], name: "index_dokno_logs_on_username"
54
+ end
55
+
56
+ add_foreign_key "dokno_article_slugs", "dokno_articles", column: "article_id"
57
+ add_foreign_key "dokno_articles_categories", "dokno_articles", column: "article_id"
58
+ add_foreign_key "dokno_articles_categories", "dokno_categories", column: "category_id"
59
+ add_foreign_key "dokno_categories", "dokno_categories", column: "category_id"
60
+ add_foreign_key "dokno_logs", "dokno_articles", column: "article_id"
61
+ end
62
+ end
@@ -0,0 +1,4 @@
1
+ require "dokno/engine"
2
+
3
+ module Dokno
4
+ end
@@ -0,0 +1,73 @@
1
+ module Dokno
2
+ def self.configure
3
+ yield config
4
+ config.validate
5
+ end
6
+
7
+ def self.config
8
+ @config ||= Config.new
9
+ end
10
+
11
+ def self.config=(val)
12
+ @config = val
13
+ end
14
+
15
+ class Config
16
+ # (String) Host application name for display within the mounted dashboard
17
+ attr_accessor :app_name
18
+
19
+ # (Enumerable) Determines which HTML tags are allowed in Article markdown
20
+ attr_accessor :tag_whitelist
21
+
22
+ # (Enumerable) Determines which HTML attributes are allowed in Article markdown
23
+ attr_accessor :attr_whitelist
24
+
25
+ # (String) Host application's user object
26
+ attr_accessor :app_user_object
27
+
28
+ # (Symbol) Host application's user object method that should be used to authorize users to edit Dokno data
29
+ # Should return boolean.
30
+ attr_accessor :app_user_auth_method
31
+
32
+ # (Symbol) Host application's user object method that should return the authenticated user's name or other
33
+ # identifier that will be included in change log events. Should return a string.
34
+ attr_accessor :app_user_name_method
35
+
36
+ # Defaults
37
+ TAG_WHITELIST = %w[code img h1 h2 h3 h4 h5 h6 a em u i b strong ol ul li table thead tbody tfoot tr th td blockquote hr br p]
38
+ ATTR_WHITELIST = %w[src alt title href target]
39
+ APP_USER_OBJECT = 'current_user'
40
+ APP_USER_AUTH_METHOD = 'admin?'
41
+ APP_USER_NAME_METHOD = 'name'
42
+
43
+ def initialize
44
+ self.app_name = Rails.application.class.module_parent.name.underscore.humanize.upcase
45
+ self.tag_whitelist = TAG_WHITELIST
46
+ self.attr_whitelist = ATTR_WHITELIST
47
+ self.app_user_object = APP_USER_OBJECT
48
+ self.app_user_auth_method = APP_USER_AUTH_METHOD
49
+ self.app_user_name_method = APP_USER_NAME_METHOD
50
+ end
51
+
52
+ def validate
53
+ validate_tag_whitelist
54
+ validate_attr_whitelist
55
+ end
56
+
57
+ def validate_tag_whitelist
58
+ return unless !tag_whitelist.is_a?(Enumerable)
59
+
60
+ raise "#{config_error_prefix} tag_whitelist must be Enumerable"
61
+ end
62
+
63
+ def validate_attr_whitelist
64
+ return unless !attr_whitelist.is_a?(Enumerable)
65
+
66
+ raise "#{config_error_prefix} attr_whitelist must be Enumerable"
67
+ end
68
+
69
+ def config_error_prefix
70
+ "Dokno configuration error (check config/initializers/dokno.rb):"
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,27 @@
1
+ require_relative 'config/config'
2
+
3
+ module Dokno
4
+ class Engine < ::Rails::Engine
5
+ isolate_namespace Dokno
6
+
7
+ initializer 'Dokno precompile', group: :all do |app|
8
+ app.config.assets.precompile << "dokno_manifest.js"
9
+ end
10
+
11
+ config.generators do |g|
12
+ g.test_framework :rspec
13
+ end
14
+
15
+ initializer :append_migrations do |app|
16
+ config.paths["db/migrate"].expanded.each do |expanded_path|
17
+ app.config.paths["db/migrate"] << expanded_path
18
+ end
19
+ end
20
+
21
+ initializer 'local_helper.action_controller' do
22
+ ActiveSupport.on_load :action_controller do
23
+ helper Dokno::ApplicationHelper
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,3 @@
1
+ module Dokno
2
+ VERSION = '1.0.0'
3
+ end
@@ -0,0 +1,13 @@
1
+ module Dokno
2
+ module Generators
3
+ class InstallGenerator < Rails::Generators::Base
4
+ source_root File.expand_path('../../templates', __FILE__)
5
+
6
+ desc 'Copies the Dokno configuration templates to the host app'
7
+ def copy_initializer
8
+ template 'config/initializers/dokno.rb', 'config/initializers/dokno.rb'
9
+ template 'config/dokno_template.md', 'config/dokno_template.md'
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,5 @@
1
+ This is your article template. It's helpful for adding consistency to your app's knowledgebase articles.
2
+
3
+ Articles support <strong>basic HTML</strong> and **markdown**.
4
+
5
+ You can modify this template in `/config/dokno_template.md`
@@ -0,0 +1,14 @@
1
+ Dokno.configure do |config|
2
+ config.tag_whitelist = Dokno::Config::TAG_WHITELIST
3
+ config.attr_whitelist = Dokno::Config::ATTR_WHITELIST
4
+
5
+ # To restrict Dokno data modification and include indentifying information
6
+ # in change log entries, provide the appropriate user values for your app below.
7
+ # (String) app_user_object
8
+ # (Symbol) app_user_auth_method
9
+ # (Symbol) app_user_name_method
10
+
11
+ # config.app_user_object = 'current_user'
12
+ # config.app_user_auth_method = :admin?
13
+ # config.app_user_name_method = :name
14
+ end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :dokno do
3
+ # # Task goes here
4
+ # end
metadata ADDED
@@ -0,0 +1,253 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dokno
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Courtney Payne
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-12-03 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: diffy
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '3.4'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '3.4'
27
+ - !ruby/object:Gem::Dependency
28
+ name: redcarpet
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '3.5'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '3.5'
41
+ - !ruby/object:Gem::Dependency
42
+ name: database_cleaner-active_record
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.8'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.8'
55
+ - !ruby/object:Gem::Dependency
56
+ name: pg
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.2'
62
+ - - ">="
63
+ - !ruby/object:Gem::Version
64
+ version: 1.2.3
65
+ type: :development
66
+ prerelease: false
67
+ version_requirements: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - "~>"
70
+ - !ruby/object:Gem::Version
71
+ version: '1.2'
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: 1.2.3
75
+ - !ruby/object:Gem::Dependency
76
+ name: pry-byebug
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '3.9'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '3.9'
89
+ - !ruby/object:Gem::Dependency
90
+ name: rails
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: 6.0.3
96
+ - - ">="
97
+ - !ruby/object:Gem::Version
98
+ version: 6.0.3.4
99
+ type: :development
100
+ prerelease: false
101
+ version_requirements: !ruby/object:Gem::Requirement
102
+ requirements:
103
+ - - "~>"
104
+ - !ruby/object:Gem::Version
105
+ version: 6.0.3
106
+ - - ">="
107
+ - !ruby/object:Gem::Version
108
+ version: 6.0.3.4
109
+ - !ruby/object:Gem::Dependency
110
+ name: rspec-rails
111
+ requirement: !ruby/object:Gem::Requirement
112
+ requirements:
113
+ - - "~>"
114
+ - !ruby/object:Gem::Version
115
+ version: '4.0'
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ version: 4.0.1
119
+ type: :development
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - "~>"
124
+ - !ruby/object:Gem::Version
125
+ version: '4.0'
126
+ - - ">="
127
+ - !ruby/object:Gem::Version
128
+ version: 4.0.1
129
+ - !ruby/object:Gem::Dependency
130
+ name: simplecov
131
+ requirement: !ruby/object:Gem::Requirement
132
+ requirements:
133
+ - - "~>"
134
+ - !ruby/object:Gem::Version
135
+ version: 0.19.1
136
+ type: :development
137
+ prerelease: false
138
+ version_requirements: !ruby/object:Gem::Requirement
139
+ requirements:
140
+ - - "~>"
141
+ - !ruby/object:Gem::Version
142
+ version: 0.19.1
143
+ - !ruby/object:Gem::Dependency
144
+ name: bullet
145
+ requirement: !ruby/object:Gem::Requirement
146
+ requirements:
147
+ - - "~>"
148
+ - !ruby/object:Gem::Version
149
+ version: '6.1'
150
+ type: :development
151
+ prerelease: false
152
+ version_requirements: !ruby/object:Gem::Requirement
153
+ requirements:
154
+ - - "~>"
155
+ - !ruby/object:Gem::Version
156
+ version: '6.1'
157
+ - !ruby/object:Gem::Dependency
158
+ name: faker
159
+ requirement: !ruby/object:Gem::Requirement
160
+ requirements:
161
+ - - "~>"
162
+ - !ruby/object:Gem::Version
163
+ version: '2.15'
164
+ type: :development
165
+ prerelease: false
166
+ version_requirements: !ruby/object:Gem::Requirement
167
+ requirements:
168
+ - - "~>"
169
+ - !ruby/object:Gem::Version
170
+ version: '2.15'
171
+ description: Dokno allows you to easily mount a self-contained knowledgebase / wiki
172
+ / help system to your Rails app where you and your users can author articles relevant
173
+ to your app.
174
+ email:
175
+ - cpayne624@gmail.com
176
+ executables: []
177
+ extensions: []
178
+ extra_rdoc_files: []
179
+ files:
180
+ - MIT-LICENSE
181
+ - README.md
182
+ - Rakefile
183
+ - app/assets/config/dokno_manifest.js
184
+ - app/assets/javascripts/dokno.js
185
+ - app/assets/javascripts/dokno/application.js
186
+ - app/assets/javascripts/feather.min.js
187
+ - app/assets/javascripts/init.js
188
+ - app/assets/stylesheets/dokno/application.css
189
+ - app/assets/stylesheets/dokno/tailwind.min.css
190
+ - app/controllers/dokno/application_controller.rb
191
+ - app/controllers/dokno/articles_controller.rb
192
+ - app/controllers/dokno/categories_controller.rb
193
+ - app/controllers/dokno/pagination_concern.rb
194
+ - app/controllers/dokno/user_concern.rb
195
+ - app/helpers/dokno/application_helper.rb
196
+ - app/models/dokno/application_record.rb
197
+ - app/models/dokno/article.rb
198
+ - app/models/dokno/article_slug.rb
199
+ - app/models/dokno/category.rb
200
+ - app/models/dokno/log.rb
201
+ - app/views/dokno/_article_formatting.html.erb
202
+ - app/views/dokno/_article_panel.html.erb
203
+ - app/views/dokno/_panel_formatting.html.erb
204
+ - app/views/dokno/_reset_formatting.html.erb
205
+ - app/views/dokno/articles/_article_form.html.erb
206
+ - app/views/dokno/articles/edit.html.erb
207
+ - app/views/dokno/articles/new.html.erb
208
+ - app/views/dokno/articles/show.html.erb
209
+ - app/views/dokno/categories/_category_form.html.erb
210
+ - app/views/dokno/categories/edit.html.erb
211
+ - app/views/dokno/categories/index.html.erb
212
+ - app/views/dokno/categories/new.html.erb
213
+ - app/views/layouts/dokno/application.html.erb
214
+ - app/views/partials/_form_errors.html.erb
215
+ - app/views/partials/_logs.html.erb
216
+ - app/views/partials/_pagination.html.erb
217
+ - config/routes.rb
218
+ - db/migrate/20201203190330_baseline.rb
219
+ - lib/dokno.rb
220
+ - lib/dokno/config/config.rb
221
+ - lib/dokno/engine.rb
222
+ - lib/dokno/version.rb
223
+ - lib/generators/dokno/install/install_generator.rb
224
+ - lib/generators/dokno/templates/config/dokno_template.md
225
+ - lib/generators/dokno/templates/config/initializers/dokno.rb
226
+ - lib/tasks/dokno_tasks.rake
227
+ homepage: https://github.com/cpayne624/dokno
228
+ licenses:
229
+ - MIT
230
+ metadata:
231
+ bug_tracker_uri: https://github.com/cpayne624/dokno/issues
232
+ changelog_uri: https://github.com/cpayne624/dokno/blob/master/CHANGELOG.md
233
+ post_install_message:
234
+ rdoc_options: []
235
+ require_paths:
236
+ - lib
237
+ required_ruby_version: !ruby/object:Gem::Requirement
238
+ requirements:
239
+ - - ">="
240
+ - !ruby/object:Gem::Version
241
+ version: '0'
242
+ required_rubygems_version: !ruby/object:Gem::Requirement
243
+ requirements:
244
+ - - ">="
245
+ - !ruby/object:Gem::Version
246
+ version: '0'
247
+ requirements: []
248
+ rubygems_version: 3.1.4
249
+ signing_key:
250
+ specification_version: 4
251
+ summary: Dokno (dough-no) is a lightweight mountable Rails Engine for storing and
252
+ managing your app's domain knowledge.
253
+ test_files: []