Class: SublimeDSL::SublimeText::Menu::DSLReader

Inherits:
Tools::BlankSlate show all
Defined in:
lib/sublime_dsl/sublime_text/menu.rb

Constant Summary

Constants inherited from Tools::BlankSlate

Tools::BlankSlate::KEPT_METHODS

Instance Method Summary collapse

Constructor Details

#initialize(file = nil) ⇒ DSLReader

Returns a new instance of DSLReader.



160
161
162
163
164
# File 'lib/sublime_dsl/sublime_text/menu.rb', line 160

def initialize(file = nil)
  @menus = []
  @item_stack = []
  instance_eval File.read(file, encoding: 'utf-8'), file if file
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(sym, *args, &block) ⇒ Object



187
188
189
190
# File 'lib/sublime_dsl/sublime_text/menu.rb', line 187

def method_missing(sym, *args, &block)
  @item_stack.empty? and raise Error, "'#{sym}' is invalid outside of a menu block"
  Command.from_method_missing(sym, args)
end

Instance Method Details

#_menusObject



166
167
168
# File 'lib/sublime_dsl/sublime_text/menu.rb', line 166

def _menus
  @menus
end

#item(*args, &block) ⇒ Object



177
178
179
180
181
182
183
184
185
# File 'lib/sublime_dsl/sublime_text/menu.rb', line 177

def item(*args, &block)
  @item_stack.empty? and raise Error, "'item' is invalid outside of a menu block"
  item = new_item(args)
  @item_stack.last.items << item
  return unless block
  @item_stack.push item
  instance_eval(&block)
  @item_stack.pop
end


170
171
172
173
174
175
# File 'lib/sublime_dsl/sublime_text/menu.rb', line 170

def menu(name, &block)
  @item_stack.empty? or raise Error, "menu blocks cannot be nested"
  @item_stack.push Menu.new(name)
  instance_eval(&block)
  @menus << @item_stack.pop
end

#new_item(args) ⇒ Object



192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
# File 'lib/sublime_dsl/sublime_text/menu.rb', line 192

def new_item(args)
  args.empty? and raise Error, "no argument for 'item'"
  item = Item.new

  # get the caption if any
  if args.first.is_a?(String)
    caption = args.shift
    caption =~ /&([^& ])/ and item.mnemonic = $1.upcase
    item.caption = caption.gsub(/&(.)/, '\1')
    return item if args.empty?
  end

  # get the command if any
  cmd = args.first
  if cmd.is_a?(Command)
    cmd.error and raise Error, "item '#{caption}': #{cmd.error}"
    item.command = cmd
    args.shift
    return item if args.empty?
  end

  # options
  options = args.first
  args.length == 1 && options.is_a?(Hash) or
    raise Error, "invalid arguments for 'item': #{args.inspect}"

  item.id = options.delete(:id)
  item.checkbox = options.delete(:checkbox)
  item.platform = options.delete(:platform)
  mnemonic = options.delete(:mnemonic)
  if mnemonic
    item.mnemonic && mnemonic != item.mnemonic and
      warn "item '#{caption}': mnemonic #{item.mnemonic} overwritten by #{mnemonic}"
    item.mnemonic = mnemonic
  end

  item
end