Skip to content

Commit 28e144b

Browse files
committed
feature/Recreate languages
1 parent 043a4a0 commit 28e144b

File tree

14 files changed

+102
-25
lines changed

14 files changed

+102
-25
lines changed

app/controllers/modals/snippets_controller.rb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,12 @@ class Modals::SnippetsController < ModalsController
44
def new
55
@snippet = Snippet.new
66
@folders = current_user.folders
7+
@languages = Language.all
8+
@javascript = @languages.find_by_slug('javascript')
79
end
810

911
def edit
12+
@languages = Language.all
1013
@folders = current_user.folders
1114
@folder = current_user.snippet_folders.find_by(snippet_id: params[:id]).folder
1215
end

app/controllers/snippets_controller.rb

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -116,9 +116,8 @@ def create
116116
user: current_user,
117117
description: snippet_params[:description],
118118
body: snippet_params[:body],
119-
highlighted_body: snippet_params[:highlighted_body],
120119
public: snippet_params[:public],
121-
language: snippet_params[:language],
120+
language_id: snippet_params[:language_id],
122121
)
123122

124123
if snippet_params[:folder_id].present?
@@ -204,9 +203,8 @@ def snippet_params
204203
params.require(:snippet).permit(
205204
:description,
206205
:body,
207-
:highlighted_body,
208206
:public,
209-
:language,
207+
:language_id,
210208
:folder_id
211209
)
212210
end

app/initializers/languages.rb

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
LANGUAGES = {
2+
'CSS' => 'css',
3+
'Javascript' => 'javascript',
4+
'PHP' => 'php',
5+
'Python' => 'python',
6+
'Ruby' => 'ruby',
7+
'Rust' => 'rust',
8+
'SCSS' => 'scss',
9+
'SQL' => 'sql'
10+
'Swift' => 'swift'
11+
}.freeze

app/javascript/controllers/codemirror_controller.js

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,50 @@
11
import { Controller } from 'stimulus';
22
import CodeMirror from 'codemirror';
3-
import 'codemirror/mode/ruby/ruby.js'
43
// import 'codemirror/theme/duotone-dark.css'
54

65
export default class extends Controller {
76
static targets = ["wrapper", "mirror", "body", "description"];
87
static values = {
8+
modes: Array,
99
code: String,
10+
mode: String,
1011
initialized: Boolean,
1112
readOnly: Boolean
1213
}
1314

1415
connect() {
16+
console.log('l', this.modesValue)
1517
if (this.shouldInitialize()) {
1618
this.initializeCodeMirror()
1719
this.setCodeMirrorValue()
20+
if (this.hasModeValue) { this.importMode(this.modeValue) }
1821
this.addEventListeners()
1922
}
2023
}
2124

2225
initializeCodeMirror() {
2326
this.codeMirror = CodeMirror.fromTextArea(this.mirrorTarget, {
2427
theme: 'one-light',
25-
mode: 'ruby',
28+
mode: 'javascript',
2629
readOnly: this.readOnlyValue ? 'nocursor' : false
2730
});
2831

2932
this.initializedValue = true
3033
}
3134

3235
setCodeMirrorValue() {
33-
const value = this.hasCodeValue ? this.codeValue : ''
36+
const value = this.hasCodeValue ? this.codeValue : "updateMode(event) {\n const modeId = event.target.value\n const mode = this.modeFromId(modeId)\n const hasMode = Object.keys(CodeMirror.modes).includes(mode)\n\n !hasMode ? this.importMode(mode) : this.setMode(mode)\n}\n\nsetMode(mode) {\n this.codeMirror.setOption(\"mode\", mode);\n}"
3437
this.codeMirror.setValue(value)
3538
}
3639

40+
updateMode(event) {
41+
const modeId = event.target.value
42+
const mode = this.modeFromId(modeId)
43+
const hasMode = Object.keys(CodeMirror.modes).includes(mode)
44+
45+
!hasMode ? this.importMode(mode) : this.setMode(mode)
46+
}
47+
3748
shouldInitialize() {
3849
return !this.initializedValue
3950
}
@@ -45,4 +56,20 @@ export default class extends Controller {
4556
event.stopPropagation()
4657
})
4758
}
59+
60+
importMode(mode) {
61+
import(`codemirror/mode/${mode}/${mode}.js`)
62+
.then(() => this.setMode(mode))
63+
.catch(console.error)
64+
}
65+
66+
setMode(mode) {
67+
this.codeMirror.setOption("mode", mode);
68+
}
69+
70+
modeFromId(modeId) {
71+
return this.modesValue.find(mode => {
72+
return Number(mode.id) === Number(modeId)
73+
}).slug
74+
}
4875
}

app/models/language.rb

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,3 @@
11
class Language < ApplicationRecord
2-
def self.find_by_filename(filename)
3-
# change this to an sql query
4-
matched_fn = Filename.all.find do |fn|
5-
File.fnmatch(fn.name, filename)
6-
end
72

8-
matched_fn ? matched_fn.language : Language.find_by(name: 'Text only')
9-
end
10-
11-
def lexer_alias
12-
aliases.first.name
13-
end
14-
end
3+
end

app/models/snippet.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ class Snippet < ApplicationRecord
44
belongs_to :user, required: true
55
has_many :comments, dependent: :destroy
66
has_many :likes, dependent: :destroy
7+
belongs_to :language, required: true
8+
79
validates_presence_of :body
810
validates_presence_of :description
911
validate :owner_folder_presence

app/views/modals/snippets/edit.html.erb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<%= form_for @snippet, remote: true, html: { data: { type: "html", action: "ajax:success->snippets#onUpdateSuccess ajax:error->snippets#onUpdateError" } } do |f| %>
55
<div>
66
<%= f.text_field :description, { class: "new-snippet--description", placeholder: "Snippet description..." } %>
7-
<%= f.text_area :body, { data: { controller: "codemirror", codemirror_code_value: @snippet.body, codemirror_initialized_value: false, codemirror_read_only_value: false, codemirror_target: 'mirror' }, class: "font-mono h-80 block w-full shadow-sm focus:ring-indigo-500 focus:border-indigo-500 block w-full sm:text-sm border-gray-300 rounded-md" } %>
7+
<%= f.text_area :body, { data: { controller: 'codemirror', codemirror_target: 'mirror', codemirror_modes_value: @languages.to_json, codemirror_code_value: @snippet.body, codemirror_mode_value: @snippet.language.slug, codemirror_initialized_value: false, codemirror_read_only_value: false, }, class: "font-mono h-80 block w-full shadow-sm focus:ring-indigo-500 focus:border-indigo-500 block w-full sm:text-sm border-gray-300 rounded-md" } %>
88
</div>
99

1010
<div class="create-snippet--options-wrapper">
@@ -21,6 +21,7 @@
2121
<%= f.hidden_field :public, value: true, data: { checkbox_target: 'value' } %>
2222
</div>
2323
<div class="flex">
24+
<%= f.select :language_id, options_from_collection_for_select(@languages, :id, :name, @snippet.language_id), {}, data: { action: 'change->codemirror#updateMode' } %>
2425
<%= f.select :folder_id, options_from_collection_for_select(@folders, :id, :name, @folder.id), prompt: 'Select folder...' %>
2526
<%= f.submit 'Update', class: "button--cta-primary ml-4" %>
2627
</div>

app/views/modals/snippets/new.html.erb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<h3 class="text-center">New Snippet</h3>
22

3-
<div data-controller="codemirror snippets" class="mt-4">
3+
<div data-controller="codemirror snippets" data-codemirror-modes-value="<%= @languages.to_json %>" class="mt-4">
44
<div data-snippets-target="errors"></div>
55
<%= form_for @snippet, remote: true, html: { data: { type: "html", action: "ajax:success->snippets#onCreateSuccess ajax:error->snippets#onCreateError" } } do |f| %>
66
<div>
@@ -22,6 +22,7 @@
2222
<%= f.hidden_field :public, value: true, data: { checkbox_target: 'value' } %>
2323
</div>
2424
<div class="flex">
25+
<%= f.select :language_id, options_from_collection_for_select(@languages, :id, :name, @javascript.id), {}, data: { action: 'change->codemirror#updateMode' } %>
2526
<%= f.select :folder_id, options_from_collection_for_select(@folders, :id, :name, params[:folder_id]), prompt: 'Select folder...' %>
2627
<%= f.submit 'CREATE', class: "button--cta-primary ml-4" %>
2728
</div>

app/views/shared/_codemirror.html.erb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
data: {
77
controller: 'codemirror',
88
codemirror_code_value: code,
9+
codemirror_mode_value: mode,
910
codemirror_initialized_value: false,
1011
codemirror_read_only_value: read_only,
1112
codemirror_target: 'mirror'

app/views/snippets/_snippet.html.erb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,6 @@
4040
</div>
4141
</div>
4242

43-
<%= render partial: 'shared/codemirror', locals: { code: snippet.body, language: snippet.language, read_only: true } %>
43+
<%= render partial: 'shared/codemirror', locals: { code: snippet.body, mode: snippet.language.slug, read_only: true } %>
4444
</div>
4545
<% end %>

0 commit comments

Comments
 (0)