Verzeichnisstruktur phpBB-3.2.0


Veröffentlicht
06.01.2017

So funktioniert es


Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück

Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

(Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

render.js

Zuletzt modifiziert: 09.10.2024, 12:56 - Dateigröße: 5.95 KiB


001  var MSXML = (typeof DOMParser === 'undefined' || typeof XSLTProcessor === 'undefined');
002  var xslt = {
003      /**
004      * @param {!string} xsl
005      */
006      init: function(xsl)
007      {
008          var stylesheet = xslt.loadXML(xsl, 'MSXML2.FreeThreadedDOMDocument.6.0');
009          if (MSXML)
010          {
011              var generator = new ActiveXObject("MSXML2.XSLTemplate.6.0");
012              generator['stylesheet'] = stylesheet;
013              xslt.proc = generator['createProcessor']();
014          }
015          else
016          {
017              xslt.proc = new XSLTProcessor;
018              xslt.proc['importStylesheet'](stylesheet);
019          }
020      },
021   
022      /**
023      * @param {!string} xml
024      * @param {string} type
025      */
026      loadXML: function(xml, type)
027      {
028          if (MSXML)
029          {
030              var dom = new ActiveXObject(type);
031              dom['async'] = false;
032              dom['validateOnParse'] = false;
033              dom['loadXML'](xml);
034   
035              return dom;
036          }
037   
038          return (new DOMParser).parseFromString(xml, 'text/xml');
039      },
040   
041      /**
042      * @param {!string} paramName  Parameter name
043      * @param {!string} paramValue Parameter's value
044      */
045      setParameter: function(paramName, paramValue)
046      {
047          if (MSXML)
048          {
049              xslt.proc['addParameter'](paramName, paramValue, '');
050          }
051          else
052          {
053              xslt.proc['setParameter'](null, paramName, paramValue);
054          }
055      },
056   
057      /**
058      * @param {!string} xml
059      * @param {!HTMLDocument} targetDoc
060      */
061      transformToFragment: function(xml, targetDoc)
062      {
063          if (MSXML)
064          {
065              var div = targetDoc.createElement('div'),
066                  fragment = targetDoc.createDocumentFragment();
067   
068              xslt.proc['input'] = xslt.loadXML(xml, 'MSXML2.DOMDocument.6.0');
069              xslt.proc['transform']();
070              div.innerHTML = xslt.proc['output'];
071              while (div.firstChild)
072              {
073                  fragment.appendChild(div.removeChild(div.firstChild));
074              }
075   
076              return fragment;
077          }
078   
079          // NOTE: importNode() is used because of https://code.google.com/p/chromium/issues/detail?id=266305
080          return targetDoc.importNode(xslt.proc['transformToFragment'](xslt.loadXML(xml), targetDoc), true);
081      }
082  }
083  xslt.init(xsl);
084   
085  var postProcessFunctions = {};
086   
087  /**
088  * Parse a given text and render it into given HTML element
089  *
090  * @param {!string} text
091  * @param {!HTMLElement} target
092  */
093  function preview(text, target)
094  {
095      var targetDoc = target.ownerDocument,
096          resultFragment = xslt.transformToFragment(parse(text), targetDoc);
097   
098      // Apply post-processing
099      if (HINT.postProcessing)
100      {
101          var nodes = resultFragment['querySelectorAll']('[data-s9e-livepreview-postprocess]'),
102              i     = nodes.length;
103          while (--i >= 0)
104          {
105              /** @type {!string} */
106              var code = nodes[i]['getAttribute']('data-s9e-livepreview-postprocess');
107   
108              if (!postProcessFunctions[code])
109              {
110                  postProcessFunctions[code] = new Function(code);
111              }
112   
113              postProcessFunctions[code]['call'](nodes[i]);
114          }
115      }
116   
117      /**
118      * Update the content of given element oldEl to match element newEl
119      *
120      * @param {!HTMLElement} oldEl
121      * @param {!HTMLElement} newEl
122      */
123      function refreshElementContent(oldEl, newEl)
124      {
125          var oldNodes = oldEl.childNodes,
126              newNodes = newEl.childNodes,
127              oldCnt = oldNodes.length,
128              newCnt = newNodes.length,
129              oldNode,
130              newNode,
131              left  = 0,
132              right = 0;
133   
134          // Skip the leftmost matching nodes
135          while (left < oldCnt && left < newCnt)
136          {
137              oldNode = oldNodes[left];
138              newNode = newNodes[left];
139   
140              if (!refreshNode(oldNode, newNode))
141              {
142                  break;
143              }
144   
145              ++left;
146          }
147   
148          // Skip the rightmost matching nodes
149          var maxRight = Math.min(oldCnt - left, newCnt - left);
150   
151          while (right < maxRight)
152          {
153              oldNode = oldNodes[oldCnt - (right + 1)];
154              newNode = newNodes[newCnt - (right + 1)];
155   
156              if (!refreshNode(oldNode, newNode))
157              {
158                  break;
159              }
160   
161              ++right;
162          }
163   
164          // Clone the new nodes
165          var newNodesFragment = targetDoc.createDocumentFragment(),
166              i = left;
167   
168          while (i < (newCnt - right))
169          {
170              newNode = newNodes[i].cloneNode(true);
171   
172              newNodesFragment.appendChild(newNode);
173              ++i;
174          }
175   
176          // Remove the old dirty nodes in the middle of the tree
177          i = oldCnt - right;
178          while (--i >= left)
179          {
180              oldEl.removeChild(oldNodes[i]);
181          }
182   
183          // If we haven't skipped any nodes to the right, we can just append the fragment
184          if (!right)
185          {
186              oldEl.appendChild(newNodesFragment);
187          }
188          else
189          {
190              oldEl.insertBefore(newNodesFragment, oldEl.childNodes[left]);
191          }
192      }
193   
194      /**
195      * Update given node oldNode to make it match newNode
196      *
197      * @param {!HTMLElement} oldNode
198      * @param {!HTMLElement} newNode
199      * @return boolean Whether the node can be skipped
200      */
201      function refreshNode(oldNode, newNode)
202      {
203          if (oldNode.nodeName !== newNode.nodeName
204           || oldNode.nodeType !== newNode.nodeType)
205          {
206              return false;
207          }
208   
209          // Node.TEXT_NODE || Node.COMMENT_NODE
210          if (oldNode.nodeType === 3 || oldNode.nodeType === 8)
211          {
212              if (oldNode.nodeValue !== newNode.nodeValue)
213              {
214                  oldNode.nodeValue = newNode.nodeValue;
215              }
216   
217              return true;
218          }
219   
220          if (oldNode.isEqualNode && oldNode.isEqualNode(newNode))
221          {
222              return true;
223          }
224   
225          syncElementAttributes(oldNode, newNode);
226          refreshElementContent(oldNode, newNode);
227   
228          return true;
229      }
230   
231      /**
232      * Make the set of attributes of given element oldEl match newEl's
233      *
234      * @param {!HTMLElement} oldEl
235      * @param {!HTMLElement} newEl
236      */
237      function syncElementAttributes(oldEl, newEl)
238      {
239          var oldAttributes = oldEl['attributes'],
240              newAttributes = newEl['attributes'],
241              oldCnt = oldAttributes.length,
242              newCnt = newAttributes.length,
243              i = oldCnt;
244   
245          while (--i >= 0)
246          {
247              var oldAttr      = oldAttributes[i],
248                  namespaceURI = oldAttr['namespaceURI'],
249                  attrName     = oldAttr['name'];
250   
251              if (!newEl.hasAttributeNS(namespaceURI, attrName))
252              {
253                  oldEl.removeAttributeNS(namespaceURI, attrName);
254              }
255          }
256   
257          i = newCnt;
258          while (--i >= 0)
259          {
260              var newAttr      = newAttributes[i],
261                  namespaceURI = newAttr['namespaceURI'],
262                  attrName     = newAttr['name'],
263                  attrValue    = newAttr['value'];
264   
265              if (attrValue !== oldEl.getAttributeNS(namespaceURI, attrName))
266              {
267                  oldEl.setAttributeNS(namespaceURI, attrName, attrValue);
268              }
269          }
270      }
271   
272      refreshElementContent(target, resultFragment);
273  }
274   
275  /**
276  * Set the value of a stylesheet parameter
277  *
278  * @param {!string} paramName  Parameter name
279  * @param {!string} paramValue Parameter's value
280  */
281  function setParameter(paramName, paramValue)
282  {
283      xslt.setParameter(paramName, paramValue);
284  }