Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
much cleaner and flexible
  • Loading branch information
kristianmandrup committed Sep 5, 2012
1 parent 2e8b36d commit 492dc03
Show file tree
Hide file tree
Showing 2 changed files with 122 additions and 101 deletions.
44 changes: 25 additions & 19 deletions README.rdoc
Expand Up @@ -181,29 +181,35 @@ render js: top_item + append_to(:_top_item, markup)
Will select `.item:first` under the widget container element as a variable `_apo_top_item` and then append the markup to the DOM element(s) pointed to by that variable. Will select `.item:first` under the widget container element as a variable `_apo_top_item` and then append the markup to the DOM element(s) pointed to by that variable.
``` ```


* update_text(id, selector, markup) Inverse jQuery actions
* append(id, selector, markup)
* prepend(id, selector, markup)
* append_to(selector, markup) * append_to(selector, markup)
* prepend_to(selector, markup) * prepend_to(selector, markup)
* after(selector, markup)
* before(selector, markup)
* replace_all(selector, markup) * replace_all(selector, markup)
* unwrap(selector)
* wrap(selector, markup)
* wrap_inner(selector, markup)
* wrap_all(selector, markup)
* remove(selector)
* remove_class(selector, *classes)
* add_class(selector, *classes)
* toggle_class(selector, *classes)
* toggle_class_fun(selector, fun)
* get_attr(selector, name)
* get_prop(selector, name)
* get_val selector
* get_html(selector)
* empty(selector)


Normal jQuery action

* update_text(id, selector, markup)
* append(id, selector, markup)
* prepend(id, selector, markup)
* after(id, selector, markup)
* before(id, selector, markup)
* unwrap(id, selector)
* wrap(id, selector, markup)
* wrap_inner(id, selector, markup)
* wrap_all(id, selector, markup)
* remove(id, selector)
* remove_class(id, selector, *classes)
* add_class(id, selector, *classes)
* toggle_class(id, selector, *classes)
* toggle_class_fun(id, selector, fun)
* get_attr(id, selector, name)
* get_prop(id, selector, name)
* get_val(id, selector)
* get_html(id, selector)
* empty(id, selector)

Note: The first argument id is always optional


== Testing == Testing


Expand Down
179 changes: 97 additions & 82 deletions lib/apotomo/javascript_generator.rb
Expand Up @@ -61,137 +61,152 @@ def update_text(id, selector, markup)


def selector_for var, id, selector def selector_for var, id, selector
raise ArgumentError, "Must not be an _apo_ selector here: #{selector}" if apo_match?(selector) raise ArgumentError, "Must not be an _apo_ selector here: #{selector}" if apo_match?(selector)
"var _apo_#{var} = " + element(id) + ".find('#{selector}');" "var _apo_#{var} = " + element("##{id}") + ".find('#{selector}');"
end end


def find_element id, selector def find_element id, selector
element(id) + ".find('#{selector}')" if id == nil || apo_selector?(selector)
return element(calc_selector selector)
end
element("##{id}") + ".find('#{selector}')"
end end


def append(id, selector, markup) [:replace_all, :prepend_to, :append_to].each do |name|
find_element(id, selector) + ".append(#{escaped(markup)});" define_method name do |selector, markup|
_jq_inverse_action(selector, markup, name.to_sym)
end
end end


def prepend(id, selector, markup) [:append, :prepend, :after, :before, :wrap, :wrap_inner, :wrap_all].each do |name|
find_element(id, selector) + ".prepend(#{escaped(markup)});" define_method name do |args|
_jquery_action *args, name
end
end end


def append_to(selector, markup) def unwrap *args
selector = calc_selector selector jquery_action *args, 'unwrap()'
"$(#{escaped(markup)}).appendTo(#{selector});"
end

def prepend_to(selector, markup)
selector = calc_selector selector
"$(#{escaped(markup)}).prependTo(#{selector});"
end

def after selector, markup
selector = calc_selector selector
element(selector) + ".after(#{escaped(markup)});"
end

def before selector, markup
selector = calc_selector selector
element(selector) + ".before(#{escaped(markup)});"
end

def replace_all(selector, markup)
selector = calc_selector selector
"$(#{escaped(markup)}).replaceAll(#{selector});"
end

def unwrap(selector)
selector = calc_selector selector
element(selector) + ".unwrap();"
end

def wrap(selector, markup)
selector = calc_selector selector
element(selector) + ".wrap(#{escaped(markup)});"
end

def wrap_inner(selector, markup)
selector = calc_selector selector
element(selector) + ".wrapInner(#{escaped(markup)});"
end

def wrap_all(selector, markup)
selector = calc_selector selector
element(selector) + ".wrap_all(#{escaped(markup)});"
end end


def remove(selector) def remove *args
selector = calc_selector selector _jquery_action *args, 'remove()'
element(selector) + ".remove();"
end end


def remove_class(selector, *classes) def remove_class(id, selector, *classes)
classes = classes.flatten.join(' ') classes = classes.flatten.join(' ')
selector = calc_selector selector find_element(id, selector) + _js_action("removeClass('#{classes}')")
element(selector) + ".removeClass('#{classes}');"
end end
alias_method :remove_classes, :remove_class alias_method :remove_classes, :remove_class


def add_class(selector, *classes) def add_class(id, selector, *classes)
classes = classes.flatten.join(' ') classes = classes.flatten.join(' ')
selector = calc_selector selector find_element(id, selector) + _js_action("addClass('#{classes}')"
element(selector) + ".addClass('#{classes}');"
end end
alias_method :add_classes, :add_class alias_method :add_classes, :add_class


def toggle_class(selector, *classes) def toggle_class(id, selector, *classes)
classes = classes.flatten.join(' ') classes = classes.flatten.join(' ')
selector = calc_selector selector find_element(id, selector) + _js_action("toggleClass('#{classes}')")
element(selector) + ".toggleClass('#{classes}');"
end end
alias_method :toggle_classes, :toggle_class alias_method :toggle_classes, :toggle_class


def toggle_class_fun(selector, fun) def toggle_class_fun(id, selector, fun)
selector = calc_selector selector find_element(id, selector) + _js_action("toggleClass(function() {#{fun}})")
element(selector) + ".toggleClass(function() {#{fun}});"
end end


def get_attr(selector, name) def get_attr(id. selector, name)
selector = calc_selector selector find_element(id, selector) + _js_action("attr('#{name}')")
element(selector) + ".attr('#{name}');"
end end


def get_prop(selector, name) def get_prop(selector, name)
selector = calc_selector selector find_element(id, selector) + _js_action("prop('#{name}')")
element(selector) + ".prop('#{name}');"
end end


def get_val selector def get_val selector
selector = calc_selector selector find_element(id, selector) + _js_action("val()")
element(selector) + ".val();"
end end


def get_html(selector) def get_html(selector)
selector = calc_selector selector find_element(id, selector) + _js_action("html()")
element(selector) + ".html();"
end end


def empty(selector) def empty(selector)
selector = calc_selector selector find_element(id, selector) + _js_action("empty()")
element(selector) + ".empty();"
end end


private private


def _jq_inverse_action(selector, markup, action)
selector = calc_selector selector
action = _js_camelize(action)
"$(#{escaped(markup)}).#{action}(#{selector});"
end

def _jquery_action *args, &block
args = args.flatten
[id, selector, markup, action] = _extract_args(*args)
action ||= yield if block_given?
raise ArgumentError, "Must take action block or Symbol as last argument" unless action
elem_action = case action
when String
action = _js_camelize(action)
".#{action};"
else
action = _js_camelize(action)
_action(action, markup)
end
find_element(id, selector) + elem_action
end

def escaped markup def escaped markup
"'#{escape(markup)}'" "'#{escape(markup)}'"
end

def _action name, markup
_js_action "#{name}(#{_escaped(markup)})"
end

def _js_action action
".#{action};"
end

def _js_camelize str
str.to_s.camelize.sub(/^\w/, s[0].downcase)
end

# id, selector, markup, action
def _extract_args *args
[_extract_id(*args), _extract_selector(*args), _extract_markup(*args), _extract_action(*args)]
end

def _extract_id *args
args = args.flatten
args.size == 4 ? args.first : nil
end

def _extract_selector *args
args = args.flatten
args.size == 4 ? args[1] : args[0]
end

def _extract_markup(*args)
args = args.flatten
args.size == 4 ? args[2] : args.last
end

def _extract_action(*args)
args = args.flatten
args.size == 4 ? args.last : nil
end end


def apo_match? selector def _apo_match? selector
selector.to_s =~ /^_apo_/ selector.to_s =~ /^_apo_/
end end


def calc_selector selector def _calc_selector selector
selector = apo_selector?(selector) ? "_apo_#{selector}" : "'#{selector}'" selector = _apo_selector?(selector) ? "_apo_#{selector}" : "'#{selector}'"
end end


def apo_selector? selector def _apo_selector? selector
selector.kind_of?(Symbol) && selector.to_s[0..1] == '_' selector.kind_of?(Symbol) && selector.to_s[0..1] == '_'
end end
end end
Expand Down

0 comments on commit 492dc03

Please sign in to comment.