/** * Copyright (c) 2012 BMW Car IT and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html */ package org.jnario.spec.doc; import com.google.common.base.Objects; import com.google.inject.Inject; import java.util.Arrays; import java.util.List; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EObject; import org.eclipse.xtend.core.xtend.XtendClass; import org.eclipse.xtend.core.xtend.XtendMember; import org.eclipse.xtend.core.xtend.XtendPackage; import org.eclipse.xtend2.lib.StringConcatenation; import org.eclipse.xtext.xbase.XExpression; import org.eclipse.xtext.xbase.lib.CollectionLiterals; import org.eclipse.xtext.xbase.lib.Extension; import org.eclipse.xtext.xbase.lib.Functions.Function1; import org.eclipse.xtext.xbase.lib.IterableExtensions; import org.eclipse.xtext.xbase.lib.Procedures.Procedure1; import org.jnario.ExampleTable; import org.jnario.doc.AbstractDocGenerator; import org.jnario.doc.Filter; import org.jnario.doc.FilterExtractor; import org.jnario.doc.FilteringResult; import org.jnario.doc.HtmlFile; import org.jnario.spec.naming.ExampleNameProvider; import org.jnario.spec.spec.Example; import org.jnario.spec.spec.ExampleGroup; @SuppressWarnings("all") public class SpecDocGenerator extends AbstractDocGenerator { @Inject @Extension private ExampleNameProvider _exampleNameProvider; @Inject @Extension private FilterExtractor _filterExtractor; public HtmlFile createHtmlFile(final XtendClass xtendClass) { HtmlFile _xblockexpression = null; { if ((!(xtendClass instanceof ExampleGroup))) { return HtmlFile.EMPTY_FILE; } final ExampleGroup exampleGroup = ((ExampleGroup) xtendClass); final Procedure1<HtmlFile> _function = new Procedure1<HtmlFile>() { public void apply(final HtmlFile it) { String _javaClassName = SpecDocGenerator.this._exampleNameProvider.toJavaClassName(exampleGroup); it.setName(_javaClassName); String _asTitle = SpecDocGenerator.this.asTitle(exampleGroup); it.setTitle(_asTitle); CharSequence _generateContent = SpecDocGenerator.this.generateContent(exampleGroup); it.setContent(_generateContent); String _root = SpecDocGenerator.this.root(exampleGroup); it.setRootFolder(_root); EObject _eContainer = xtendClass.eContainer(); CharSequence _pre = SpecDocGenerator.this.pre(_eContainer, "lang-spec"); it.setSourceCode(_pre); String _fileName = SpecDocGenerator.this.fileName(xtendClass); it.setFileName(_fileName); String _executionStateClass = SpecDocGenerator.this.executionStateClass(exampleGroup); it.setExecutionStatus(_executionStateClass); } }; _xblockexpression = HtmlFile.newHtmlFile(_function); } return _xblockexpression; } private CharSequence generateContent(final ExampleGroup exampleGroup) { StringConcatenation _builder = new StringConcatenation(); CharSequence _generateDoc = this.generateDoc(exampleGroup); _builder.append(_generateDoc, ""); _builder.newLineIfNotEmpty(); StringConcatenation _generateMembers = this.generateMembers(exampleGroup, 1); _builder.append(_generateMembers, ""); _builder.newLineIfNotEmpty(); return _builder; } private StringConcatenation generateMembers(final ExampleGroup exampleGroup, final int level) { final StringConcatenation result = new StringConcatenation(); boolean inList = false; EList<XtendMember> _members = exampleGroup.getMembers(); final Function1<XtendMember, Boolean> _function = new Function1<XtendMember, Boolean>() { public Boolean apply(final XtendMember it) { boolean _or = false; if (((it instanceof Example) || (it instanceof ExampleGroup))) { _or = true; } else { _or = (it instanceof ExampleTable); } return Boolean.valueOf(_or); } }; final Iterable<XtendMember> members = IterableExtensions.<XtendMember>filter(_members, _function); for (final XtendMember member : members) { { final boolean isExampleGroup = (member instanceof ExampleGroup); if ((inList && (!isExampleGroup))) { result.append("<li>"); CharSequence _generate = this.generate(member, level); result.append(_generate); result.append("</li>"); } else { if (((!inList) && (!isExampleGroup))) { result.append("<ul>"); result.append("<li>"); CharSequence _generate_1 = this.generate(member, level); result.append(_generate_1); result.append("</li>"); inList = true; } else { boolean _and = false; if (!inList) { _and = false; } else { _and = isExampleGroup; } if (_and) { result.append("</ul>"); CharSequence _generate_2 = this.generate(member, level); result.append(_generate_2); inList = false; } else { boolean _and_1 = false; if (!(!inList)) { _and_1 = false; } else { _and_1 = isExampleGroup; } if (_and_1) { CharSequence _generate_3 = this.generate(member, level); result.append(_generate_3); } } } } } } if (inList) { result.append("</ul>"); } return result; } private CharSequence generateDoc(final EObject eObject) { StringConcatenation _builder = new StringConcatenation(); { String _documentation = this.documentation(eObject); boolean _notEquals = (!Objects.equal(_documentation, null)); if (_notEquals) { String _documentation_1 = this.documentation(eObject); String _markdown2Html = this.markdown2Html(_documentation_1); _builder.append(_markdown2Html, ""); _builder.newLineIfNotEmpty(); } } return _builder; } protected CharSequence _generate(final XtendMember member, final int level) { StringConcatenation _builder = new StringConcatenation(); return _builder; } protected CharSequence _generate(final Example example, final int level) { CharSequence _xblockexpression = null; { String docString = this.documentation(example); List<Filter> filters = CollectionLiterals.<Filter>emptyList(); boolean _notEquals = (!Objects.equal(docString, null)); if (_notEquals) { final FilteringResult filterResult = this._filterExtractor.apply(docString); List<Filter> _filters = filterResult.getFilters(); filters = _filters; String _string = filterResult.getString(); docString = _string; String _markdown2Html = this.markdown2Html(docString); docString = _markdown2Html; } StringConcatenation _builder = new StringConcatenation(); { String _name = example.getName(); boolean _notEquals_1 = (!Objects.equal(_name, null)); if (_notEquals_1) { _builder.append("<p"); String _name_1 = example.getName(); String _id = this.id(_name_1); _builder.append(_id, ""); _builder.append(" class=\"example "); String _executionStateClass = this.executionStateClass(example); _builder.append(_executionStateClass, ""); _builder.append("\"><strong>"); String _describe = this._exampleNameProvider.describe(example); String _decode = this.decode(_describe); _builder.append(_decode, ""); _builder.append("</strong></p>"); _builder.newLineIfNotEmpty(); } } _builder.append(docString, ""); _builder.newLineIfNotEmpty(); { boolean _and = false; boolean _isPending = example.isPending(); boolean _not = (!_isPending); if (!_not) { _and = false; } else { boolean _eIsSet = example.eIsSet(XtendPackage.Literals.XTEND_EXECUTABLE__EXPRESSION); _and = _eIsSet; } if (_and) { CharSequence _codeBlock = this.toCodeBlock(example, filters); _builder.append(_codeBlock, ""); _builder.newLineIfNotEmpty(); } } String _errorMessage = this.errorMessage(example); _builder.append(_errorMessage, ""); _builder.newLineIfNotEmpty(); _xblockexpression = _builder; } return _xblockexpression; } public CharSequence toCodeBlock(final Example example, final List<Filter> filters) { CharSequence _xblockexpression = null; { String prefix = "<pre class=\"prettyprint lang-spec linenums\">"; String _apply = this.apply(filters, prefix); prefix = _apply; XExpression _expression = example.getExpression(); final String code = this.serialize(_expression, filters); int _length = code.length(); boolean _equals = (_length == 0); if (_equals) { return ""; } StringConcatenation _builder = new StringConcatenation(); _builder.append(prefix, ""); _builder.newLineIfNotEmpty(); _builder.append(code, ""); _builder.append("</pre>"); _xblockexpression = _builder; } return _xblockexpression; } protected CharSequence _generate(final ExampleTable table, final int level) { StringConcatenation _builder = new StringConcatenation(); _builder.append("<p"); String _fieldName = this._exampleNameProvider.toFieldName(table); String _id = this.id(_fieldName); _builder.append(_id, ""); _builder.append("><strong>"); String _fieldName_1 = this._exampleNameProvider.toFieldName(table); String _title = this.toTitle(_fieldName_1); _builder.append(_title, ""); _builder.append("</strong></p>"); _builder.newLineIfNotEmpty(); CharSequence _generateDoc = this.generateDoc(table); _builder.append(_generateDoc, ""); _builder.newLineIfNotEmpty(); CharSequence _generate = super.generate(table); _builder.append(_generate, ""); _builder.newLineIfNotEmpty(); return _builder; } protected CharSequence _generate(final ExampleGroup exampleGroup, final int level) { StringConcatenation _builder = new StringConcatenation(); { if ((level > 1)) { _builder.append("<div class=\"level\">"); _builder.newLine(); } } _builder.append("<h"); String _header = this.header(exampleGroup, level); _builder.append(_header, ""); _builder.append(" class=\"exampleGroup "); String _executionStateClass = this.executionStateClass(exampleGroup); _builder.append(_executionStateClass, ""); _builder.append("\" "); String _describe = this._exampleNameProvider.describe(exampleGroup); String _id = this.id(_describe); _builder.append(_id, ""); _builder.append(">"); String _asTitle = this.asTitle(exampleGroup); _builder.append(_asTitle, ""); _builder.append("</h"); String _header_1 = this.header(exampleGroup, level); _builder.append(_header_1, ""); _builder.append(">"); _builder.newLineIfNotEmpty(); CharSequence _generateDoc = this.generateDoc(exampleGroup); _builder.append(_generateDoc, ""); _builder.newLineIfNotEmpty(); StringConcatenation _generateMembers = this.generateMembers(exampleGroup, (level + 1)); _builder.append(_generateMembers, ""); _builder.newLineIfNotEmpty(); { if ((level > 1)) { _builder.append("</div>"); _builder.newLine(); } } return _builder; } private String header(final ExampleGroup exampleGroup, final int level) { String _xifexpression = null; if ((level <= 1)) { _xifexpression = "3"; } else { String _xifexpression_1 = null; if ((level == 2)) { _xifexpression_1 = "4"; } else { _xifexpression_1 = "5"; } _xifexpression = _xifexpression_1; } return _xifexpression; } protected String _asTitle(final ExampleGroup exampleGroup) { String _describe = this._exampleNameProvider.describe(exampleGroup); return this.toTitle(_describe); } protected String _asTitle(final Example example) { String _describe = this._exampleNameProvider.describe(example); return this.toTitle(_describe); } public CharSequence generate(final XtendMember example, final int level) { if (example instanceof Example) { return _generate((Example)example, level); } else if (example instanceof ExampleGroup) { return _generate((ExampleGroup)example, level); } else if (example instanceof ExampleTable) { return _generate((ExampleTable)example, level); } else if (example != null) { return _generate(example, level); } else { throw new IllegalArgumentException("Unhandled parameter types: " + Arrays.<Object>asList(example, level).toString()); } } public String asTitle(final EObject example) { if (example instanceof Example) { return _asTitle((Example)example); } else if (example instanceof ExampleGroup) { return _asTitle((ExampleGroup)example); } else { throw new IllegalArgumentException("Unhandled parameter types: " + Arrays.<Object>asList(example).toString()); } } }