Merge branch 'fuzzylemma-configure-default-keybinding'

This commit is contained in:
Dawa Ometto
2022-05-26 13:16:55 +02:00
19 changed files with 131 additions and 25 deletions
+1
View File
@@ -136,6 +136,7 @@ Gollum comes with the following command line options:
| --template-dir | [PATH] | Specify custom mustache template directory. Only overrides templates that exist in this directory. |
| --template-page | none | Use _Template in root as a template for new pages. Must be committed. |
| --emoji | none | Parse and interpret emoji tags (e.g. `:heart:`) except when the leading colon is backslashed (e.g. `\:heart:`). |
| --default-keybind | none | Set the default keybinding for the editor. Can be set to `vim`, or `emacs`. |
| --lenient-tag-lookup | none | Internal links resolve case-insensitively, will treat spaces as hyphens, and will match the first page found with a certain filename, anywhere in the repository. Provides compatibility with Gollum 4.x. |
| --help | none | Display the list of options on the command line. |
| --version | none | Display the current version of Gollum. |
+5 -1
View File
@@ -15,7 +15,7 @@ options = {
}
wiki_options = {
:allow_uploads => false,
:allow_editing => true,
:allow_editing => true
}
opts = OptionParser.new do |opts|
@@ -166,6 +166,10 @@ MSG
opts.on('--emoji', 'Parse and interpret emoji tags (e.g. :heart:) except when the leading colon is backslashed (e.g. \\:heart:).') do
wiki_options[:emoji] = true
end
opts.on('--default-keybinding [KEYBINDING]', Gollum::KEYBINDINGS.drop(1), 'Set the default keybinding for the editor. Can be set to \'vim\', or \'emacs\'.') do |keybinding|
wiki_options[:default_keybinding] = keybinding.to_s
puts wiki_options[:default_keybinding]
end
opts.separator ''
opts.separator ' Common:'
+2 -1
View File
@@ -14,7 +14,8 @@ require ::File.expand_path('../gollum/uri_encode_component', __FILE__)
module Gollum
VERSION = '5.3.0'
KEYBINDINGS = ['default', 'vim', 'emacs']
::I18n.available_locales = [:en]
::I18n.load_path = Dir[::File.expand_path("lib/gollum/locales") + "/*.yml"]
+1
View File
@@ -110,6 +110,7 @@ module Precious
@show_local_time = settings.wiki_options.fetch(:show_local_time, false)
@wiki_title = settings.wiki_options.fetch(:title, 'Gollum Wiki')
@default_keybinding = settings.wiki_options.fetch(:default_keybinding, 'default')
if settings.wiki_options[:template_dir]
Precious::Views::Layout.extend Precious::Views::TemplateCascade
@@ -1 +1 @@
{"files":{"app-f05401ee374f0c7f48fc2bc08e30b4f4db705861fd5895ed70998683b383bfb5.js":{"logical_path":"app.js","mtime":"2021-11-15T20:08:30-08:00","size":136040,"digest":"f05401ee374f0c7f48fc2bc08e30b4f4db705861fd5895ed70998683b383bfb5","integrity":"sha256-8FQB7jdPDH9I/CvAjjC09NtwWGH9WJXtcJmGg7ODv7U="},"editor-9881d0c7ae663293f0e3a7e72729eec7e940fa613185c076709b76d292f5703a.js":{"logical_path":"editor.js","mtime":"2021-11-15T20:08:30-08:00","size":744886,"digest":"9881d0c7ae663293f0e3a7e72729eec7e940fa613185c076709b76d292f5703a","integrity":"sha256-mIHQx65mMpPw46fnJynux+lA+mExhcB2cJt20pL1cDo="},"app-309be032396e783b13a47df58f389b7c8e11c2b2d42640560b874f677c25f6e5.css":{"logical_path":"app.css","mtime":"2021-11-15T20:08:30-08:00","size":396731,"digest":"309be032396e783b13a47df58f389b7c8e11c2b2d42640560b874f677c25f6e5","integrity":"sha256-MJvgMjlueDsTpH31jzibfI4RwrLUJkBWC4dPZ3wl9uU="},"criticmarkup-31ae5d3282bbb8e7b7c3c9917e9fb68e3315a6b4a75da6cec48d21b8846905c4.css":{"logical_path":"criticmarkup.css","mtime":"2021-08-22T15:24:51-07:00","size":646,"digest":"31ae5d3282bbb8e7b7c3c9917e9fb68e3315a6b4a75da6cec48d21b8846905c4","integrity":"sha256-Ma5dMoK7uOe3w8mRfp+2jjMVprSnXabOxI0huIRpBcQ="},"print-512498c368be0d3fb1ba105dfa84289ae48380ec9fcbef948bd4e23b0b095bfb.css":{"logical_path":"print.css","mtime":"2021-08-22T15:24:51-07:00","size":75,"digest":"512498c368be0d3fb1ba105dfa84289ae48380ec9fcbef948bd4e23b0b095bfb","integrity":"sha256-USSYw2i+DT+xuhBd+oQomuSDgOyfy++Ui9TiOwsJW/s="}},"assets":{"app.js":"app-f05401ee374f0c7f48fc2bc08e30b4f4db705861fd5895ed70998683b383bfb5.js","editor.js":"editor-9881d0c7ae663293f0e3a7e72729eec7e940fa613185c076709b76d292f5703a.js","app.css":"app-309be032396e783b13a47df58f389b7c8e11c2b2d42640560b874f677c25f6e5.css","criticmarkup.css":"criticmarkup-31ae5d3282bbb8e7b7c3c9917e9fb68e3315a6b4a75da6cec48d21b8846905c4.css","print.css":"print-512498c368be0d3fb1ba105dfa84289ae48380ec9fcbef948bd4e23b0b095bfb.css"}}
{"files":{"app-f05401ee374f0c7f48fc2bc08e30b4f4db705861fd5895ed70998683b383bfb5.js":{"logical_path":"app.js","mtime":"2021-11-15T20:08:30-08:00","size":136040,"digest":"f05401ee374f0c7f48fc2bc08e30b4f4db705861fd5895ed70998683b383bfb5","integrity":"sha256-8FQB7jdPDH9I/CvAjjC09NtwWGH9WJXtcJmGg7ODv7U="},"editor-9881d0c7ae663293f0e3a7e72729eec7e940fa613185c076709b76d292f5703a.js":{"logical_path":"editor.js","mtime":"2021-11-15T20:08:30-08:00","size":744886,"digest":"9881d0c7ae663293f0e3a7e72729eec7e940fa613185c076709b76d292f5703a","integrity":"sha256-mIHQx65mMpPw46fnJynux+lA+mExhcB2cJt20pL1cDo="},"app-309be032396e783b13a47df58f389b7c8e11c2b2d42640560b874f677c25f6e5.css":{"logical_path":"app.css","mtime":"2022-05-26T12:13:37+02:00","size":396731,"digest":"309be032396e783b13a47df58f389b7c8e11c2b2d42640560b874f677c25f6e5","integrity":"sha256-MJvgMjlueDsTpH31jzibfI4RwrLUJkBWC4dPZ3wl9uU="},"criticmarkup-31ae5d3282bbb8e7b7c3c9917e9fb68e3315a6b4a75da6cec48d21b8846905c4.css":{"logical_path":"criticmarkup.css","mtime":"2020-03-29T22:28:51+02:00","size":646,"digest":"31ae5d3282bbb8e7b7c3c9917e9fb68e3315a6b4a75da6cec48d21b8846905c4","integrity":"sha256-Ma5dMoK7uOe3w8mRfp+2jjMVprSnXabOxI0huIRpBcQ="},"print-512498c368be0d3fb1ba105dfa84289ae48380ec9fcbef948bd4e23b0b095bfb.css":{"logical_path":"print.css","mtime":"2020-03-30T11:12:22+02:00","size":75,"digest":"512498c368be0d3fb1ba105dfa84289ae48380ec9fcbef948bd4e23b0b095bfb","integrity":"sha256-USSYw2i+DT+xuhBd+oQomuSDgOyfy++Ui9TiOwsJW/s="},"app-eb6effc9f708916af14718a5c9d2a5028625664f62c2528e5989538537f3f4a8.js":{"logical_path":"app.js","mtime":"2022-05-26T13:00:46+02:00","size":188288,"digest":"eb6effc9f708916af14718a5c9d2a5028625664f62c2528e5989538537f3f4a8","integrity":"sha256-627/yfcIkWrxRxilydKlAoYlZk9iwlKOWYlThTfz9Kg="},"editor-ebdf534a0063fe3b05a7e7daaf7aa40b78fab9863142b161d88f32a3f035378a.js":{"logical_path":"editor.js","mtime":"2022-05-26T13:00:46+02:00","size":745160,"digest":"ebdf534a0063fe3b05a7e7daaf7aa40b78fab9863142b161d88f32a3f035378a","integrity":"sha256-699TSgBj/jsFp+far3qkC3j6uYYxQrFh2I8yo/A1N4o="}},"assets":{"app.js":"app-eb6effc9f708916af14718a5c9d2a5028625664f62c2528e5989538537f3f4a8.js","editor.js":"editor-ebdf534a0063fe3b05a7e7daaf7aa40b78fab9863142b161d88f32a3f035378a.js","app.css":"app-309be032396e783b13a47df58f389b7c8e11c2b2d42640560b874f677c25f6e5.css","criticmarkup.css":"criticmarkup-31ae5d3282bbb8e7b7c3c9917e9fb68e3315a6b4a75da6cec48d21b8846905c4.css","print.css":"print-512498c368be0d3fb1ba105dfa84289ae48380ec9fcbef948bd4e23b0b095bfb.css"}}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -55,6 +55,20 @@
}, 2000);
}
function setEditorKeyboardHandler(mode) {
var editor = window.ace_editor;
var storage = window.localStorage;
storage.setItem('gollum-kbm', mode)
if (mode == "default") {
editor.setKeyboardHandler();
} else if (mode == "vim" || mode == "emacs") {
editor.setKeyboardHandler("ace/keyboard/" + mode);
} else {
editor.setKeyboardHandler();
}
editor.focus();
}
/**
* $.GollumEditor
*
@@ -97,9 +111,22 @@
});
$('#gollum-autorecover-msg')[0].hidden = false;
}
// Check for user last keybind and ensure ui is correct
var storage = window.localStorage;
var userDefaultKeybind = storage.getItem('gollum-kbm');
if (userDefaultKeybind) {
default_keybinding = userDefaultKeybind;
}
var keybinding = document.getElementById('keybinding')
for (var i = 0; i < keybinding.options.length; ++i) {
if (keybinding.options[i].text === default_keybinding) {
keybinding.options[i].selected = true;
}
}
editor.setTheme("ace/theme/tomorrow");
editor.setKeyboardHandler();
setEditorKeyboardHandler(default_keybinding);
editor.renderer.setShowGutter(false);
editor.getSession().setUseWrapMode(true);
editor.getSession().setValue(textarea.val());
@@ -151,15 +178,7 @@
$("#keybinding").change(function() {
var mode = $(this).val();
var editor = window.ace_editor;
if (mode == "default") {
editor.setKeyboardHandler();
} else if (mode == "vim" || mode == "emacs") {
editor.setKeyboardHandler("ace/keyboard/" + mode);
} else {
editor.setKeyboardHandler();
}
editor.focus();
setEditorKeyboardHandler(mode)
});
// Remove any autosaved text when we hit save or cancel
+3 -3
View File
@@ -51,9 +51,9 @@
<div id="gollum-editor-format-selector">
<label for="format">Keybinding</label>
<select id="keybinding" name="keybinding" class="form-select input-sm">
<option selected="selected">default</option>
<option>vim</option>
<option>emacs</option>
{{#keybindings}}
<option {{#selected}}selected="selected" {{/selected}}value="{{name}}">{{name}}</option>
{{/keybindings}}
</select>
<label for="format">Markup</label>
<select id="wiki_format" name="format" class="form-select input-sm">
+3
View File
@@ -31,6 +31,9 @@
{{#is_create_page}}
var default_markup = '{{default_markup}}';
{{/is_create_page}}
{{#has_editor}}
var default_keybinding = '{{default_keybinding}}';
{{/has_editor}}
</script>
{{#sprockets_javascript_tag}}app{{/sprockets_javascript_tag}}
+12
View File
@@ -4,6 +4,18 @@ module Precious
true
end
def default_keybinding
@default_keybinding
end
def keybindings
Gollum::KEYBINDINGS.map do |kb|
{ :name => kb,
:selected => default_keybinding == kb
}
end
end
def formats(selected = @page.format)
Gollum::Markup.formats.map do |key, val|
{ :name => val[:name],
+64
View File
@@ -1058,3 +1058,67 @@ context 'Frontend with base path' do
Precious::MapGollum.new(@base_path)
end
end
context "Default keybindings" do
include Rack::Test::Methods
setup do
@path = cloned_testpath("examples/empty.git")
@wiki = Gollum::Wiki.new(@path)
@url = '/gollum/create/test'
Precious::App.set(:gollum_path, @path)
Precious::App.set(:wiki_options, {})
end
teardown do
FileUtils.rm_rf(@path)
end
test 'keybinding unset' do
get @url
assert_equal last_response.body.include?('selected="selected" value="default"'), false
assert_equal last_response.body.include?('selected="selected" value="vim"'), false
assert_equal last_response.body.include?('selected="selected" value="emacs"'), false
end
test 'keybinding `dne`' do
# dne := does not exist
Precious::App.set(:wiki_options, {:default_keybinding => 'dne'})
get @url
assert_equal last_response.body.include?('selected="selected" value="default"'), false
assert_equal last_response.body.include?('selected="selected" value="vim"'), false
assert_equal last_response.body.include?('selected="selected" value="emacs"'), false
Precious::App.set(:wiki_options, {:default_keybinding => 'none'})
end
test 'keybinding `default`' do
Precious::App.set(:wiki_options, {:default_keybinding => 'default'})
get @url
assert_equal last_response.body.include?('selected="selected" value="default"'), true
assert_equal last_response.body.include?('selected="selected" value="vim"'), false
assert_equal last_response.body.include?('selected="selected" value="emacs"'), false
Precious::App.set(:wiki_options, {:default_keybinding => 'none'})
end
test 'keybinding `vim`' do
Precious::App.set(:wiki_options, {:default_keybinding => 'vim'})
get @url
assert_equal last_response.body.include?('selected="selected" value="default"'), false
assert_equal last_response.body.include?('selected="selected" value="vim"'), true
assert_equal last_response.body.include?('selected="selected" value="emacs"'), false
Precious::App.set(:wiki_options, {:default_keybinding => 'none'})
end
test 'keybinding `emacs`' do
Precious::App.set(:wiki_options, {:default_keybinding => 'emacs'})
get @url
assert_equal last_response.body.include?('selected="selected" value="default"'), false
assert_equal last_response.body.include?('selected="selected" value="vim"'), false
assert_equal last_response.body.include?('selected="selected" value="emacs"'), true
Precious::App.set(:wiki_options, {:default_keybinding => 'none'})
end
def app
Precious::App
end
end