Specifications
Data Translators 239
Creating Property inspectors for locked content
After you’ve created a translator, you need to create a Property inspector for the content so the
user can change its properties (for example, the file to be included or one of the conditions in a
conditional statement). Inspecting translated content is a unique problem for several reasons:
• The user might want to change the properties of the translated content, and those changes
must be reflected in the untranslated content.
• The DOM contains the translated content (that is, the lock tags and the tags they surround are
nodes in the DOM), but the
outerHTML property of the documentElement and the
dreamweaver.getSelection() and dreamweaver.nodeToOffsets() functions act on the
untranslated source.
• The tags you inspect are different before and after translation.
A Property inspector for the
HAPPY tag might have a comment that looks similar to the following
code:
<!-- tag:HAPPY,priority:5,selection:exact,hline,vline, attrName:xxx,¬
attrValue:yyy -->
The Property inspector for the translated HAPPY tag, however, would have a comment that looks
similar to the following code:
<!-- tag:*LOCKED*,priority:5,selection:within,hline,vline -->
The canInspectSelection() function for the untranslated HAPPY Property inspector is simple:
Because the selection type is exact, it can return
true without further analysis. For the translated
HAPPY Property inspector, this function is more complicated; the keyword *LOCKED* indicates
that the Property inspector is appropriate when the selection is within a locked region, but
because a document can have several locked regions, further checks must be performed to
determine if the Property inspector matches this particular locked region.
Another problem is inherent in inspecting translated content. When you call
dom.getSelection(), the values that return by default are offsets into the untranslated source.
To expand the selection properly so that the locked region (and only the locked region) is
selected, use the following method:
var currentDOM = dw.getDocumentDOM();
var offsets = currentDOM.getSelection();
var theSelection = currentDOM.offsetsToNode(offsets[0],offsets[0]+1);
Using offsets[0]+1 as the second argument ensures that you remain within the opening lock
tag when you convert the offsets to a node. If you use
offsets[1] as the second argument, you
risk selecting the node above the lock.
After you make the selection (after ensuring that its nodeType is
node.ELEMENT_NODE), you can
inspect the
type attribute to see if the locked region matches this Property inspector, as shown in
the following example:
if (theSelection.nodeType == node.ELEMENT_NODE && ¬
theSelection.getAttribute('type') == 'happy'){
return true;
}else{
return false
}