diff options
Diffstat (limited to 'plugins/org.eclipse.etrice.generator.doc/src/org/eclipse/etrice/generator/doc/gen/DocGen.xtend')
-rw-r--r-- | plugins/org.eclipse.etrice.generator.doc/src/org/eclipse/etrice/generator/doc/gen/DocGen.xtend | 220 |
1 files changed, 211 insertions, 9 deletions
diff --git a/plugins/org.eclipse.etrice.generator.doc/src/org/eclipse/etrice/generator/doc/gen/DocGen.xtend b/plugins/org.eclipse.etrice.generator.doc/src/org/eclipse/etrice/generator/doc/gen/DocGen.xtend index 5376e0a2c..b31e51173 100644 --- a/plugins/org.eclipse.etrice.generator.doc/src/org/eclipse/etrice/generator/doc/gen/DocGen.xtend +++ b/plugins/org.eclipse.etrice.generator.doc/src/org/eclipse/etrice/generator/doc/gen/DocGen.xtend @@ -14,9 +14,17 @@ package org.eclipse.etrice.generator.doc.gen import com.google.inject.Inject import com.google.inject.Singleton +import java.util.List +import java.io.File import org.eclipse.etrice.core.room.RoomModel import org.eclipse.etrice.core.room.Documentation import org.eclipse.etrice.core.room.ActorClass +import org.eclipse.etrice.core.room.ProtocolClass +import org.eclipse.etrice.core.room.DataClass +import org.eclipse.etrice.core.room.Operation +import org.eclipse.etrice.core.room.Attribute +import org.eclipse.etrice.core.room.Message +import org.eclipse.etrice.core.room.StandardOperation import org.eclipse.etrice.generator.base.ILogger import org.eclipse.etrice.generator.base.IRoomGenerator import org.eclipse.etrice.generator.etricegen.Root @@ -41,37 +49,231 @@ class DocGen implements IRoomGenerator { } def generateModelDoc(Root root, RoomModel model) {''' - \documentationclass[titlepage]{article} - «model.name» + \documentclass[titlepage]{article} + \usepackage{graphicx} + \makeatletter + \newcommand\level[1]{% + \ifcase#1\relax\expandafter\chapter\or + \expandafter\section\or + \expandafter\subsection\or + \expandafter\subsubsection\else + \def\next{\@level{#1}}\expandafter\next + \fi} + + \newcommand{\@level}[1]{% + \@startsection{level#1} + {#1} + {\z@}% + {-3.25ex\@plus -1ex \@minus -.2ex}% + {1.5ex \@plus .2ex}% + {\normalfont\normalsize\bfseries}} + + \newdimen\@leveldim + \newdimen\@dotsdim + {\normalfont\normalsize + \sbox\z@{0}\global\@leveldim=\wd\z@ + \sbox\z@{.}\global\@dotsdim=\wd\z@ + } + \newcounter{level4}[subsubsection] + \@namedef{thelevel4}{\thesubsubsection.\arabic{level4}} + \@namedef{level4mark}#1{} + \def\l@section{\@dottedtocline{1}{0pt}{\dimexpr\@leveldim*4+\@dotsdim*1+6pt\relax}} + \def\l@subsection{\@dottedtocline{2}{0pt}{\dimexpr\@leveldim*5+\@dotsdim*2+6pt\relax}} + \def\l@subsubsection{\@dottedtocline{3}{0pt}{\dimexpr\@leveldim*6+\@dotsdim*3+6pt\relax}} + \@namedef{l@level4}{\@dottedtocline{4}{0pt}{\dimexpr\@leveldim*7+\@dotsdim*4+6pt\relax}} + + \count@=4 + \def\@ncp#1{\number\numexpr\count@+#1\relax} + \loop\ifnum\count@<100 + \begingroup\edef\x{\endgroup + \noexpand\newcounter{level\@ncp{1}}[level\number\count@] + \noexpand\@namedef{thelevel\@ncp{1}}{% + \noexpand\@nameuse{thelevel\@ncp{0}}.\noexpand\arabic{level\@ncp{0}}} + \noexpand\@namedef{level\@ncp{1}mark}####1{}% + \noexpand\@namedef{l@level\@ncp{1}}% + {\noexpand\@dottedtocline{\@ncp{1}}{0pt}{\the\dimexpr\@leveldim*\@ncp{5}+\@dotsdim*\@ncp{0}\relax}}}% + \x + \advance\count@\@ne + \repeat + \makeatother + \setcounter{secnumdepth}{100} + \setcounter{tocdepth}{100} + + + \title{«model.name» Modeldocumentation} + \date{\today} + \author{generated by eTrice} + + \begin{document} + \pagestyle{plain} + \maketitle + \tableofcontents + + \newpage + \listoffigures + \newpage + \section{Modeldescription} + «model.docu.generateDocText» + + \section{Protocol Class Description} + «root.generateAllProtocolClassDocs(model)» + \section{Data Class Description} + «root.generateAllDataClassDocs(model)» + \section{Actor Class Description} «root.generateAllActorClassDocs(model)» + \end{document} ''' } + + def generateAllDataClassDocs(Root root, RoomModel model){''' + «FOR dc : model.dataClasses» + «root.generateDataClassDoc(dc)» + «ENDFOR» + '''} + def generateDataClassDoc(Root root, DataClass dc) {''' + \subsection {«dc.name»} + «dc.docu.generateDocText» + \level{3}{Attributes} + «dc.attributes.generateAttributesDoc» + + \level{3}{Operations} + «dc.operations.generateOperationsDoc» + ''' + } + + def generateAllProtocolClassDocs(Root root, RoomModel model) {''' + «FOR pc : model.protocolClasses» + «root.generateProtocolClassDoc(pc)» + «ENDFOR» + ''' + } + + def generateProtocolClassDoc(Root root, ProtocolClass pc) {''' + \subsection {«pc.name»} + «pc.docu.generateDocText» + \level{3}{Incoming Messages} + + \begin{tabular}[ht]{|l|l|l|} + \hline + Message & Data & Description\\ + «FOR ims : pc.allIncomingMessages» + \hline + «ims.name» & «IF ims.data != null» «ims.data.name» «ENDIF» & «ims.docu.generateDocText»\\ + «ENDFOR» + \hline + \end{tabular} + + \level{3}{Outgoing Messages} + \begin{tabular}[ht]{|l|l|l|} + \hline + Message & Data & Description\\ + «FOR oms : pc.allOutgoingMessages» + \hline + «oms.name» & «IF oms.data != null» «oms.data.name» «ENDIF» & «oms.docu.generateDocText»\\ + «ENDFOR» + \hline + \end{tabular} + ''' + } + def generateAllActorClassDocs(Root root, RoomModel model) {''' «FOR ac : model.actorClasses» - «root.generateActorClassDoc(ac)» + «root.generateActorClassDoc(model,ac)» «ENDFOR» ''' } - - def generateActorClassDoc(Root root, ActorClass ac) {''' + /* + «IF fileExists(ac.name) == "true"» + «ENDIF» */ + def generateActorClassDoc(Root root, RoomModel model, ActorClass ac) { + var filename = model.docGenerationTargetPath + "images\\" + ac.name + ".jpg" + filename = filename.replaceAll("\\\\","/"); + var filename1 = filename.replaceAll("/","//") + ''' \subsection{«ac.name»} - «root.irgendwas(ac)» «ac.docu.generateDocText» - «ac.name» + \level{3}{Structure} + + «IF fileExists(filename).equals("true")» + \begin{figure}[h] + \begin{center} + \includegraphics[scale=0.6]{«filename1»} + \caption{Blinky Toplevel Structure} + \end{center} + \end{figure} + «ENDIF» + + \level{4}{Attributes} + «ac.attributes.generateAttributesDoc» + + \level{3}{Behavior} + \level{4}{Operations} + «ac.operations.generateOperationsDoc» + \level{4}{Statemachine} ''' } + def generateAttributesDoc(List<Attribute> attributes) { + ''' + «IF !attributes.empty» + \begin{tabular}[ht]{|l|l|l|} + \hline + Name & Type & Description\\ + «FOR at : attributes» + \hline + «at.name» & «at.refType.type.name» & «generateDocText(at.docu)»\\ + «ENDFOR» + \hline + \end{tabular} + «ENDIF» + ''' + } + + def generateOperationsDoc(List<StandardOperation> operations) { + ''' + «FOR op : operations» + \begin{tabular}[ht]{|l|l|} + \hline + Name: & «op.name»\\ + \hline + ReturnType: & «IF op.returntype != null»«op.returntype.type.name»«ELSE»void«ENDIF»\\ + \hline + Arguments: & «FOR pa : op.arguments SEPARATOR ", "»«pa.name»:«pa.refType.type.name»«ENDFOR»\\ + «IF op.docu != null» + \hline + \multicolumn{2} {|l|} {«generateDocText(op.docu)»}\\ + «ENDIF» + \hline + \end{tabular} + \newline\newline\newline + «ENDFOR» + ''' + } + def generateDocText(Documentation doc){''' «IF doc!=null» - Documentation: «doc.text.join(" ///// ")» + «doc.text.join()» «ENDIF» ''' } + def fileExists(String f){ + val exist = (new File(f)).exists(); + if (exist == true) { + // File or directory exists + logger.logInfo("File found ! " + f); + return "true" + } else { + // File or directory does not exist + logger.logInfo("File not found ! " + f); + return "false" + } + } + + def irgendwas(Root root, ActorClass ac){ return ac.name + ".bla" } - }
\ No newline at end of file |