• Jump To … +
    analyze.coffee autoload.coffee blender.coffee calculate.coffee caman.coffee convert.coffee event.coffee filter.coffee io.coffee layer.coffee logger.coffee module.coffee pixel.coffee plugin.coffee renderer.coffee store.coffee util.coffee blenders.coffee filters.coffee size.coffee blur.coffee camera.coffee compoundBlur.coffee edges.coffee posterize.coffee presets.coffee rotate.coffee stackBlur.coffee threshold.coffee
  • autoload.coffee

  • ¶

    Inform CamanJS that the DOM has been updated, and that it should re-scan for CamanJS instances in the document.

    Caman.DOMUpdated = ->
      imgs = document.querySelectorAll("img[data-caman]")
      return unless imgs.length > 0
    
      for img in imgs
        parser = new CamanParser img, ->
          @parse()
          @execute()
  • ¶

    If enabled, we check the page to see if there are any images with Caman instructions provided using HTML5 data attributes.

    if Caman.autoload then do ->
      if document.readyState is "complete"
        Caman.DOMUpdated()
      else
        document.addEventListener "DOMContentLoaded", Caman.DOMUpdated, false
  • ¶

    Parses Caman instructions embedded in the HTML data-caman attribute.

    class CamanParser
  • ¶

    Regex used for parsing options out of the data-caman attribute.

      INST_REGEX = "(\\w+)\\((.*?)\\)"
  • ¶

    Creates a new parser instance.

    @param [DOMObject] ele DOM object to be instantiated with CamanJS @param [Function] ready Callback function to pass to CamanJS

      constructor: (ele, ready) ->
        @dataStr = ele.getAttribute('data-caman')
        @caman = Caman ele, ready.bind(@)
  • ¶

    Parse the DOM object and call the parsed filter functions on the Caman object.

      parse: ->
        @ele = @caman.canvas
  • ¶

    First we find each instruction as a whole using a global regex search.

        r = new RegExp(INST_REGEX, 'g')
        unparsedInstructions = @dataStr.match r
        return unless unparsedInstructions.length > 0
  • ¶

    Once we gather all the instructions, we go through each one and parse out the filter name + it's parameters.

        r = new RegExp(INST_REGEX)
        for inst in unparsedInstructions
          [m, filter, args] = inst.match(r)
  • ¶

    Create a factory function so we can catch any errors that are produced when running the filters. This also makes it very simple to support multiple/complex filter arguments.

          instFunc = new Function("return function() {
            this.#{filter}(#{args});
          };")
    
          try
            func = instFunc()
            func.call @caman
          catch e
            Log.debug e
  • ¶

    Execute {Caman#render} on this Caman instance.

      execute: ->
        ele = @ele
        @caman.render ->
          ele.parentNode.replaceChild @toImage(), ele