Skip to content

Commit b0c6e54

Browse files
committed
feature/Add all codemirror languages
1 parent 0c681a3 commit b0c6e54

File tree

6 files changed

+162
-47
lines changed

6 files changed

+162
-47
lines changed

app/controllers/modals/snippets_controller.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@ class Modals::SnippetsController < ModalsController
44
def new
55
@snippet = Snippet.new
66
@folders = current_user.folders
7-
@languages = Language.all
7+
@languages = Language.order(name: :asc)
88
@javascript = @languages.find_by_slug('javascript')
99
end
1010

1111
def edit
12-
@languages = Language.all
12+
@languages = Language.order(name: :asc)
1313
@folders = current_user.folders
1414
@folder = current_user.snippet_folders.find_by(snippet_id: params[:id]).folder
1515
end

app/initializers/languages.rb

Lines changed: 0 additions & 11 deletions
This file was deleted.
Lines changed: 26 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,33 @@
11
<div data-controller="snippets">
22
<div data-snippets-target="errors"></div>
33

4-
<%= form_for @snippet, remote: true, html: { data: { type: "html", action: "ajax:success->snippets#onUpdateSuccess ajax:error->snippets#onUpdateError" } } do |f| %>
5-
<div>
6-
<%= f.text_field :description, { class: "new-snippet--description", placeholder: "Snippet description..." } %>
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" } %>
8-
</div>
9-
10-
<div class="create-snippet--options-wrapper">
11-
<div class="flex v-center" style="cursor: pointer;"
12-
data-controller="checkbox"
13-
data-action="click->checkbox#toggle"
14-
data-checkbox-checked-text-value="Public"
15-
data-checkbox-checked-icon-value="/icons/lock-open.svg"
16-
data-checkbox-unchecked-text-value="Private"
17-
data-checkbox-unchecked-icon-value="/icons/lock-closed.svg"
18-
>
19-
<span data-checkbox-target="text">Public</span>
20-
<img data-checkbox-target="icon" src="/icons/lock-open.svg" width="20">
21-
<%= f.hidden_field :public, value: true, data: { checkbox_target: 'value' } %>
4+
<div data-controller="codemirror snippets" data-codemirror-modes-value="<%= @languages.to_json %>" data-codemirror-code-value="<%= @snippet.body %>" data-codemirror-mode-value="<%= @snippet.language.slug %>" data-codemirror-initialized-value="false" data-codemirror-read-only-value="false" class="mt-4">
5+
<%= form_for @snippet, remote: true, html: { data: { type: "html", action: "ajax:success->snippets#onUpdateSuccess ajax:error->snippets#onUpdateError" } } do |f| %>
6+
<div>
7+
<%= f.text_field :description, { class: "new-snippet--description", placeholder: "Snippet description..." } %>
8+
<%= f.text_area :body, { data: { 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" } %>
229
</div>
23-
<div class="flex">
24-
<%= f.select :language_id, options_from_collection_for_select(@languages, :id, :name, @snippet.language_id), {}, data: { action: 'change->codemirror#updateMode' } %>
25-
<%= f.select :folder_id, options_from_collection_for_select(@folders, :id, :name, @folder.id), prompt: 'Select folder...' %>
26-
<%= f.submit 'Update', class: "button--cta-primary ml-4" %>
10+
11+
<div class="create-snippet--options-wrapper">
12+
<div class="flex v-center" style="cursor: pointer;"
13+
data-controller="checkbox"
14+
data-action="click->checkbox#toggle"
15+
data-checkbox-checked-text-value="Public"
16+
data-checkbox-checked-icon-value="/icons/lock-open.svg"
17+
data-checkbox-unchecked-text-value="Private"
18+
data-checkbox-unchecked-icon-value="/icons/lock-closed.svg"
19+
>
20+
<span data-checkbox-target="text">Public</span>
21+
<img data-checkbox-target="icon" src="/icons/lock-open.svg" width="20">
22+
<%= f.hidden_field :public, value: true, data: { checkbox_target: 'value' } %>
23+
</div>
24+
<div class="flex">
25+
<%= f.select :language_id, options_from_collection_for_select(@languages, :id, :name, @snippet.language_id), {}, data: { action: 'change->codemirror#updateMode' } %>
26+
<%= f.select :folder_id, options_from_collection_for_select(@folders, :id, :name, @folder.id), prompt: 'Select folder...' %>
27+
<%= f.submit 'Update', class: "button--cta-primary ml-4" %>
28+
</div>
2729
</div>
28-
</div>
29-
<% end %>
30+
<% end %>
31+
</div>
3032

3133
</div>

app/views/users/_preview.html.erb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<div class="min-w-0 flex-1">
33
<div>
44
<div class="text-sm">
5-
<%= link_to user.name, user_path(user), class: "font-medium text-gray-900" %>
5+
<%= link_to user.name, user_path(user), class: "font-bold text-gray-900 no-underline hover:underline" %>
66
</div>
77
<% if defined?(resource) %>
88
<p class="text-sm text-gray-500">

config/initializers/languages.rb

Lines changed: 120 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,125 @@
11
LANGUAGES = {
2+
'APL' => 'apl',
3+
'ASN.1' => 'asn.1',
4+
'Asterisk' => 'asterisk',
5+
'Brainfuck' => 'brainfuck',
6+
'C' => 'clike',
7+
'C++' => 'clike',
8+
'C#' => 'clike',
9+
'Clojure' => 'clojure',
10+
'CMake' => 'cmake',
11+
'COBOL' => 'cobol',
12+
'CoffeeScript' => 'coffeescript',
13+
'Common Lisp' => 'commonlisp',
14+
'Crystal' => 'crystal',
215
'CSS' => 'css',
3-
'Javascript' => 'javascript',
16+
'Cypher' => 'cypher',
17+
'D' => 'd',
18+
'Dart' => 'dart',
19+
'Diff' => 'diff',
20+
'Django' => 'django',
21+
'Dockerfile' => 'dockerfile',
22+
'DTD' => 'dtd',
23+
'Dylan' => 'dylan',
24+
'EBNF' => 'ebnf',
25+
'ECL' => 'ecl',
26+
'Eiffel' => 'eiffel',
27+
'Elm' => 'elm',
28+
'Erlang' => 'erlang',
29+
'Factor' => 'factor',
30+
'FCL' => 'fcl',
31+
'Forth' => 'forth',
32+
'Fortran' => 'fortran',
33+
'Gas' => 'gas',
34+
'Gherkin' => 'gherkin',
35+
'Go' => 'go',
36+
'Groovy' => 'groovy',
37+
'HAML' => 'haml',
38+
'Handlebars' => 'handlebars',
39+
'Haskell' => 'haskell',
40+
'Haxe' => 'haxe',
41+
'HTML' => 'xml',
42+
'HTML embedded' => 'htmlembedded',
43+
'HTML mixed mode' => 'htmlmixed',
44+
'HTTP' => 'http',
45+
'IDL' => 'idl',
46+
'Java' => 'clike',
47+
'JavaScript' => 'javascript',
48+
'Julia' => 'julia',
49+
'JSX' => 'jsx',
50+
'Kotlin' => 'clike',
51+
'LaTeX' => 'stex',
52+
'LESS' => 'css',
53+
'LiveScript' => 'livescript',
54+
'Lua' => 'lua',
55+
'Markdown (GitHub)' => 'markdown',
56+
'Mathematica' => 'mathematica',
57+
'mbox' => 'mbox',
58+
'mIRC' => 'mirc',
59+
'Modelica' => 'modelica',
60+
'MscGen' => 'mscgen',
61+
'MUMPS' => 'mumps',
62+
'Nginx' => 'nginx',
63+
'NSIS' => 'nsis',
64+
'N-Triples' => 'ntriples',
65+
'N-Quads' => 'ntriples',
66+
'Objective C' => 'clike',
67+
'Octave' => 'octave',
68+
'Oz' => 'oz',
69+
'Pascal' => 'pascal',
70+
'PEG.js' => 'pegjs',
71+
'Perl' => 'perl',
72+
'PHP' => 'php',
73+
'Pig Latin' => 'pig',
74+
'PowerShell' => 'powershell',
75+
'Properties files' => 'properties',
76+
'ProtoBuf' => 'protobuf',
77+
'Pug' => 'pug',
78+
'Puppet' => 'puppet',
479
'Python' => 'python',
80+
'Q' => 'q',
81+
'R' => 'r',
82+
'RPM' => 'rpm',
83+
'reStructuredText' => 'rst',
584
'Ruby' => 'ruby',
6-
'SQL' => 'sql'
85+
'Rust' => 'rust',
86+
'SAS' => 'sas',
87+
'Sass' => 'sass',
88+
'Scheme' => 'scheme',
89+
'SCSS' => 'scss',
90+
'Shell' => 'shell',
91+
'Sieve' => 'sieve',
92+
'Slim' => 'slim',
93+
'Smalltalk' => 'smalltalk',
94+
'Smarty' => 'smarty',
95+
'Solr' => 'solr',
96+
'Soy' => 'soy',
97+
'SPARQL' => 'sparql',
98+
'SQL' => 'sql',
99+
'sTeX' => 'stex',
100+
'Swift' => 'swift',
101+
'Tcl' => 'tcl',
102+
'Textile' => 'textile',
103+
'Tiddlywiki' => 'tiddlywiki',
104+
'Tiki wiki' => 'tiki',
105+
'TOML' => 'toml',
106+
'Tornado' => 'tornado',
107+
'troff' => 'troff',
108+
'TTCN' => 'ttcn',
109+
'TTCN Configuration' => 'ttcn-cfg',
110+
'Turtle' => 'turtle',
111+
'Twig' => 'twig',
112+
'VB.NET' => 'vb',
113+
'VBScript' => 'vbscript',
114+
'Velocity' => 'velocity',
115+
'Verilog' => 'verilog',
116+
'VHDL' => 'vhdl',
117+
'Vue' => 'vue',
118+
'Web IDL' => 'webidl',
119+
'XML' => 'xml',
120+
'XQuery' => 'xquery',
121+
'Yacas' => 'yacas',
122+
'YAML' => 'yaml',
123+
'YAML Frontmatter' => 'yaml-frontmatter',
124+
'Z80' => 'z80'
7125
}.freeze

db/migrate/20210215163203_recreate_languages.rb

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,24 @@ def up
77
t.timestamps
88
end
99

10-
LANGUAGES.each do |name, slug|
11-
lang = Language.find_by_slug(slug)
10+
Language.transaction do
11+
LANGUAGES.each do |name, slug|
12+
lang = Language.find_by_slug(slug)
1213

13-
if lang
14-
lang.update!(name: name)
15-
else
16-
Language.create!(name: name, slug: slug)
14+
if lang
15+
lang.update!(name: name)
16+
else
17+
Language.create!(name: name, slug: slug)
18+
end
1719
end
1820
end
19-
21+
2022
remove_column(:snippets, :language)
2123
add_reference(:snippets, :language)
24+
25+
Snippet.transaction do
26+
Snippet.all.update(language: Language.first)
27+
end
2228
end
2329

2430
def down

0 commit comments

Comments
 (0)