pressroom 0.1.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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +22 -0
- data/MIT-LICENSE +20 -0
- data/README.md +172 -0
- data/Rakefile +8 -0
- data/app/assets/javascripts/pressroom/application.js +18 -0
- data/app/assets/javascripts/pressroom/controllers/editor_controller.js +146 -0
- data/app/assets/javascripts/pressroom/vendor/code.js +181 -0
- data/app/assets/javascripts/pressroom/vendor/delimiter.js +98 -0
- data/app/assets/javascripts/pressroom/vendor/editorjs.js +11217 -0
- data/app/assets/javascripts/pressroom/vendor/header.js +321 -0
- data/app/assets/javascripts/pressroom/vendor/image.js +1103 -0
- data/app/assets/javascripts/pressroom/vendor/inline-code.js +99 -0
- data/app/assets/javascripts/pressroom/vendor/list.js +2091 -0
- data/app/assets/javascripts/pressroom/vendor/marker.js +95 -0
- data/app/assets/javascripts/pressroom/vendor/quote.js +990 -0
- data/app/assets/javascripts/pressroom/vendor/stimulus.js +2563 -0
- data/app/assets/javascripts/pressroom/vendor/turbo.js +7256 -0
- data/app/assets/stylesheets/pressroom/admin.css +216 -0
- data/app/assets/stylesheets/pressroom/content.css +18 -0
- data/app/controllers/pressroom/application_controller.rb +41 -0
- data/app/controllers/pressroom/categories_controller.rb +50 -0
- data/app/controllers/pressroom/posts_controller.rb +98 -0
- data/app/controllers/pressroom/tags_controller.rb +39 -0
- data/app/controllers/pressroom/uploads_controller.rb +52 -0
- data/app/helpers/pressroom/application_helper.rb +4 -0
- data/app/helpers/pressroom/blocks_helper.rb +13 -0
- data/app/jobs/pressroom/application_job.rb +4 -0
- data/app/mailers/pressroom/application_mailer.rb +6 -0
- data/app/models/concerns/pressroom/authorable.rb +23 -0
- data/app/models/concerns/pressroom/sluggable.rb +66 -0
- data/app/models/pressroom/application_record.rb +7 -0
- data/app/models/pressroom/category.rb +54 -0
- data/app/models/pressroom/post.rb +90 -0
- data/app/models/pressroom/tag.rb +30 -0
- data/app/models/pressroom/tagging.rb +12 -0
- data/app/views/layouts/pressroom/admin.html.erb +34 -0
- data/app/views/layouts/pressroom/application.html.erb +17 -0
- data/app/views/pressroom/blocks/_code.html.erb +2 -0
- data/app/views/pressroom/blocks/_delimiter.html.erb +1 -0
- data/app/views/pressroom/blocks/_header.html.erb +5 -0
- data/app/views/pressroom/blocks/_image.html.erb +18 -0
- data/app/views/pressroom/blocks/_list.html.erb +6 -0
- data/app/views/pressroom/blocks/_list_items.html.erb +13 -0
- data/app/views/pressroom/blocks/_paragraph.html.erb +1 -0
- data/app/views/pressroom/blocks/_quote.html.erb +6 -0
- data/app/views/pressroom/categories/_form.html.erb +31 -0
- data/app/views/pressroom/categories/edit.html.erb +3 -0
- data/app/views/pressroom/categories/index.html.erb +34 -0
- data/app/views/pressroom/categories/new.html.erb +3 -0
- data/app/views/pressroom/posts/_form.html.erb +49 -0
- data/app/views/pressroom/posts/_post_row.html.erb +17 -0
- data/app/views/pressroom/posts/edit.html.erb +34 -0
- data/app/views/pressroom/posts/index.html.erb +38 -0
- data/app/views/pressroom/posts/new.html.erb +3 -0
- data/app/views/pressroom/tags/edit.html.erb +24 -0
- data/app/views/pressroom/tags/index.html.erb +27 -0
- data/config/editorjs_manifest.yml +53 -0
- data/config/importmap.rb +18 -0
- data/config/locales/pressroom.en.yml +16 -0
- data/config/locales/transliteration.ru.yml +70 -0
- data/config/locales/transliteration.uk.yml +70 -0
- data/config/routes.rb +17 -0
- data/db/migrate/20260821000001_create_pressroom_posts.rb +42 -0
- data/db/migrate/20260821000002_create_pressroom_taxonomy.rb +33 -0
- data/lib/pressroom/blocks/definition.rb +103 -0
- data/lib/pressroom/blocks/registry.rb +56 -0
- data/lib/pressroom/blocks/renderer.rb +97 -0
- data/lib/pressroom/blocks/sanitizer.rb +36 -0
- data/lib/pressroom/blocks/schema.rb +247 -0
- data/lib/pressroom/blocks/text_extractor.rb +46 -0
- data/lib/pressroom/built_in_blocks.rb +97 -0
- data/lib/pressroom/configuration.rb +64 -0
- data/lib/pressroom/engine.rb +33 -0
- data/lib/pressroom/errors.rb +11 -0
- data/lib/pressroom/feed.rb +69 -0
- data/lib/pressroom/transliteration.rb +213 -0
- data/lib/pressroom/version.rb +3 -0
- data/lib/pressroom.rb +70 -0
- data/lib/tasks/pressroom_tasks.rake +4 -0
- data/lib/tasks/pressroom_vendor.rake +31 -0
- metadata +171 -0
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
(function(){"use strict";try{if(typeof document<"u"){var e=document.createElement("style");e.appendChild(document.createTextNode(".inline-code{background:rgba(250,239,240,.78);color:#b44437;padding:3px 4px;border-radius:5px;margin:0 1px;font-family:inherit;font-size:.86em;font-weight:500;letter-spacing:.3px}")),document.head.appendChild(e)}}catch(n){console.error("vite-plugin-css-injected-by-js",n)}})();
|
|
2
|
+
const a = '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 8L5 12L9 16"/><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 8L19 12L15 16"/></svg>';
|
|
3
|
+
class s {
|
|
4
|
+
constructor({ api: t }) {
|
|
5
|
+
this.tag = "CODE", this.api = t, this.button = null, this.iconClasses = {
|
|
6
|
+
base: this.api.styles.inlineToolButton,
|
|
7
|
+
active: this.api.styles.inlineToolButtonActive
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Class name for term-tag
|
|
12
|
+
*
|
|
13
|
+
* @type {string}
|
|
14
|
+
*/
|
|
15
|
+
static get CSS() {
|
|
16
|
+
return "inline-code";
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Specifies Tool as Inline Toolbar Tool
|
|
20
|
+
*
|
|
21
|
+
* @return {boolean}
|
|
22
|
+
*/
|
|
23
|
+
static get isInline() {
|
|
24
|
+
return !0;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Create button element for Toolbar
|
|
28
|
+
*
|
|
29
|
+
* @return {HTMLElement}
|
|
30
|
+
*/
|
|
31
|
+
render() {
|
|
32
|
+
return this.button = document.createElement("button"), this.button.type = "button", this.button.classList.add(this.iconClasses.base), this.button.innerHTML = this.toolboxIcon, this.button;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Wrap/Unwrap selected fragment
|
|
36
|
+
*
|
|
37
|
+
* @param {Range} range - selected fragment
|
|
38
|
+
*/
|
|
39
|
+
surround(t) {
|
|
40
|
+
var n;
|
|
41
|
+
if (!t)
|
|
42
|
+
return;
|
|
43
|
+
let e = this.api.selection.findParentTag(this.tag, s.CSS);
|
|
44
|
+
e ? this.unwrap(e) : (n = t.commonAncestorContainer.parentElement) != null && n.querySelector(this.tag) || this.wrap(t);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Wrap selection with term-tag
|
|
48
|
+
*
|
|
49
|
+
* @param {Range} range - selected fragment
|
|
50
|
+
*/
|
|
51
|
+
wrap(t) {
|
|
52
|
+
let e = document.createElement(this.tag);
|
|
53
|
+
e.classList.add(s.CSS), e.appendChild(t.extractContents()), t.insertNode(e), this.api.selection.expandToTag(e);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Unwrap term-tag
|
|
57
|
+
*
|
|
58
|
+
* @param {HTMLElement} termWrapper - term wrapper tag
|
|
59
|
+
*/
|
|
60
|
+
unwrap(t) {
|
|
61
|
+
var o;
|
|
62
|
+
this.api.selection.expandToTag(t);
|
|
63
|
+
const e = window.getSelection();
|
|
64
|
+
if (!e)
|
|
65
|
+
return;
|
|
66
|
+
const n = e.getRangeAt(0), i = n.extractContents();
|
|
67
|
+
(o = t.parentNode) == null || o.removeChild(t), n.insertNode(i), e.removeAllRanges(), e.addRange(n);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Check and change Term's state for current selection
|
|
71
|
+
*
|
|
72
|
+
* @return {boolean}
|
|
73
|
+
*/
|
|
74
|
+
checkState() {
|
|
75
|
+
const t = this.api.selection.findParentTag(this.tag, s.CSS);
|
|
76
|
+
return this.button && this.button.classList.toggle(this.iconClasses.active, !!t), !!t;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Get Tool icon's SVG
|
|
80
|
+
* @return {string}
|
|
81
|
+
*/
|
|
82
|
+
get toolboxIcon() {
|
|
83
|
+
return a;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Sanitizer rule
|
|
87
|
+
* @return {SanitizerConfig}
|
|
88
|
+
*/
|
|
89
|
+
static get sanitize() {
|
|
90
|
+
return {
|
|
91
|
+
code: {
|
|
92
|
+
class: s.CSS
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
export {
|
|
98
|
+
s as default
|
|
99
|
+
};
|