Defect #12744

Unable to call a macro with a name that contains uppercase letters

Added by Ling Li almost 5 years ago. Updated almost 5 years ago.

Status:ClosedStart date:
Priority:NormalDue date:
Assignee:Jean-Philippe Lang% Done:

0%

Category:Plugin API
Target version:2.2.1
Resolution:Fixed Affected version:2.2.0

Description

I recently upgraded from 2.0 to 2.2 and found that some macros stopped working. Those macros have upper-case letters in their name (e.g., EnableLaTeXMath), and it seems to me that Redmine 2.2 only triggers macro names in lower cases.

hypothesis: when looking up macros, Redmine 2.2 converts the macro name to lower case; but when registering the macro, Redmine 2.2 forgets to lower-case the names. So if a macro has upper case letters in the name during registration, it will never be found when it is called...

0001-Preserve-case-of-macro-names-shown-by-macro_list.patch Magnifier (2.34 KB) Takeshi Yaegashi, 2013-01-06 19:22

Associated revisions

Revision 11126
Added by Jean-Philippe Lang almost 5 years ago

Fixed that macros with uppercase letters can not be called (#12744).

Revision 11145
Added by Jean-Philippe Lang almost 5 years ago

Merged r11126 from trunk (#12744).

History

#1 Updated by Daniel Felix almost 5 years ago

Hi there,

well on the first sight, this seems to be ok.

Save a new macro:
source:trunk/lib/redmine/wiki_formatting/macros.rb#L153
There is a downcase in line 153

Find the macro:
source:trunk/app/helpers/application_helper.rb#L864
There is a $4.downcase in line 864

#2 Updated by Ling Li almost 5 years ago

I don't know Ruby but this line seems suspicious where name is added to available_macros before downcase: source:trunk/lib/redmine/wiki_formatting/macros.rb#L151

available_macros[name] = {:desc => @@desc || ''}.merge(options)

(well, it's possible that available_macros is not used during macro look-up. I'll try to figure out why my plugin works only after I rename it to lower-case.)

#3 Updated by Ling Li almost 5 years ago

I think that was the culprit. An ugly line (before that L151) fixes the problem, and confirms that the problem was due to not lower-casing the names during macro registration:

          name = "#{name}".downcase       # <-- this is the ugly fix
          name = name.to_sym if name.is_a?(String)
          available_macros[name] = {:desc => @@desc || ''}.merge(options)
          @@desc = nil
          Definitions.send :define_method, "macro_#{name}", &block  # <-- downcase was already done

#4 Updated by Jean-Philippe Lang almost 5 years ago

  • Subject changed from Macro name has to be lower-cased? to Unable to call a macro with a name that contains uppercase letters
  • Status changed from New to Closed
  • Assignee set to Jean-Philippe Lang
  • Target version set to 2.2.1
  • Resolution set to Fixed

Fix committed with test in r11126, thanks for pointing this out.
Maybe we should even make macro name case-sensitive?

#5 Updated by Jean-Philippe Lang almost 5 years ago

  • Status changed from Closed to Resolved

#6 Updated by Ling Li almost 5 years ago

I can confirm that r11126 fixes the problem. Thanks.

#7 Updated by Takeshi Yaegashi almost 5 years ago

Jean-Philippe Lang wrote:

Fix committed with test in r11126, thanks for pointing this out.
Maybe we should even make macro name case-sensitive?

I've just been stuck by this bug with my own macros too. There have already been many macro uses with case-confused names, so I hope they would remain case-insensitive.

Btw, I like {{macro_list}} to show macro names with case preserved. Please consider a fix like an attached patch.

#8 Updated by Jean-Philippe Lang almost 5 years ago

  • Status changed from Resolved to Closed

Merged.

Btw, I like

hello_world

Sample macro.

macro_list

Displays a list of all available macros, including description if available.

child_pages

Displays a list of child pages. With no argument, it displays the child pages of the current wiki page. Examples:

!{{child_pages}} -- can be used from a wiki page only
!{{child_pages(depth=2)}} -- display 2 levels nesting only
include

Include a wiki page. Example:

!{{include(Foo)}}

or to include a page of a specific project wiki:

!{{include(projectname:Foo)}}
collapse

Inserts of collapsed block of text. Example:

{{collapse(View details...)
This is a block of text that is collapsed by default.
It can be expanded by clicking a link.
}}
thumbnail

Displays a clickable thumbnail of an attached image. Examples:

{{thumbnail(image.png)}}
{{thumbnail(image.png, size=300, title=Thumbnail)}}
sample_macro

Sample macro

to show macro names with case preserved. Please consider a fix like an attached patch.

Will be fixed as a separate issue.

Also available in: Atom PDF