milkdown_engine 0.1.1

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 (80) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +201 -0
  3. data/README.md +15 -0
  4. data/Rakefile +11 -0
  5. data/app/assets/javascripts/milkdown_engine/milkdown.min.js +997 -0
  6. data/app/assets/stylesheets/milkdown_engine/application.css +40 -0
  7. data/app/assets/stylesheets/milkdown_engine/fonts/KaTeX_AMS-Regular.ttf +0 -0
  8. data/app/assets/stylesheets/milkdown_engine/fonts/KaTeX_AMS-Regular.woff +0 -0
  9. data/app/assets/stylesheets/milkdown_engine/fonts/KaTeX_AMS-Regular.woff2 +0 -0
  10. data/app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Caligraphic-Bold.ttf +0 -0
  11. data/app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Caligraphic-Bold.woff +0 -0
  12. data/app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
  13. data/app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Caligraphic-Regular.ttf +0 -0
  14. data/app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Caligraphic-Regular.woff +0 -0
  15. data/app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
  16. data/app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Fraktur-Bold.ttf +0 -0
  17. data/app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Fraktur-Bold.woff +0 -0
  18. data/app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
  19. data/app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Fraktur-Regular.ttf +0 -0
  20. data/app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Fraktur-Regular.woff +0 -0
  21. data/app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
  22. data/app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Main-Bold.ttf +0 -0
  23. data/app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Main-Bold.woff +0 -0
  24. data/app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Main-Bold.woff2 +0 -0
  25. data/app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Main-BoldItalic.ttf +0 -0
  26. data/app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Main-BoldItalic.woff +0 -0
  27. data/app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
  28. data/app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Main-Italic.ttf +0 -0
  29. data/app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Main-Italic.woff +0 -0
  30. data/app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Main-Italic.woff2 +0 -0
  31. data/app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Main-Regular.ttf +0 -0
  32. data/app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Main-Regular.woff +0 -0
  33. data/app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Main-Regular.woff2 +0 -0
  34. data/app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Math-BoldItalic.ttf +0 -0
  35. data/app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Math-BoldItalic.woff +0 -0
  36. data/app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
  37. data/app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Math-Italic.ttf +0 -0
  38. data/app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Math-Italic.woff +0 -0
  39. data/app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Math-Italic.woff2 +0 -0
  40. data/app/assets/stylesheets/milkdown_engine/fonts/KaTeX_SansSerif-Bold.ttf +0 -0
  41. data/app/assets/stylesheets/milkdown_engine/fonts/KaTeX_SansSerif-Bold.woff +0 -0
  42. data/app/assets/stylesheets/milkdown_engine/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
  43. data/app/assets/stylesheets/milkdown_engine/fonts/KaTeX_SansSerif-Italic.ttf +0 -0
  44. data/app/assets/stylesheets/milkdown_engine/fonts/KaTeX_SansSerif-Italic.woff +0 -0
  45. data/app/assets/stylesheets/milkdown_engine/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
  46. data/app/assets/stylesheets/milkdown_engine/fonts/KaTeX_SansSerif-Regular.ttf +0 -0
  47. data/app/assets/stylesheets/milkdown_engine/fonts/KaTeX_SansSerif-Regular.woff +0 -0
  48. data/app/assets/stylesheets/milkdown_engine/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
  49. data/app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Script-Regular.ttf +0 -0
  50. data/app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Script-Regular.woff +0 -0
  51. data/app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Script-Regular.woff2 +0 -0
  52. data/app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Size1-Regular.ttf +0 -0
  53. data/app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Size1-Regular.woff +0 -0
  54. data/app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Size1-Regular.woff2 +0 -0
  55. data/app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Size2-Regular.ttf +0 -0
  56. data/app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Size2-Regular.woff +0 -0
  57. data/app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Size2-Regular.woff2 +0 -0
  58. data/app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Size3-Regular.ttf +0 -0
  59. data/app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Size3-Regular.woff +0 -0
  60. data/app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Size3-Regular.woff2 +0 -0
  61. data/app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Size4-Regular.ttf +0 -0
  62. data/app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Size4-Regular.woff +0 -0
  63. data/app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Size4-Regular.woff2 +0 -0
  64. data/app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Typewriter-Regular.ttf +0 -0
  65. data/app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Typewriter-Regular.woff +0 -0
  66. data/app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
  67. data/app/assets/stylesheets/milkdown_engine/milkdown.css +1 -0
  68. data/app/controllers/milkdown_engine/application_controller.rb +6 -0
  69. data/app/helpers/milkdown_engine/application_helper.rb +88 -0
  70. data/app/javascript/milkdown_engine/controllers/editor_controller.js +122 -0
  71. data/app/models/milkdown_engine/application_record.rb +7 -0
  72. data/app/models/milkdown_engine/md_document.rb +104 -0
  73. data/config/importmap.rb +8 -0
  74. data/config/routes.rb +4 -0
  75. data/db/migrate/20260325000000_create_milkdown_engine_md_documents.rb +16 -0
  76. data/lib/milkdown_engine/engine.rb +46 -0
  77. data/lib/milkdown_engine/version.rb +5 -0
  78. data/lib/milkdown_engine/version.rb.erb +5 -0
  79. data/lib/milkdown_engine.rb +7 -0
  80. metadata +175 -0
@@ -0,0 +1,104 @@
1
+ # frozen_string_literal: true
2
+
3
+ module MilkdownEngine
4
+ class MdDocument < ApplicationRecord
5
+ ChecklistItem = Data.define(:text, :checked)
6
+ Heading = Data.define(:level, :id, :text)
7
+
8
+ validates :content, presence: true
9
+
10
+ before_save :set_title_from_content, if: -> { title.blank? && content_changed? }
11
+
12
+ # ── JSON query helpers (PostgreSQL jsonb_path_query) ─────────────────
13
+
14
+ # Extract task-list items from the ProseMirror JSON stored in +content+.
15
+ #
16
+ # In Milkdown's ProseMirror output, task-list items are regular
17
+ # +list_item+ nodes whose +attrs.checked+ is +true+ or +false+
18
+ # (regular list items have +checked: null+).
19
+ #
20
+ # Returns an Array of ChecklistItem (text:, checked:).
21
+ def checklist_items
22
+ rows = exec_jsonb_query(<<~SQL.squish)
23
+ SELECT
24
+ (item #>> '{attrs,checked}')::boolean AS checked,
25
+ string_agg(text_node #>> '{text}', '' ORDER BY text_ord) AS item_text
26
+ FROM jsonb_path_query(
27
+ (SELECT content FROM milkdown_engine_md_documents WHERE id = :id),
28
+ 'strict $.** ? (@.type == "list_item" && @.attrs.checked != null)'
29
+ ) WITH ORDINALITY AS items(item, item_ord),
30
+ jsonb_path_query(item, 'strict $.** ? (@.type == "text")') WITH ORDINALITY AS texts(text_node, text_ord)
31
+ GROUP BY items.item_ord, item #>> '{attrs,checked}'
32
+ ORDER BY items.item_ord
33
+ SQL
34
+
35
+ rows.map { |row| ChecklistItem.new(text: row["item_text"], checked: row["checked"]) }
36
+ end
37
+
38
+ # Extract every heading from the document.
39
+ #
40
+ # Returns an Array of Heading (level:, id:, text:) in document order.
41
+ # Useful for building a table of contents.
42
+ def headings
43
+ rows = exec_jsonb_query(<<~SQL.squish)
44
+ SELECT
45
+ (heading #>> '{attrs,level}')::integer AS level,
46
+ heading #>> '{attrs,id}' AS id,
47
+ string_agg(text_node #>> '{text}', '' ORDER BY text_ord) AS heading_text
48
+ FROM jsonb_path_query(
49
+ (SELECT content FROM milkdown_engine_md_documents WHERE id = :id),
50
+ 'strict $.** ? (@.type == "heading")'
51
+ ) WITH ORDINALITY AS headings(heading, heading_ord),
52
+ jsonb_path_query(heading, 'strict $.** ? (@.type == "text")') WITH ORDINALITY AS texts(text_node, text_ord)
53
+ GROUP BY headings.heading_ord, heading #>> '{attrs,level}', heading #>> '{attrs,id}'
54
+ ORDER BY headings.heading_ord
55
+ SQL
56
+
57
+ rows.map { |row| Heading.new(level: row["level"], id: row["id"], text: row["heading_text"]) }
58
+ end
59
+
60
+ alias_method :table_of_contents, :headings
61
+
62
+ private
63
+
64
+ # Execute a raw SQL string that contains jsonb_path_query expressions.
65
+ #
66
+ # We avoid +sanitize_sql_array+ here because its +?+ placeholder syntax
67
+ # conflicts with the +?+ filter operator in PostgreSQL jsonb path
68
+ # expressions (e.g. '$.** ? (@.type == "heading")').
69
+ #
70
+ # Instead we interpolate the quoted id via +:id+ and +connection.quote+.
71
+ def exec_jsonb_query(sql)
72
+ quoted = sql.gsub(":id", self.class.connection.quote(id))
73
+ self.class.connection.select_all(quoted)
74
+ end
75
+
76
+ # Walk the ProseMirror JSON tree in Ruby to find the first heading's text.
77
+ # Runs before save so it doesn't require a DB round-trip.
78
+ def set_title_from_content
79
+ return unless content.is_a?(Hash)
80
+
81
+ heading = first_node_of_type(content, "heading")
82
+ return unless heading
83
+
84
+ self.title = collect_text(heading).presence
85
+ end
86
+
87
+ def first_node_of_type(node, type)
88
+ return node if node["type"] == type
89
+
90
+ Array(node["content"]).each do |child|
91
+ found = first_node_of_type(child, type)
92
+ return found if found
93
+ end
94
+
95
+ nil
96
+ end
97
+
98
+ def collect_text(node)
99
+ return node["text"].to_s if node["type"] == "text"
100
+
101
+ Array(node["content"]).map { |child| collect_text(child) }.join
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Vendored Milkdown bundle (built by esbuild from src/)
4
+ pin "milkdown_engine/milkdown", to: "milkdown_engine/milkdown.min.js"
5
+
6
+ # MilkdownEngine Stimulus controllers
7
+ pin_all_from MilkdownEngine::Engine.root.join("app/javascript/milkdown_engine/controllers"),
8
+ under: "controllers/milkdown_engine", to: "milkdown_engine/controllers"
data/config/routes.rb ADDED
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ MilkdownEngine::Engine.routes.draw do
4
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ class CreateMilkdownEngineMdDocuments < ActiveRecord::Migration[8.1]
4
+ def change
5
+ create_table :milkdown_engine_md_documents do |t|
6
+ t.string :title
7
+ t.jsonb :content, null: false,
8
+ default: { type: "doc", content: [{ type: "paragraph" }] }
9
+ t.timestamps
10
+ end
11
+
12
+ add_index :milkdown_engine_md_documents, :content,
13
+ using: :gin, opclass: :jsonb_path_ops,
14
+ name: "idx_md_documents_content_path"
15
+ end
16
+ end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "ui"
4
+
5
+ module MilkdownEngine
6
+ class Engine < ::Rails::Engine
7
+ isolate_namespace MilkdownEngine
8
+
9
+ # Register importmap pins for Stimulus controllers
10
+ initializer "milkdown_engine.importmap", before: "importmap" do |app|
11
+ if app.config.respond_to?(:importmap)
12
+ app.config.importmap.paths << Engine.root.join("config/importmap.rb")
13
+ app.config.importmap.cache_sweepers << Engine.root.join("app/javascript")
14
+ end
15
+ end
16
+
17
+ # Add engine assets to the asset load path (for propshaft/sprockets)
18
+ initializer "milkdown_engine.assets" do |app|
19
+ app.config.assets.paths << Engine.root.join("app/assets/javascripts")
20
+ app.config.assets.paths << Engine.root.join("app/assets/stylesheets")
21
+
22
+ # Stimulus controllers live under app/javascript/ — add it so
23
+ # importmap pin_all_from URLs resolve through the asset pipeline.
24
+ app.config.assets.paths << Engine.root.join("app/javascript")
25
+
26
+ # rails-active-ui ships stylesheets.css directly in app/assets/
27
+ app.config.assets.paths << Ui::Engine.root.join("app/assets")
28
+ end
29
+
30
+ # Append engine migrations so host apps pick them up without copying
31
+ initializer "milkdown_engine.migrations", after: :load_config_initializers do |app|
32
+ unless app.root.to_s == root.to_s
33
+ engine_migrate_path = root.join("db/migrate").to_s
34
+ app.config.paths["db/migrate"] << engine_migrate_path
35
+ ActiveRecord::Migrator.migrations_paths << engine_migrate_path
36
+ end
37
+ end
38
+
39
+ # Make engine helpers available in host app views
40
+ initializer "milkdown_engine.helpers" do
41
+ ActiveSupport.on_load(:action_view) do
42
+ include MilkdownEngine::ApplicationHelper
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module MilkdownEngine
4
+ VERSION = "0.1.1"
5
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module MilkdownEngine
4
+ VERSION = "<%= version %>"
5
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "milkdown_engine/version"
4
+ require "milkdown_engine/engine"
5
+
6
+ module MilkdownEngine
7
+ end
metadata ADDED
@@ -0,0 +1,175 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: milkdown_engine
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - Nathan Kidd
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 1980-01-01 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: rails
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: '8.1'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: '8.1'
26
+ - !ruby/object:Gem::Dependency
27
+ name: importmap-rails
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ - !ruby/object:Gem::Dependency
41
+ name: stimulus-rails
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ - !ruby/object:Gem::Dependency
55
+ name: rails-active-ui
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ type: :runtime
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ description: Provides a Milkdown-based rich markdown editor as a Rails engine with
69
+ Stimulus controllers, importmap integration, and rails-active-ui components.
70
+ email:
71
+ - nathankidd@hey.com
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - LICENSE
77
+ - README.md
78
+ - Rakefile
79
+ - app/assets/javascripts/milkdown_engine/milkdown.min.js
80
+ - app/assets/stylesheets/milkdown_engine/application.css
81
+ - app/assets/stylesheets/milkdown_engine/fonts/KaTeX_AMS-Regular.ttf
82
+ - app/assets/stylesheets/milkdown_engine/fonts/KaTeX_AMS-Regular.woff
83
+ - app/assets/stylesheets/milkdown_engine/fonts/KaTeX_AMS-Regular.woff2
84
+ - app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Caligraphic-Bold.ttf
85
+ - app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Caligraphic-Bold.woff
86
+ - app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Caligraphic-Bold.woff2
87
+ - app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Caligraphic-Regular.ttf
88
+ - app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Caligraphic-Regular.woff
89
+ - app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Caligraphic-Regular.woff2
90
+ - app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Fraktur-Bold.ttf
91
+ - app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Fraktur-Bold.woff
92
+ - app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Fraktur-Bold.woff2
93
+ - app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Fraktur-Regular.ttf
94
+ - app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Fraktur-Regular.woff
95
+ - app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Fraktur-Regular.woff2
96
+ - app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Main-Bold.ttf
97
+ - app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Main-Bold.woff
98
+ - app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Main-Bold.woff2
99
+ - app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Main-BoldItalic.ttf
100
+ - app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Main-BoldItalic.woff
101
+ - app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Main-BoldItalic.woff2
102
+ - app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Main-Italic.ttf
103
+ - app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Main-Italic.woff
104
+ - app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Main-Italic.woff2
105
+ - app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Main-Regular.ttf
106
+ - app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Main-Regular.woff
107
+ - app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Main-Regular.woff2
108
+ - app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Math-BoldItalic.ttf
109
+ - app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Math-BoldItalic.woff
110
+ - app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Math-BoldItalic.woff2
111
+ - app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Math-Italic.ttf
112
+ - app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Math-Italic.woff
113
+ - app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Math-Italic.woff2
114
+ - app/assets/stylesheets/milkdown_engine/fonts/KaTeX_SansSerif-Bold.ttf
115
+ - app/assets/stylesheets/milkdown_engine/fonts/KaTeX_SansSerif-Bold.woff
116
+ - app/assets/stylesheets/milkdown_engine/fonts/KaTeX_SansSerif-Bold.woff2
117
+ - app/assets/stylesheets/milkdown_engine/fonts/KaTeX_SansSerif-Italic.ttf
118
+ - app/assets/stylesheets/milkdown_engine/fonts/KaTeX_SansSerif-Italic.woff
119
+ - app/assets/stylesheets/milkdown_engine/fonts/KaTeX_SansSerif-Italic.woff2
120
+ - app/assets/stylesheets/milkdown_engine/fonts/KaTeX_SansSerif-Regular.ttf
121
+ - app/assets/stylesheets/milkdown_engine/fonts/KaTeX_SansSerif-Regular.woff
122
+ - app/assets/stylesheets/milkdown_engine/fonts/KaTeX_SansSerif-Regular.woff2
123
+ - app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Script-Regular.ttf
124
+ - app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Script-Regular.woff
125
+ - app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Script-Regular.woff2
126
+ - app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Size1-Regular.ttf
127
+ - app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Size1-Regular.woff
128
+ - app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Size1-Regular.woff2
129
+ - app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Size2-Regular.ttf
130
+ - app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Size2-Regular.woff
131
+ - app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Size2-Regular.woff2
132
+ - app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Size3-Regular.ttf
133
+ - app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Size3-Regular.woff
134
+ - app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Size3-Regular.woff2
135
+ - app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Size4-Regular.ttf
136
+ - app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Size4-Regular.woff
137
+ - app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Size4-Regular.woff2
138
+ - app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Typewriter-Regular.ttf
139
+ - app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Typewriter-Regular.woff
140
+ - app/assets/stylesheets/milkdown_engine/fonts/KaTeX_Typewriter-Regular.woff2
141
+ - app/assets/stylesheets/milkdown_engine/milkdown.css
142
+ - app/controllers/milkdown_engine/application_controller.rb
143
+ - app/helpers/milkdown_engine/application_helper.rb
144
+ - app/javascript/milkdown_engine/controllers/editor_controller.js
145
+ - app/models/milkdown_engine/application_record.rb
146
+ - app/models/milkdown_engine/md_document.rb
147
+ - config/importmap.rb
148
+ - config/routes.rb
149
+ - db/migrate/20260325000000_create_milkdown_engine_md_documents.rb
150
+ - lib/milkdown_engine.rb
151
+ - lib/milkdown_engine/engine.rb
152
+ - lib/milkdown_engine/version.rb
153
+ - lib/milkdown_engine/version.rb.erb
154
+ homepage: https://github.com/n-at-han-k/milkdown-engine
155
+ licenses:
156
+ - Apache-2.0
157
+ metadata: {}
158
+ rdoc_options: []
159
+ require_paths:
160
+ - lib
161
+ required_ruby_version: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - ">="
164
+ - !ruby/object:Gem::Version
165
+ version: '3.2'
166
+ required_rubygems_version: !ruby/object:Gem::Requirement
167
+ requirements:
168
+ - - ">="
169
+ - !ruby/object:Gem::Version
170
+ version: '0'
171
+ requirements: []
172
+ rubygems_version: 3.7.2
173
+ specification_version: 4
174
+ summary: Rails engine for Milkdown markdown editing
175
+ test_files: []