blob: fe2708ee93c8af564b4a75849bdb426064069bda [file] [log] [blame]
package org.eclipse.emf.parsley.doc.websitegen.bootstrap
import com.google.inject.Inject
import java.util.List
import java.util.Map
import org.eclipse.emf.common.notify.impl.AdapterImpl
import org.eclipse.xtext.xdoc.xdoc.AbstractSection
import org.eclipse.xtext.xdoc.xdoc.Document
import org.eclipse.xtext.xdoc.xdoc.Identifiable
class TargetPaths {
@Inject extension XdocExtensions
def splitAt(Document document, (AbstractSection)=>boolean predicate, String prefix) {
val adapter = new TargetPathAdapter
traverseChildren(document, adapter, prefix, "", predicate);
document.eResource.resourceSet.eAdapters.add(adapter)
}
def getTargetPath(Identifiable element) {
element.targetPathAdapter?.targetPaths?.get(element)
?: ''
}
def isTargetRootElement(AbstractSection element) {
val targetFileRoots = element.targetPathAdapter?.targetFileRoots
if(targetFileRoots !== null)
targetFileRoots.contains(element)
else
element instanceof Document
}
def getTargetRoots(Document document) {
document.targetPathAdapter?.targetFileRoots ?: newArrayList(document)
}
def protected void traverseChildren(Identifiable element, TargetPathAdapter adapter, String prefix,
String parentPath, (AbstractSection)=>boolean predicate) {
var String thisPath = parentPath
if (element instanceof AbstractSection) {
val resolved = element.resolve
if(resolved != element) {
traverseChildren(resolved, adapter, prefix, parentPath, predicate)
return
}
if(predicate.apply(element)) {
thisPath =
if(adapter.targetFileRoots.empty)
prefix + ".html"
else
prefix + adapter.targetFileRoots.size + ".html"
adapter.targetFileRoots.add(element)
}
}
adapter.targetPaths.put(element, thisPath)
for(child : element.eContents.filter(typeof(Identifiable))) {
traverseChildren(child, adapter, prefix, thisPath, predicate)
}
}
def protected getTargetPathAdapter(Identifiable element) {
element?.eResource?.resourceSet?.eAdapters
?.filter(typeof(TargetPathAdapter))?.head
}
}
@Data
class TargetPathAdapter extends AdapterImpl {
val Map<Identifiable, String> targetPaths = newHashMap()
val List<AbstractSection> targetFileRoots = newArrayList()
}