Project

General

Profile

Feature #32528 » feature-32528-2.patch

Mizuki ISHIKAWA, 2019-12-04 01:00

View differences:

app/models/user_preference.rb
35 35
    'no_self_notified',
36 36
    'textarea_font',
37 37
    'recently_used_projects',
38
    'history_default_tab')
38
    'history_default_tab',
39
    'code_highlighting_languages')
39 40

  
40 41
  TEXTAREA_FONT_OPTIONS = ['monospace', 'proportional']
42
  DEFAULT_CODE_HIGHLIGHTING_LANGUAGES = %w[c cpp csharp css diff go groovy html java javascript objc perl php python r ruby sass scala shell sql swift xml yaml]
41 43

  
42 44
  def initialize(attributes=nil, *args)
43 45
    super
......
98 100
  def history_default_tab; self[:history_default_tab]; end
99 101
  def history_default_tab=(value); self[:history_default_tab]=value; end
100 102

  
103
  def code_highlighting_languages
104
    self[:code_highlighting_languages].presence || DEFAULT_CODE_HIGHLIGHTING_LANGUAGES.join(',')
105
  end
106

  
107
  def code_highlighting_languages=(value)
108
    languages = value.to_s.gsub(' ', '').split(',').select{|lang| Redmine::SyntaxHighlighting.language_supported?(lang) }.compact
109
    self[:code_highlighting_languages] = languages.join(',')
110
  end
111

  
101 112
  # Returns the names of groups that are displayed on user's page
102 113
  # Example:
103 114
  #   preferences.my_page_groups
app/views/users/_preferences.html.erb
6 6
<p><%= pref_fields.select :textarea_font, textarea_font_options %></p>
7 7
<p><%= pref_fields.text_field :recently_used_projects, :size => 2 %></p>
8 8
<p><%= pref_fields.select :history_default_tab, history_default_tab_options %></p>
9
<p><%= pref_fields.text_area :code_highlighting_languages, :rows => 4 %></p>
9 10
<% end %>
config/locales/en.yml
389 389
  field_recently_used_projects: Number of recently used projects in jump box
390 390
  field_history_default_tab: Issue's history default tab
391 391
  field_unique_id: Unique ID
392
  field_code_highlighting_languages: Code highlighting languages menu
392 393

  
393 394
  setting_app_title: Application title
394 395
  setting_welcome_text: Welcome text
lib/redmine/wiki_formatting/markdown/helper.rb
33 33

  
34 34
        def heads_for_wiki_formatter
35 35
          unless @heads_for_wiki_formatter_included
36
            code_highlighting_languages = User.current && User.current.pref.code_highlighting_languages
36 37
            content_for :header_tags do
37 38
              javascript_include_tag('jstoolbar/jstoolbar') +
38 39
              javascript_include_tag('jstoolbar/markdown') +
39 40
              javascript_include_tag("jstoolbar/lang/jstoolbar-#{current_language.to_s.downcase}") +
40
              javascript_tag("var wikiImageMimeTypes = #{Redmine::MimeType.by_type('image').to_json};") +
41
              javascript_tag("var wikiImageMimeTypes = #{Redmine::MimeType.by_type('image').to_json};" +
42
                             "var userHlLanguages = #{(code_highlighting_languages.nil? ? UserPreference::DEFAULT_CODE_HIGHLIGHTING_LANGUAGES : code_highlighting_languages.split(',')).to_json};") +
41 43
              stylesheet_link_tag('jstoolbar')
42 44
            end
43 45
            @heads_for_wiki_formatter_included = true
lib/redmine/wiki_formatting/textile/helper.rb
34 34

  
35 35
        def heads_for_wiki_formatter
36 36
          unless @heads_for_wiki_formatter_included
37
            code_highlighting_languages = User.current && User.current.pref.code_highlighting_languages
37 38
            content_for :header_tags do
38 39
              javascript_include_tag('jstoolbar/jstoolbar') +
39 40
              javascript_include_tag('jstoolbar/textile') +
40 41
              javascript_include_tag("jstoolbar/lang/jstoolbar-#{current_language.to_s.downcase}") +
41
              javascript_tag("var wikiImageMimeTypes = #{Redmine::MimeType.by_type('image').to_json};") +
42
              javascript_tag("var wikiImageMimeTypes = #{Redmine::MimeType.by_type('image').to_json};" +
43
                             "var userHlLanguages = #{(code_highlighting_languages.nil? ? UserPreference::DEFAULT_CODE_HIGHLIGHTING_LANGUAGES : code_highlighting_languages.split(',')).to_json};") +
42 44
              stylesheet_link_tag('jstoolbar')
43 45
            end
44 46
            @heads_for_wiki_formatter_included = true
public/javascripts/jstoolbar/jstoolbar.js
453 453

  
454 454
/* Code highlighting menu */
455 455
jsToolBar.prototype.precodeMenu = function(fn){
456
  var hlLanguages = ["c", "cpp", "csharp", "css", "diff", "go", "groovy", "html", "java", "javascript", "objc", "perl", "php", "python", "r", "ruby", "sass", "scala", "shell", "sql", "swift", "xml", "yaml"];
456
  var hlLanguages = window.userHlLanguages;
457 457
  var menu = $("<ul style='position:absolute;'></ul>");
458 458
  for (var i = 0; i < hlLanguages.length; i++) {
459 459
    $("<li></li>").text(hlLanguages[i]).appendTo(menu).mousedown(function(){
test/integration/layout_test.rb
66 66

  
67 67
    get '/projects/ecookbook/issues/new'
68 68
    assert_select 'head script[src^=?]', '/javascripts/jstoolbar/jstoolbar.js?'
69
    assert_include "var userHlLanguages = #{UserPreference::DEFAULT_CODE_HIGHLIGHTING_LANGUAGES.to_json};", response.body
69 70
  end
70 71

  
71 72
  def test_calendar_header_tags
test/unit/user_preference_test.rb
110 110
    up.save!
111 111
    assert_equal ['documents'], up.my_page_settings.keys
112 112
  end
113

  
114
  def test_code_highlighting_languages_setter_should_remove_except_supported_languages
115
    up = User.find(2).pref
116
    # bar is not a supported language
117
    up.code_highlighting_languages = 'ruby,cpp,bar,c'
118
    assert_equal 'ruby,cpp,c', up.code_highlighting_languages
119
  end
113 120
end
(4-4/5)