README.md 4.3 KB

Lite mite wrapping basic DOM for Amber Smalltalk

Lite mite wrapping basic DOM for Amber Smalltalk.

It uses a selection of raw DOM API to perform tasks; it does not use any cross-browser library. To work on IE8 (or other non-compliant browser), include amber-compat-es5 and also shim event API (https://github.com/jonathantneal/EventListener looks good).

Getting Started

  • Install Amber (Instructions)
  • Do amber init
  • npm install @ambers/domite --save
  • grunt devel
  • Start server with amber serve and go to http://localhost:4000/

This makes modules from domite namespace loadable.

To do so in the Helios IDE change the imports: section of your packages which use Domite to imports: {'domite/DOMite'}.

Or you may add it to the testing.js / devel.js files. The former is preferred because of an easier deployment process.

API (class doc of class Domite)

I am (hopefully thin) wrapper around the notion of "cursor in a page". I represent a DOM node and a point where to insert new content into it.

So I play both the role of a container that inserts as well as the role of an element being inserted.

I inherit from ProtoStream.

Creation API:

  • Domite new creates an insertion point at the bottom of <body>.
  • Domite newStream is unique way to create pieces of content. It creates an instance "floating in thin air" (wrapper around DOM DocumentFragment) that can be filled with any contents and then inserted in a page.
  • Domite fromElement: aDomElement wraps an element and set the cursor to its end.
  • Domite newElement: 'div' creates new <div /> element (and returns it wrapped as a Domite).

CSS selector API:

  • Domite at: aSelector wraps an element found by document.querySelector(aSelector).
  • aDomite at: aSelector wraps an element found by element.querySelector(aSelector).
  • Domite allAt: aSelector return collection of wrapped results of document.querySelectorAll(aSelector).
  • aDomite allAt: aSelector return collection of wrapped results of element.querySelectorAll(aSelector).

Manipulation API:

  • aDomite << obj inserts obj at the insertion point.
  • aDomite resetContents deletes contents of the wrapped element.
  • aDomite cutUpTo: anotherDomite removes contents between the two cursors (or up to the end of the receiver) and returns it collected in a wrapped DocumentFragment (IOW, you can anotherPlace << theResult to move the contents in the specified range).

  • aDomite attrAt: aString returns attribute of the wrapped element or nil.

  • aDomite attrAt: aString put: anotherString sets an attribute of the wrapped element.

  • aDomite propAt: aString returns JS property of the wrapped element or nil.

  • aDomite propAt: aString put: anObject sets JS property of the wrapped element.

Cursor moving API:

Take this sample HTML, where [n] are just markers, not real content:

<body>
  <h1>header</h1>
  [4]<p>[2]Hello[1]world[3]</p>[5]
  <small>footer</small>
</body>

If d is a Domite representing [1], then:

  • d setToStart would move d to be at [2],
  • d setToEnd would move d to be at [3],
  • d setToBefore would move d to be at [4], and
  • d setToAfter would move d to be at [5].

It is not presumed one would use setToXxx to actually move around in a single instance. It is envisioned this API will be used mostly in combination with copy, like afterMe := self copy setToAfter.

Event API:

  • aDomite on: aString bind: [ :ev | ... ] binds a block to process an event.
  • aDomite off: aString unbind: aBlock unbinds the block from processing an event.
  • aDomite fire: aString [detail: anObject] triggers a CustomEvent with specified type and, optionally, a detail object.
  • aDomite fireEvent: anEvent triggers existing DOM Event object!

Contributing

To bring project alive (for example after git clone):

npm run init

Developing the project (after brought alive):

Start server with amber serve and go to http://localhost:4000/ in your browser and follow the instructions