inkpen 0.7.1 → 0.8.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 +4 -4
- data/CLAUDE.md +64 -4
- data/README.md +4 -0
- data/app/assets/javascripts/inkpen/export/markdown.js +12 -3
- data/app/assets/javascripts/inkpen.bundle.js +1163 -0
- data/app/assets/javascripts/inkpen.bundle.js.map +7 -0
- data/config/importmap.rb +19 -170
- data/lib/inkpen/markdown_mode.rb +213 -0
- data/lib/inkpen/version.rb +1 -1
- metadata +9 -6
data/config/importmap.rb
CHANGED
|
@@ -1,170 +1,19 @@
|
|
|
1
|
-
# Inkpen importmap
|
|
2
|
-
#
|
|
3
|
-
#
|
|
4
|
-
|
|
5
|
-
#
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
pin "
|
|
20
|
-
pin "w3c-keyname", to: "https://esm.sh/w3c-keyname@2.2.8"
|
|
21
|
-
pin "crelt", to: "https://esm.sh/crelt@1.0.6"
|
|
22
|
-
|
|
23
|
-
# TipTap core
|
|
24
|
-
pin "@tiptap/core", to: "https://esm.sh/@tiptap/core@2.10.3"
|
|
25
|
-
pin "@tiptap/pm/state", to: "https://esm.sh/@tiptap/pm@2.10.3/state"
|
|
26
|
-
pin "@tiptap/pm/view", to: "https://esm.sh/@tiptap/pm@2.10.3/view"
|
|
27
|
-
pin "@tiptap/pm/model", to: "https://esm.sh/@tiptap/pm@2.10.3/model"
|
|
28
|
-
pin "@tiptap/pm/transform", to: "https://esm.sh/@tiptap/pm@2.10.3/transform"
|
|
29
|
-
pin "@tiptap/pm/commands", to: "https://esm.sh/@tiptap/pm@2.10.3/commands"
|
|
30
|
-
pin "@tiptap/pm/keymap", to: "https://esm.sh/@tiptap/pm@2.10.3/keymap"
|
|
31
|
-
pin "@tiptap/pm/history", to: "https://esm.sh/@tiptap/pm@2.10.3/history"
|
|
32
|
-
pin "@tiptap/pm/dropcursor", to: "https://esm.sh/@tiptap/pm@2.10.3/dropcursor"
|
|
33
|
-
pin "@tiptap/pm/gapcursor", to: "https://esm.sh/@tiptap/pm@2.10.3/gapcursor"
|
|
34
|
-
pin "@tiptap/pm/schema-list", to: "https://esm.sh/@tiptap/pm@2.10.3/schema-list"
|
|
35
|
-
pin "@tiptap/pm/inputrules", to: "https://esm.sh/@tiptap/pm@2.10.3/inputrules"
|
|
36
|
-
pin "@tiptap/pm/tables", to: "https://esm.sh/@tiptap/pm@2.10.3/tables"
|
|
37
|
-
|
|
38
|
-
# TipTap starter kit (includes common extensions)
|
|
39
|
-
pin "@tiptap/starter-kit", to: "https://esm.sh/@tiptap/starter-kit@2.10.3"
|
|
40
|
-
|
|
41
|
-
# TipTap extensions
|
|
42
|
-
pin "@tiptap/extension-document", to: "https://esm.sh/@tiptap/extension-document@2.10.3"
|
|
43
|
-
pin "@tiptap/extension-paragraph", to: "https://esm.sh/@tiptap/extension-paragraph@2.10.3"
|
|
44
|
-
pin "@tiptap/extension-text", to: "https://esm.sh/@tiptap/extension-text@2.10.3"
|
|
45
|
-
pin "@tiptap/extension-bold", to: "https://esm.sh/@tiptap/extension-bold@2.10.3"
|
|
46
|
-
pin "@tiptap/extension-italic", to: "https://esm.sh/@tiptap/extension-italic@2.10.3"
|
|
47
|
-
pin "@tiptap/extension-strike", to: "https://esm.sh/@tiptap/extension-strike@2.10.3"
|
|
48
|
-
pin "@tiptap/extension-heading", to: "https://esm.sh/@tiptap/extension-heading@2.10.3"
|
|
49
|
-
pin "@tiptap/extension-bullet-list", to: "https://esm.sh/@tiptap/extension-bullet-list@2.10.3"
|
|
50
|
-
pin "@tiptap/extension-ordered-list", to: "https://esm.sh/@tiptap/extension-ordered-list@2.10.3"
|
|
51
|
-
pin "@tiptap/extension-list-item", to: "https://esm.sh/@tiptap/extension-list-item@2.10.3"
|
|
52
|
-
pin "@tiptap/extension-blockquote", to: "https://esm.sh/@tiptap/extension-blockquote@2.10.3"
|
|
53
|
-
pin "@tiptap/extension-code-block", to: "https://esm.sh/@tiptap/extension-code-block@2.10.3"
|
|
54
|
-
pin "@tiptap/extension-code", to: "https://esm.sh/@tiptap/extension-code@2.10.3"
|
|
55
|
-
pin "@tiptap/extension-horizontal-rule", to: "https://esm.sh/@tiptap/extension-horizontal-rule@2.10.3"
|
|
56
|
-
pin "@tiptap/extension-hard-break", to: "https://esm.sh/@tiptap/extension-hard-break@2.10.3"
|
|
57
|
-
pin "@tiptap/extension-history", to: "https://esm.sh/@tiptap/extension-history@2.10.3"
|
|
58
|
-
pin "@tiptap/extension-dropcursor", to: "https://esm.sh/@tiptap/extension-dropcursor@2.10.3"
|
|
59
|
-
pin "@tiptap/extension-gapcursor", to: "https://esm.sh/@tiptap/extension-gapcursor@2.10.3"
|
|
60
|
-
pin "@tiptap/extension-link", to: "https://esm.sh/@tiptap/extension-link@2.10.3"
|
|
61
|
-
|
|
62
|
-
# Link extension dependencies
|
|
63
|
-
pin "linkifyjs", to: "https://esm.sh/linkifyjs@4.1.3"
|
|
64
|
-
pin "@tiptap/extension-placeholder", to: "https://esm.sh/@tiptap/extension-placeholder@2.10.3"
|
|
65
|
-
pin "@tiptap/extension-table", to: "https://esm.sh/@tiptap/extension-table@2.10.3"
|
|
66
|
-
pin "@tiptap/extension-table-row", to: "https://esm.sh/@tiptap/extension-table-row@2.10.3"
|
|
67
|
-
pin "@tiptap/extension-table-cell", to: "https://esm.sh/@tiptap/extension-table-cell@2.10.3"
|
|
68
|
-
pin "@tiptap/extension-table-header", to: "https://esm.sh/@tiptap/extension-table-header@2.10.3"
|
|
69
|
-
pin "@tiptap/extension-image", to: "https://esm.sh/@tiptap/extension-image@2.10.3"
|
|
70
|
-
|
|
71
|
-
# Task List extension
|
|
72
|
-
pin "@tiptap/extension-task-list", to: "https://esm.sh/@tiptap/extension-task-list@2.10.3"
|
|
73
|
-
pin "@tiptap/extension-task-item", to: "https://esm.sh/@tiptap/extension-task-item@2.10.3"
|
|
74
|
-
|
|
75
|
-
# Mention extension
|
|
76
|
-
pin "@tiptap/extension-mention", to: "https://esm.sh/@tiptap/extension-mention@2.10.3"
|
|
77
|
-
pin "@tiptap/suggestion", to: "https://esm.sh/@tiptap/suggestion@2.10.3"
|
|
78
|
-
|
|
79
|
-
# Syntax highlighting for code blocks
|
|
80
|
-
pin "@tiptap/extension-code-block-lowlight", to: "https://esm.sh/@tiptap/extension-code-block-lowlight@2.10.3"
|
|
81
|
-
|
|
82
|
-
# Typography extension (markdown shortcuts, smart quotes)
|
|
83
|
-
pin "@tiptap/extension-typography", to: "https://esm.sh/@tiptap/extension-typography@2.10.3"
|
|
84
|
-
|
|
85
|
-
# Text formatting marks
|
|
86
|
-
pin "@tiptap/extension-highlight", to: "https://esm.sh/@tiptap/extension-highlight@2.10.3"
|
|
87
|
-
pin "@tiptap/extension-underline", to: "https://esm.sh/@tiptap/extension-underline@2.10.3"
|
|
88
|
-
pin "@tiptap/extension-subscript", to: "https://esm.sh/@tiptap/extension-subscript@2.10.3"
|
|
89
|
-
pin "@tiptap/extension-superscript", to: "https://esm.sh/@tiptap/extension-superscript@2.10.3"
|
|
90
|
-
|
|
91
|
-
# YouTube video embeds
|
|
92
|
-
pin "@tiptap/extension-youtube", to: "https://esm.sh/@tiptap/extension-youtube@2.10.3"
|
|
93
|
-
|
|
94
|
-
# Character count
|
|
95
|
-
pin "@tiptap/extension-character-count", to: "https://esm.sh/@tiptap/extension-character-count@2.10.3"
|
|
96
|
-
|
|
97
|
-
# BubbleMenu (floating toolbar on text selection)
|
|
98
|
-
pin "@tiptap/extension-bubble-menu", to: "https://esm.sh/@tiptap/extension-bubble-menu@2.10.3"
|
|
99
|
-
|
|
100
|
-
# FloatingMenu (toolbar on empty lines)
|
|
101
|
-
pin "@tiptap/extension-floating-menu", to: "https://esm.sh/@tiptap/extension-floating-menu@2.10.3"
|
|
102
|
-
|
|
103
|
-
# Tippy.js - required by BubbleMenu for positioning
|
|
104
|
-
pin "tippy.js", to: "https://esm.sh/tippy.js@6.3.7"
|
|
105
|
-
pin "@popperjs/core", to: "https://esm.sh/@popperjs/core@2.11.8"
|
|
106
|
-
|
|
107
|
-
# Lowlight with bundled dependencies
|
|
108
|
-
pin "lowlight", to: "https://esm.sh/lowlight@3?bundle"
|
|
109
|
-
|
|
110
|
-
# Highlight.js core and common languages for syntax highlighting
|
|
111
|
-
pin "highlight.js/lib/core", to: "https://esm.sh/highlight.js@11.9.0/lib/core"
|
|
112
|
-
pin "highlight.js/lib/languages/javascript", to: "https://esm.sh/highlight.js@11.9.0/lib/languages/javascript"
|
|
113
|
-
pin "highlight.js/lib/languages/typescript", to: "https://esm.sh/highlight.js@11.9.0/lib/languages/typescript"
|
|
114
|
-
pin "highlight.js/lib/languages/ruby", to: "https://esm.sh/highlight.js@11.9.0/lib/languages/ruby"
|
|
115
|
-
pin "highlight.js/lib/languages/python", to: "https://esm.sh/highlight.js@11.9.0/lib/languages/python"
|
|
116
|
-
pin "highlight.js/lib/languages/css", to: "https://esm.sh/highlight.js@11.9.0/lib/languages/css"
|
|
117
|
-
pin "highlight.js/lib/languages/xml", to: "https://esm.sh/highlight.js@11.9.0/lib/languages/xml"
|
|
118
|
-
pin "highlight.js/lib/languages/json", to: "https://esm.sh/highlight.js@11.9.0/lib/languages/json"
|
|
119
|
-
pin "highlight.js/lib/languages/bash", to: "https://esm.sh/highlight.js@11.9.0/lib/languages/bash"
|
|
120
|
-
pin "highlight.js/lib/languages/sql", to: "https://esm.sh/highlight.js@11.9.0/lib/languages/sql"
|
|
121
|
-
pin "highlight.js/lib/languages/markdown", to: "https://esm.sh/highlight.js@11.9.0/lib/languages/markdown"
|
|
122
|
-
|
|
123
|
-
# Emoji replacer extension (auto-replaces :emoji: shortcodes)
|
|
124
|
-
pin "@tiptap-extend/emoji-replacer", to: "https://esm.sh/@tiptap-extend/emoji-replacer@2.1.6?deps=@tiptap/core@2.10.3"
|
|
125
|
-
|
|
126
|
-
# Search and Replace extension
|
|
127
|
-
pin "@sereneinserenade/tiptap-search-and-replace", to: "https://esm.sh/@sereneinserenade/tiptap-search-and-replace@0.1.1"
|
|
128
|
-
|
|
129
|
-
# Footnotes extension
|
|
130
|
-
pin "tiptap-footnotes", to: "https://esm.sh/tiptap-footnotes@2.0.4?deps=@tiptap/core@2.10.3,@tiptap/pm@2.10.3"
|
|
131
|
-
|
|
132
|
-
# Inkpen controllers and extensions
|
|
133
|
-
pin "inkpen", to: "inkpen/index.js"
|
|
134
|
-
pin_all_from File.expand_path("../app/assets/javascripts/inkpen", __dir__), under: "inkpen"
|
|
135
|
-
|
|
136
|
-
# Inkpen custom extensions - explicit pins required for nested directories
|
|
137
|
-
pin "inkpen/extensions/section", to: "inkpen/extensions/section.js"
|
|
138
|
-
pin "inkpen/extensions/preformatted", to: "inkpen/extensions/preformatted.js"
|
|
139
|
-
pin "inkpen/extensions/slash_commands", to: "inkpen/extensions/slash_commands.js"
|
|
140
|
-
pin "inkpen/extensions/block_gutter", to: "inkpen/extensions/block_gutter.js"
|
|
141
|
-
pin "inkpen/extensions/drag_handle", to: "inkpen/extensions/drag_handle.js"
|
|
142
|
-
pin "inkpen/extensions/toggle_block", to: "inkpen/extensions/toggle_block.js"
|
|
143
|
-
pin "inkpen/extensions/columns", to: "inkpen/extensions/columns.js"
|
|
144
|
-
pin "inkpen/extensions/callout", to: "inkpen/extensions/callout.js"
|
|
145
|
-
pin "inkpen/extensions/block_commands", to: "inkpen/extensions/block_commands.js"
|
|
146
|
-
pin "inkpen/extensions/enhanced_image", to: "inkpen/extensions/enhanced_image.js"
|
|
147
|
-
pin "inkpen/extensions/file_attachment", to: "inkpen/extensions/file_attachment.js"
|
|
148
|
-
pin "inkpen/extensions/embed", to: "inkpen/extensions/embed.js"
|
|
149
|
-
pin "inkpen/extensions/advanced_table", to: "inkpen/extensions/advanced_table.js"
|
|
150
|
-
pin "inkpen/extensions/table_of_contents", to: "inkpen/extensions/table_of_contents.js"
|
|
151
|
-
pin "inkpen/extensions/database", to: "inkpen/extensions/database.js"
|
|
152
|
-
pin "inkpen/extensions/document_section", to: "inkpen/extensions/document_section.js"
|
|
153
|
-
pin "inkpen/extensions/section_title", to: "inkpen/extensions/section_title.js"
|
|
154
|
-
pin "inkpen/extensions/export_commands", to: "inkpen/extensions/export_commands.js"
|
|
155
|
-
pin "inkpen/extensions/content_embed", to: "inkpen/extensions/content_embed.js"
|
|
156
|
-
|
|
157
|
-
# Export modules - explicit pins for relative import resolution
|
|
158
|
-
pin "inkpen/export", to: "inkpen/export/index.js"
|
|
159
|
-
pin "inkpen/export/markdown", to: "inkpen/export/markdown.js"
|
|
160
|
-
pin "inkpen/export/html", to: "inkpen/export/html.js"
|
|
161
|
-
pin "inkpen/export/pdf", to: "inkpen/export/pdf.js"
|
|
162
|
-
|
|
163
|
-
# InkpenTable module - explicit pins for all sub-modules
|
|
164
|
-
pin "inkpen/extensions/inkpen_table", to: "inkpen/extensions/inkpen_table/index.js"
|
|
165
|
-
pin "inkpen/extensions/inkpen_table/inkpen_table", to: "inkpen/extensions/inkpen_table/inkpen_table.js"
|
|
166
|
-
pin "inkpen/extensions/inkpen_table/inkpen_table_cell", to: "inkpen/extensions/inkpen_table/inkpen_table_cell.js"
|
|
167
|
-
pin "inkpen/extensions/inkpen_table/inkpen_table_header", to: "inkpen/extensions/inkpen_table/inkpen_table_header.js"
|
|
168
|
-
pin "inkpen/extensions/inkpen_table/table_menu", to: "inkpen/extensions/inkpen_table/table_menu.js"
|
|
169
|
-
pin "inkpen/extensions/inkpen_table/table_helpers", to: "inkpen/extensions/inkpen_table/table_helpers.js"
|
|
170
|
-
pin "inkpen/extensions/inkpen_table/table_constants", to: "inkpen/extensions/inkpen_table/table_constants.js"
|
|
1
|
+
# Inkpen importmap — single vendored bundle, no third-party CDN.
|
|
2
|
+
#
|
|
3
|
+
# Before 0.8.0 this file pinned ~70 modules to a third-party module CDN.
|
|
4
|
+
# Three production incidents on 2026-05-14 caused by CDN flakiness
|
|
5
|
+
# prompted vendoring everything into a single ESM bundle.
|
|
6
|
+
# Plan: 107-inkpen-docs/plans/05-vendor-bundle-cdn-decoupling.md
|
|
7
|
+
#
|
|
8
|
+
# The bundle is built from app/assets/javascripts/inkpen/index.js via
|
|
9
|
+
# `npm run build` and committed to the repo so consumers don't need to
|
|
10
|
+
# run the build themselves. Source map ships alongside for debugging.
|
|
11
|
+
#
|
|
12
|
+
# Host-provided externals (kept out of the bundle):
|
|
13
|
+
# @hotwired/stimulus — host registers controllers
|
|
14
|
+
# @hotwired/turbo-rails — host owns Turbo
|
|
15
|
+
#
|
|
16
|
+
# All other dependencies (TipTap@2.10.3, ProseMirror@1.x, lowlight,
|
|
17
|
+
# highlight.js, tippy.js, popperjs, linkifyjs, etc.) are inlined.
|
|
18
|
+
|
|
19
|
+
pin "inkpen", to: "inkpen.bundle.js"
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Inkpen
|
|
4
|
+
##
|
|
5
|
+
# PORO representing markdown mode configuration.
|
|
6
|
+
#
|
|
7
|
+
# MarkdownMode enables switching between WYSIWYG, raw markdown,
|
|
8
|
+
# and split view editing modes. When enabled, a mode toggle appears
|
|
9
|
+
# allowing users to edit content as markdown source.
|
|
10
|
+
#
|
|
11
|
+
# @example Basic usage
|
|
12
|
+
# markdown_mode = Inkpen::MarkdownMode.new(enabled: true)
|
|
13
|
+
#
|
|
14
|
+
# @example With split view default
|
|
15
|
+
# markdown_mode = Inkpen::MarkdownMode.new(
|
|
16
|
+
# enabled: true,
|
|
17
|
+
# default_mode: :split,
|
|
18
|
+
# sync_delay: 500
|
|
19
|
+
# )
|
|
20
|
+
#
|
|
21
|
+
# @example In editor
|
|
22
|
+
# editor = Inkpen::Editor.new(
|
|
23
|
+
# name: "post[body]",
|
|
24
|
+
# markdown_mode: Inkpen::MarkdownMode.new(enabled: true)
|
|
25
|
+
# )
|
|
26
|
+
#
|
|
27
|
+
# @see Inkpen::Editor Editor configuration
|
|
28
|
+
#
|
|
29
|
+
# @author Nauman Tariq
|
|
30
|
+
# @since 0.5.0
|
|
31
|
+
#
|
|
32
|
+
class MarkdownMode
|
|
33
|
+
##
|
|
34
|
+
# Valid editing modes.
|
|
35
|
+
# @return [Array<Symbol>]
|
|
36
|
+
MODES = %i[wysiwyg markdown split].freeze
|
|
37
|
+
|
|
38
|
+
##
|
|
39
|
+
# Valid placements for the mode toggle.
|
|
40
|
+
# @return [Array<Symbol>]
|
|
41
|
+
TOGGLE_PLACEMENTS = %i[top inline].freeze
|
|
42
|
+
|
|
43
|
+
##
|
|
44
|
+
# Default sync delay in milliseconds for split view.
|
|
45
|
+
# @return [Integer]
|
|
46
|
+
DEFAULT_SYNC_DELAY = 300
|
|
47
|
+
|
|
48
|
+
##
|
|
49
|
+
# @!attribute [r] enabled
|
|
50
|
+
# @return [Boolean] whether markdown mode is enabled
|
|
51
|
+
#
|
|
52
|
+
# @!attribute [r] default_mode
|
|
53
|
+
# @return [Symbol] the default editing mode
|
|
54
|
+
#
|
|
55
|
+
# @!attribute [r] show_toggle
|
|
56
|
+
# @return [Boolean] whether to show the mode toggle button
|
|
57
|
+
#
|
|
58
|
+
# @!attribute [r] toggle_placement
|
|
59
|
+
# @return [Symbol] where to place the mode toggle (:top, :inline)
|
|
60
|
+
#
|
|
61
|
+
# @!attribute [r] toolbar_button
|
|
62
|
+
# @return [Boolean] whether to show markdown toggle button in main toolbar
|
|
63
|
+
#
|
|
64
|
+
# @!attribute [r] sync_delay
|
|
65
|
+
# @return [Integer] debounce delay for split view sync (ms)
|
|
66
|
+
#
|
|
67
|
+
# @!attribute [r] keyboard_shortcuts
|
|
68
|
+
# @return [Boolean] whether keyboard shortcuts are enabled
|
|
69
|
+
#
|
|
70
|
+
attr_reader :default_mode, :show_toggle, :toggle_placement, :toolbar_button, :sync_delay, :keyboard_shortcuts
|
|
71
|
+
|
|
72
|
+
##
|
|
73
|
+
# Initialize a new markdown mode configuration.
|
|
74
|
+
#
|
|
75
|
+
# @param enabled [Boolean] whether markdown mode is enabled
|
|
76
|
+
# @param default_mode [Symbol] initial mode (:wysiwyg, :markdown, :split)
|
|
77
|
+
# @param show_toggle [Boolean] show mode toggle button
|
|
78
|
+
# @param toggle_placement [Symbol] mode toggle placement (:top, :inline)
|
|
79
|
+
# @param toolbar_button [Boolean] show markdown toggle in formatting toolbar
|
|
80
|
+
# @param sync_delay [Integer] debounce delay for split sync (ms)
|
|
81
|
+
# @param keyboard_shortcuts [Boolean] enable keyboard shortcuts
|
|
82
|
+
#
|
|
83
|
+
def initialize(
|
|
84
|
+
enabled: false,
|
|
85
|
+
default_mode: :wysiwyg,
|
|
86
|
+
show_toggle: true,
|
|
87
|
+
toggle_placement: :top,
|
|
88
|
+
toolbar_button: false,
|
|
89
|
+
sync_delay: DEFAULT_SYNC_DELAY,
|
|
90
|
+
keyboard_shortcuts: true
|
|
91
|
+
)
|
|
92
|
+
@enabled = enabled
|
|
93
|
+
@default_mode = validate_mode(default_mode)
|
|
94
|
+
@show_toggle = show_toggle
|
|
95
|
+
@toggle_placement = validate_toggle_placement(toggle_placement)
|
|
96
|
+
@toolbar_button = toolbar_button
|
|
97
|
+
@sync_delay = sync_delay.to_i
|
|
98
|
+
@keyboard_shortcuts = keyboard_shortcuts
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
##
|
|
102
|
+
# Check if markdown mode is enabled.
|
|
103
|
+
#
|
|
104
|
+
# @return [Boolean] true if enabled
|
|
105
|
+
#
|
|
106
|
+
def enabled?
|
|
107
|
+
@enabled
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
##
|
|
111
|
+
# Check if the default mode is WYSIWYG.
|
|
112
|
+
#
|
|
113
|
+
# @return [Boolean] true if default is WYSIWYG
|
|
114
|
+
#
|
|
115
|
+
def wysiwyg_default?
|
|
116
|
+
default_mode == :wysiwyg
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
##
|
|
120
|
+
# Check if the default mode is markdown.
|
|
121
|
+
#
|
|
122
|
+
# @return [Boolean] true if default is markdown
|
|
123
|
+
#
|
|
124
|
+
def markdown_default?
|
|
125
|
+
default_mode == :markdown
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
##
|
|
129
|
+
# Check if the default mode is split view.
|
|
130
|
+
#
|
|
131
|
+
# @return [Boolean] true if default is split
|
|
132
|
+
#
|
|
133
|
+
def split_default?
|
|
134
|
+
default_mode == :split
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
##
|
|
138
|
+
# Check if toggle should render inline with fixed toolbar.
|
|
139
|
+
#
|
|
140
|
+
# @return [Boolean] true if toggle placement is inline
|
|
141
|
+
#
|
|
142
|
+
def inline_toggle?
|
|
143
|
+
toggle_placement == :inline
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
##
|
|
147
|
+
# Generate data attributes for Stimulus controller.
|
|
148
|
+
#
|
|
149
|
+
# @return [Hash] data attributes hash
|
|
150
|
+
#
|
|
151
|
+
def data_attributes
|
|
152
|
+
{
|
|
153
|
+
"inkpen--editor-markdown-enabled-value" => enabled?.to_s,
|
|
154
|
+
"inkpen--editor-markdown-mode-value" => default_mode.to_s,
|
|
155
|
+
"inkpen--editor-markdown-show-toggle-value" => show_toggle.to_s,
|
|
156
|
+
"inkpen--editor-markdown-toggle-placement-value" => toggle_placement.to_s,
|
|
157
|
+
"inkpen--editor-markdown-toolbar-button-value" => toolbar_button.to_s,
|
|
158
|
+
"inkpen--editor-markdown-sync-delay-value" => sync_delay.to_s,
|
|
159
|
+
"inkpen--editor-markdown-shortcuts-value" => keyboard_shortcuts.to_s
|
|
160
|
+
}
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
##
|
|
164
|
+
# Convert to configuration hash for JavaScript.
|
|
165
|
+
#
|
|
166
|
+
# @return [Hash] configuration hash
|
|
167
|
+
#
|
|
168
|
+
def to_config
|
|
169
|
+
{
|
|
170
|
+
enabled: enabled?,
|
|
171
|
+
defaultMode: default_mode.to_s,
|
|
172
|
+
showToggle: show_toggle,
|
|
173
|
+
togglePlacement: toggle_placement.to_s,
|
|
174
|
+
toolbarButton: toolbar_button,
|
|
175
|
+
syncDelay: sync_delay,
|
|
176
|
+
keyboardShortcuts: keyboard_shortcuts
|
|
177
|
+
}
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
##
|
|
181
|
+
# Convert to JSON representation.
|
|
182
|
+
#
|
|
183
|
+
# @return [String] JSON string
|
|
184
|
+
#
|
|
185
|
+
def to_json(*args)
|
|
186
|
+
to_config.to_json(*args)
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
private
|
|
190
|
+
|
|
191
|
+
##
|
|
192
|
+
# Validate and normalize mode value.
|
|
193
|
+
#
|
|
194
|
+
# @param mode [Symbol, String] mode to validate
|
|
195
|
+
# @return [Symbol] validated mode
|
|
196
|
+
#
|
|
197
|
+
def validate_mode(mode)
|
|
198
|
+
mode = mode.to_sym
|
|
199
|
+
MODES.include?(mode) ? mode : :wysiwyg
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
##
|
|
203
|
+
# Validate and normalize toggle placement.
|
|
204
|
+
#
|
|
205
|
+
# @param placement [Symbol, String] placement value
|
|
206
|
+
# @return [Symbol] validated placement
|
|
207
|
+
#
|
|
208
|
+
def validate_toggle_placement(placement)
|
|
209
|
+
placement = placement.to_sym
|
|
210
|
+
TOGGLE_PLACEMENTS.include?(placement) ? placement : :top
|
|
211
|
+
end
|
|
212
|
+
end
|
|
213
|
+
end
|
data/lib/inkpen/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: inkpen
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.8.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Nauman Tariq
|
|
@@ -51,6 +51,8 @@ files:
|
|
|
51
51
|
- CLAUDE.md
|
|
52
52
|
- README.md
|
|
53
53
|
- Rakefile
|
|
54
|
+
- app/assets/javascripts/inkpen.bundle.js
|
|
55
|
+
- app/assets/javascripts/inkpen.bundle.js.map
|
|
54
56
|
- app/assets/javascripts/inkpen/controllers/editor_controller.js
|
|
55
57
|
- app/assets/javascripts/inkpen/controllers/sticky_toolbar_controller.js
|
|
56
58
|
- app/assets/javascripts/inkpen/controllers/toolbar_controller.js
|
|
@@ -134,17 +136,18 @@ files:
|
|
|
134
136
|
- lib/inkpen/extensions/slash_commands.rb
|
|
135
137
|
- lib/inkpen/extensions/table.rb
|
|
136
138
|
- lib/inkpen/extensions/task_list.rb
|
|
139
|
+
- lib/inkpen/markdown_mode.rb
|
|
137
140
|
- lib/inkpen/sticky_toolbar.rb
|
|
138
141
|
- lib/inkpen/toolbar.rb
|
|
139
142
|
- lib/inkpen/version.rb
|
|
140
143
|
- sig/inkpen.rbs
|
|
141
|
-
homepage: https://github.com/
|
|
144
|
+
homepage: https://github.com/nauman/inkpen
|
|
142
145
|
licenses:
|
|
143
146
|
- MIT
|
|
144
147
|
metadata:
|
|
145
|
-
changelog_uri: https://github.com/
|
|
146
|
-
homepage_uri: https://github.com/
|
|
147
|
-
source_code_uri: https://github.com/
|
|
148
|
+
changelog_uri: https://github.com/nauman/inkpen/blob/main/CHANGELOG.md
|
|
149
|
+
homepage_uri: https://github.com/nauman/inkpen
|
|
150
|
+
source_code_uri: https://github.com/nauman/inkpen
|
|
148
151
|
rdoc_options: []
|
|
149
152
|
require_paths:
|
|
150
153
|
- lib
|
|
@@ -159,7 +162,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
159
162
|
- !ruby/object:Gem::Version
|
|
160
163
|
version: '0'
|
|
161
164
|
requirements: []
|
|
162
|
-
rubygems_version: 3.6.
|
|
165
|
+
rubygems_version: 3.6.7
|
|
163
166
|
specification_version: 4
|
|
164
167
|
summary: A TipTap-based rich text editor for Rails
|
|
165
168
|
test_files: []
|