Quellcode durchsuchen

Several broken links fixed in online documentation (#1695)

* Documentation: Hubspot template changed

* Documentation: Title of website documentation is now a parameter in the Hubspot template.

* Documentation: Hubspot template changed

* Documentation: links on website fixed

* Documentation: build path fixed

* Documentation: most broken links in the online documentation fixed.

* Documentation: more links fixed

* Documentation: Hubspot template changed

* Documentation: URLs to be excluded fixed in link checker script
Rainer Klute vor 8 Jahren
Ursprung
Commit
e23b60e9a6
20 geänderte Dateien mit 313 neuen und 109 gelöschten Zeilen
  1. 1 1
      plugins/org.yakindu.sct.doc.user/.externalToolBuilders/Documentation Builder.launch
  2. 16 2
      plugins/org.yakindu.sct.doc.user/build.xml
  3. 1 1
      plugins/org.yakindu.sct.doc.user/misc/checkLinks_w3c.sh
  4. 2 2
      plugins/org.yakindu.sct.doc.user/src/main/java/org/yakindu/sct/doc/user/wikitext/Heading.java
  5. 125 7
      plugins/org.yakindu.sct.doc.user/src/main/java/org/yakindu/sct/doc/user/wikitext/HubspotDocumentBuilder.java
  6. 0 1
      plugins/org.yakindu.sct.doc.user/src/main/java/org/yakindu/sct/doc/user/wikitext/TableOfContentsBuilder.java
  7. 49 5
      plugins/org.yakindu.sct.doc.user/src/main/java/org/yakindu/sct/doc/user/wikitext/TextileToHubspotConverter.java
  8. 46 0
      plugins/org.yakindu.sct.doc.user/src/test/resources/testdata.textile
  9. 1 1
      plugins/org.yakindu.sct.doc.user/src/tutorials/tutorials.textile
  10. 3 3
      plugins/org.yakindu.sct.doc.user/src/user-guide/editing_statecharts.textile
  11. 3 3
      plugins/org.yakindu.sct.doc.user/src/user-guide/generating_code.textile
  12. 3 3
      plugins/org.yakindu.sct.doc.user/src/user-guide/generating_code_headless.textile
  13. 1 1
      plugins/org.yakindu.sct.doc.user/src/user-guide/glossary.textile
  14. 1 1
      plugins/org.yakindu.sct.doc.user/src/user-guide/overview.textile
  15. 11 11
      plugins/org.yakindu.sct.doc.user/src/user-guide/sctunit.textile
  16. 1 1
      plugins/org.yakindu.sct.doc.user/src/user-guide/simulating_statecharts.textile
  17. 3 3
      plugins/org.yakindu.sct.doc.user/src/user-guide/statechart_language.textile
  18. 24 35
      plugins/org.yakindu.sct.doc.user/src/website/YSCT-documentation-template.htmlf
  19. 3 1
      plugins/org.yakindu.sct.doc.user/src/website/p1.htmlf
  20. 19 27
      plugins/org.yakindu.sct.doc.user/src/website/p3.htmlf

Datei-Diff unterdrückt, da er zu groß ist
+ 1 - 1
plugins/org.yakindu.sct.doc.user/.externalToolBuilders/Documentation Builder.launch


+ 16 - 2
plugins/org.yakindu.sct.doc.user/build.xml

@@ -137,6 +137,18 @@
             <files dir="${lib.dir}/bin" layout="{groupId}/{artifactId}-{baseVersion}.{extension}" />
         </artifact:resolve>
 
+        <!-- Sources of MyLyn Wikitext's Textile support: -->
+        <artifact:resolve>
+            <artifact:dependencies>
+                <dependency groupId="org.eclipse.mylyn.docs"
+                            artifactId="org.eclipse.mylyn.wikitext.textile"
+                            version="${wikitext.version}"
+                            scope="compile"
+                            classifier="sources" />
+            </artifact:dependencies>
+            <files dir="${lib.dir}/src" layout="{groupId}/{artifactId}-{baseVersion}-{classifier}.{extension}" />
+        </artifact:resolve>
+
         <!-- Classpath for MyLyn Wikitext's Ant support: -->
         <artifact:resolve>
             <artifact:dependencies>
@@ -345,7 +357,7 @@
             <taskdef classpathref="wikitext.all.classpath" resource="org/eclipse/mylyn/wikitext/ant/tasks.properties" />
 
             <!-- Tutorials -->
-            <create-website-part name="YSCT-tutorials" title="YAKINDU Statechart Tools Tutorials">
+            <create-website-part name="YSCT-tutorials" title="Tutorials">
                 <textile-files>
                     <filelist dir="${src.dir}">
                         <file name="tutorials/tutorials.textile" />
@@ -359,7 +371,7 @@
             </create-website-part>
 
             <!-- User Guide -->
-            <create-website-part name="YSCT-user-guide" title="YAKINDU Statechart Tools User Guide">
+            <create-website-part name="YSCT-user-guide" title="User Guide">
                 <textile-files>
                     <filelist dir="${src.dir}">
                         <file name="user-guide/overview.textile" />
@@ -444,6 +456,8 @@
                 <arg value="${work.dir}/${index.textile}" />
                 <arg value="--output" />
                 <arg value="${work.dir}/${index.html}" />
+                <arg value="--property" />
+                <arg value="${navigation.title}=@{title}" />
             </java>
 
             <!-- Replace "<pre><code>" durch "<pre class="prettyprint"><code>": -->

+ 1 - 1
plugins/org.yakindu.sct.doc.user/misc/checkLinks_w3c.sh

@@ -65,7 +65,7 @@ elif [ "${target}" == "web" ]
 then
     checklink --broken --dir-redirects \
 	--recursive --depth 1 \
-	--exclude https://github.com/Yakindu/.* \
+	--exclude 'https://github.com/Yakindu/.*|http://groups.google.com/.*|javascript:.*|tel:.*|mailto:.*|https://cta-redirect.hubspot.com/' \
 	https://www.itemis.com/en/yakindu/state-machine/documentation/user-guide/ \
         2>&1 | tee log.txt
 else

+ 2 - 2
plugins/org.yakindu.sct.doc.user/src/main/java/org/yakindu/sct/doc/user/wikitext/Heading.java

@@ -95,10 +95,10 @@ public class Heading {
         final StringBuilder b = new StringBuilder();
         b.append("Heading[level=");
         b.append(level);
-        b.append(", text=");
-        b.append(title);
         b.append(", id=");
         b.append(id);
+        b.append(", text=");
+        b.append(title);
         b.append(", resource=");
         b.append(resource);
         b.append("]");

+ 125 - 7
plugins/org.yakindu.sct.doc.user/src/main/java/org/yakindu/sct/doc/user/wikitext/HubspotDocumentBuilder.java

@@ -8,8 +8,10 @@ import java.io.Writer;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.ListIterator;
+import java.util.Map;
 
 import org.eclipse.mylyn.wikitext.parser.Attributes;
+import org.eclipse.mylyn.wikitext.parser.LinkAttributes;
 import org.eclipse.mylyn.wikitext.parser.builder.HtmlDocumentBuilder;
 
 /**
@@ -123,17 +125,19 @@ public class HubspotDocumentBuilder extends HtmlDocumentBuilder {
 	 * Constructor. Reads all the required static files and template files.
 	 * </p>
 	 * 
+	 * @param properties
+	 * 
 	 * @param pass1Headings
 	 */
 	public HubspotDocumentBuilder(final Reader p1Reader, final Reader contentsTemplateReader, final Reader p2Reader,
-			final Reader tocTemplateReader, final Reader p3Reader, final List<Heading> pass1Headings,
-			final Writer writer) {
+			final Reader tocTemplateReader, final Reader p3Reader, final Map<String, String> properties,
+			final List<Heading> pass1Headings, final Writer writer) {
 		super(writer, true);
 		this.pass1Headings = pass1Headings;
 		try {
-			this.p1 = readContents(p1Reader, false);
-			this.p2 = readContents(p2Reader, false);
-			this.p3 = readContents(p3Reader, false);
+			this.p1 = resolveProperties(readContents(p1Reader, false), properties);
+			this.p2 = resolveProperties(readContents(p2Reader, false), properties);
+			this.p3 = resolveProperties(readContents(p3Reader, false), properties);
 		} catch (IOException e) {
 			throw new RuntimeException("Reading one the p files failed.", e);
 		}
@@ -153,6 +157,28 @@ public class HubspotDocumentBuilder extends HtmlDocumentBuilder {
 			w = new PrintWriter(writer);
 	}
 
+	/**
+	 * <p>
+	 * Replaces all occurrences of the <var>properties</var> map's "key" entries
+	 * in a string by the corresponding "value" entries. Replacement starts at
+	 * the beginning of the string and proceeds to the end. However, the
+	 * processing order of the properties is undefined.
+	 * </p>
+	 * 
+	 * @param s
+	 *            the string to do the replacements in
+	 * @param properties
+	 *            the properties map
+	 * @return the resulting string with all replacements done
+	 */
+	private String resolveProperties(final String s, final Map<String, String> properties) {
+		String result = s;
+		for (final String key : properties.keySet()) {
+			result = result.replace(key, properties.get(key));
+		}
+		return result;
+	}
+
 	/**
 	 * <p>
 	 * When the beginning of the document is encountered the P1 part is written
@@ -248,8 +274,59 @@ public class HubspotDocumentBuilder extends HtmlDocumentBuilder {
 		if (isEarlySeparator) {
 			if (!isProcessingHeading)
 				h2.beginSpan(type, attributes);
-		} else
+		} else {
+			if (SpanType.LINK == type && attributes instanceof LinkAttributes) {
+				final LinkAttributes linkAttributes = (LinkAttributes) attributes;
+				String hrefOrHashName = linkAttributes.getHref();
+				if (hrefOrHashName.startsWith("../")) {
+					boolean hasHash = false;
+					boolean hasFragment = false;
+					boolean hasFilename = false;
+					final String fragmentID;
+
+					// Get the fragment ID:
+					int fragmentPosition = hrefOrHashName.lastIndexOf('#');
+					if (fragmentPosition >= 0) {
+						hasHash = true;
+						if (fragmentPosition + 1 < hrefOrHashName.length())
+							hasFragment = true;
+						fragmentPosition++;
+					} else
+						fragmentPosition = hrefOrHashName.length();
+					fragmentID = hrefOrHashName.substring(fragmentPosition);
+
+					// Strip the last component (filename) from the URL, if any:
+					final StringBuilder b = new StringBuilder();
+					int filenamePosition = hrefOrHashName.lastIndexOf('/', fragmentPosition - 1);
+					hasFilename = filenamePosition >= 2 && filenamePosition + 2 <= fragmentPosition;
+					if (hasFilename)
+						b.append(hrefOrHashName.substring(0, filenamePosition));
+					else
+						b.append(hrefOrHashName.substring(0, fragmentPosition - (hasHash ? 1 : 0)));
+
+					if (hasFilename)
+						b.append('/');
+					if (hasFragment) {
+						// Find the fragment's H1 heading:
+						final Heading h1Heading = lookupH1HeadingOf(pass1Headings, fragmentID);
+
+						// Append H1 heading's ID to the URL:
+						if (h1Heading != null)
+							b.append(h1Heading.getId());
+						else
+							System.err.println("WARNING: H1 heading for fragment #" + fragmentID + " not found.");
+
+						// Append fragment ID.
+						b.append('#');
+						b.append(fragmentID);
+					} else if (hasHash)
+						b.append('#');
+
+					linkAttributes.setHref(b.toString());
+				}
+			}
 			super.beginSpan(type, attributes);
+		}
 	}
 
 	@Override
@@ -359,8 +436,9 @@ public class HubspotDocumentBuilder extends HtmlDocumentBuilder {
 	public void link(final Attributes attributes, final String hrefOrHashName, final String text) {
 		if (isEarlySeparator)
 			h2.link(attributes, hrefOrHashName, text);
-		else
+		else {
 			super.link(attributes, hrefOrHashName, text);
+		}
 	}
 
 	@Override
@@ -505,6 +583,46 @@ public class HubspotDocumentBuilder extends HtmlDocumentBuilder {
 		return result;
 	}
 
+	/**
+	 * <p>
+	 * Looks up the H1 heading of a specified subheading. The method first looks
+	 * up the subheading in the list of headings and then walks back the list
+	 * until it finds the next H1. If it turns out that the subheading is a H1
+	 * heading itself, that heading will be returned.
+	 * </p>
+	 * 
+	 * @param headings
+	 *            The list of heading to search
+	 * @param subheading
+	 *            The subheading
+	 * @return The subheading's associated H1 heading in the list of headings or
+	 *         <code>null</code> if either one or the other cannot be found.
+	 */
+	private Heading lookupH1HeadingOf(final List<Heading> headings, final String subheadingID) {
+		final ListIterator<Heading> i = headings.listIterator(headings.size());
+
+		// Look up the subheading:
+		Heading subheading = null;
+		while (subheading == null && i.hasPrevious()) {
+			final Heading h = i.previous();
+			if (subheadingID.equals(h.getId()))
+				subheading = h;
+		}
+		if (subheading == null)
+			return null;
+		if (subheading.getLevel() == 1)
+			return subheading;
+
+		// Look up the H1 heading:
+		Heading h1Heading = null;
+		while (h1Heading == null && i.hasPrevious()) {
+			final Heading h = i.previous();
+			if (h.getLevel() == 1)
+				h1Heading = h;
+		}
+		return h1Heading;
+	}
+
 	/**
 	 * <p>
 	 * Reads the complete contents of a {@link Reader} and returns it as a

+ 0 - 1
plugins/org.yakindu.sct.doc.user/src/main/java/org/yakindu/sct/doc/user/wikitext/TableOfContentsBuilder.java

@@ -1,6 +1,5 @@
 package org.yakindu.sct.doc.user.wikitext;
 
-import java.io.Reader;
 import java.util.ArrayList;
 import java.util.List;
 

+ 49 - 5
plugins/org.yakindu.sct.doc.user/src/main/java/org/yakindu/sct/doc/user/wikitext/TextileToHubspotConverter.java

@@ -7,7 +7,9 @@ import java.io.IOException;
 import java.io.Reader;
 import java.io.Writer;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.Vector;
 
 import org.eclipse.mylyn.wikitext.parser.MarkupParser;
@@ -36,6 +38,7 @@ public class TextileToHubspotConverter {
 		String p2Filename = null;
 		String tocTemplateFilename = null;
 		String p3Filename = null;
+		final Map<String, String> properties = new HashMap<String, String>();
 
 		/*
 		 * Parse command-line parameters:
@@ -70,6 +73,11 @@ public class TextileToHubspotConverter {
 				outFilename = args[++i];
 				continue;
 			}
+			if (arg.equals("-p") || arg.equals("--property")) {
+				final String nameValue = args[++i];
+				addTo(properties, nameValue);
+				continue;
+			}
 		}
 		assertParameterIsSpecified(p1Filename, "P1 file not specified.");
 		assertParameterIsSpecified(contentsTemplateFilename, "Contents template file not specified.");
@@ -114,7 +122,7 @@ public class TextileToHubspotConverter {
 		final Reader p3 = createFileReader(p3Filename, "P3 file not found");
 		final Writer out = new FileWriter(outFilename);
 		final HubspotDocumentBuilder docBuilder = new HubspotDocumentBuilder(p1, contentsTemplate, p2, tocTemplate, p3,
-				headings, out);
+				properties, headings, out);
 
 		/*
 		 * Concatenate all input files so that the Textile parser sees
@@ -141,6 +149,41 @@ public class TextileToHubspotConverter {
 		out.close();
 	}
 
+	/**
+	 * <p>
+	 * Add a name/value pair to a property map. The former is expected in the
+	 * form <code>name=value</code>. Leading or trailing white space around name
+	 * or value is removed. If the <code>=value</code> part or the
+	 * <code>value</code> part is missing, the <code>name</code> property will
+	 * be added with the value being the empty string. If the <code>name</code>
+	 * part is missing, a {@link RuntimeException} will be thrown.
+	 * </p>
+	 * 
+	 * @param properties
+	 *            the map to add the name/value pair to
+	 * @param nameValue
+	 *            the name/value pair
+	 */
+	private static void addTo(final Map<String, String> properties, final String nameValue) {
+		final int p = nameValue.indexOf('=');
+		final String name;
+		final String value;
+		if (p > 1) {
+			name = nameValue.substring(0, p);
+			if (p < nameValue.length() - 1)
+				value = nameValue.substring(p + 1);
+			else
+				value = "";
+		} else if (p == 0) {
+			value = nameValue.substring(1);
+			throw new RuntimeException("Name/value pair does not contain a name. Value: \"" + value + "\"");
+		} else {
+			name = nameValue;
+			value = "";
+		}
+		properties.put(name, value);
+	}
+
 	private static void assertParameterIsSpecified(final String p, final String msg) {
 		if (p == null || p.trim().isEmpty())
 			errorExit(msg);
@@ -153,10 +196,11 @@ public class TextileToHubspotConverter {
 
 	private static void errorExit(final String msg) {
 		System.err.println(msg);
-		System.err.println("Parameters: --p1-file part1File.htmlf"
-				+ " --contents-template-file contentTemplateFile.htmlf" + " --p2-file part2File.htmlf"
-				+ " --toc-template-file tocTemplateFile.htmlf" + " --p3-file part3file.htmlf"
-				+ " --input file.textile [--input file.textile]…" + " --output file.html");
+		System.err
+				.println("Parameters: --p1-file part1File.htmlf" + " --contents-template-file contentTemplateFile.htmlf"
+						+ " --p2-file part2File.htmlf" + " --toc-template-file tocTemplateFile.htmlf"
+						+ " --p3-file part3file.htmlf" + " --input file.textile [--input file.textile]…"
+						+ " --output file.html" + " [--property name=value]…");
 		System.exit(1);
 	}
 

+ 46 - 0
plugins/org.yakindu.sct.doc.user/src/test/resources/testdata.textile

@@ -0,0 +1,46 @@
+h1(#h1_1). h1_1
+
+h2(#h2_11). h2_11
+
+h2(#h2_12). h2_12
+
+h2(#h2_13). h2_13
+
+
+h1(#h1_2). h1_2
+
+h2(#h2_21). h2_21
+
+h2(#h2_22). h2_22
+
+h2(#h2_23). h2_23
+
+h2(#fragment). h2_fragment
+
+
+h1(#h1_3). h1_3
+
+h2(#h2_31). h2_31
+
+h2(#h2_32). h2_32
+
+h2(#h2_33). h2_33
+
+h2(#frag/ment). h2_frag/ment
+
+
+Links:
+* "../":../
+* "../#":../#
+* "../h1_2#fragment":../#fragment
+* "../h1_3#fragment":../#frag/ment
+* "../":../dirname
+* "../#":../dirname#
+* "../h1_2#fragment":../#fragment
+* "../h1_3#frag/ment":../dirname#frag/ment
+* "../dirname/":../dirname/filename
+* "../dirname/h1_2#":../dirname/filename#
+* "../dirname/h1_2#fragment":../dirname/filename#fragment
+* "../dirname/h1_3#frag/ment":../dirname/filename#frag/ment
+
+* "link":../dirname/filename#h1_3

+ 1 - 1
plugins/org.yakindu.sct.doc.user/src/tutorials/tutorials.textile

@@ -15,7 +15,7 @@ In the simulation screenshot above, the light switch is currently in the _on_ st
 
 h2(#tutorial_importing-light-switch-example). Importing light switch example
 
-Now try this for yourself. We are assuming that you have already installed and started YAKINDU Statechart Tools. If you don't, please see the "Installation Guide":../installation/installation.html for details.
+Now try this for yourself. We are assuming that you have already installed and started YAKINDU Statechart Tools. If you don't, please see the "Installation Guide":../installation/installation.html#inst_installing_yakindu_statechart_tools for details.
 
 # If the "Welcome" page is still open, close it. <p>!(standard-image small)images/tuto_5min_010_close_welcome.png(Closing the "Welcome" page)!</p>
 # In the main menu, select _File → New → Example…_.

Datei-Diff unterdrückt, da er zu groß ist
+ 3 - 3
plugins/org.yakindu.sct.doc.user/src/user-guide/editing_statecharts.textile


Datei-Diff unterdrückt, da er zu groß ist
+ 3 - 3
plugins/org.yakindu.sct.doc.user/src/user-guide/generating_code.textile


Datei-Diff unterdrückt, da er zu groß ist
+ 3 - 3
plugins/org.yakindu.sct.doc.user/src/user-guide/generating_code_headless.textile


+ 1 - 1
plugins/org.yakindu.sct.doc.user/src/user-guide/glossary.textile

@@ -174,7 +174,7 @@ h2(#glossary_state_machine_code). State machine code
 
 h2(#glossary_transition). Transition
 
-A *transition* is one of the fundamental concepts of "statecharts":#glossary_statechart. It leads from a source "state":#glossary_state to a target state. Details can be found in section "&quot;Transition&quot;":../user-guide/statechart_language#sclang_transitions.
+A *transition* is one of the fundamental concepts of "statecharts":#glossary_statechart. It leads from a source "state":#glossary_state to a target state. Details can be found in section "&quot;Transition&quot;":../user-guide/statechart_language.html#sclang_transitions.
 
 
 h2(#glossary_type_system). Type system

+ 1 - 1
plugins/org.yakindu.sct.doc.user/src/user-guide/overview.textile

@@ -22,7 +22,7 @@ p=. Features of YAKINDU Statechart Tools
 
 The Professional Edition of YAKINDU Statechart Tools makes additional features available:
 
-* "*Deep integration with the C programming language*":../user-guide/c-domain to directly access C variables, types etc.
+* "*Deep integration with the C programming language*":../user-guide/c-domain.html#cdom_deep_c_integration to directly access C variables, types etc.
 * "*Advanced simulation and debugging*":../user-guide/simulating_statecharts.html#advsim_debugging_with_breakpoints_and_snapshots with breakpoints and snapshots
 
 

Datei-Diff unterdrückt, da er zu groß ist
+ 11 - 11
plugins/org.yakindu.sct.doc.user/src/user-guide/sctunit.textile


+ 1 - 1
plugins/org.yakindu.sct.doc.user/src/user-guide/simulating_statecharts.textile

@@ -5,7 +5,7 @@ Simulating a statechart model means to execute it, raise events manually, have t
 
 You can run multiple state machines in parallel and even multiple instances of the same state machine.
 
-An introduction to simulation is given in section "&quot;Simulating the light switch model&quot;":../tutorials/tutorials#tutorial_simulating_the_light_switch_model.
+An introduction to simulation is given in section "&quot;Simulating the light switch model&quot;":../tutorials/tutorials.html#tutorial_simulating_the_light_switch_model.
 
 
 

Datei-Diff unterdrückt, da er zu groß ist
+ 3 - 3
plugins/org.yakindu.sct.doc.user/src/user-guide/statechart_language.textile


+ 24 - 35
plugins/org.yakindu.sct.doc.user/src/website/YSCT-documentation-template.htmlf

@@ -25,6 +25,7 @@
             }
         </style>
 
+        {#
         <script type="text/javascript" src="{{ get_public_template_url("custom/page/itemis/bootstrap-anchor.js") }}"></script>
         <script type="text/javascript">
         jQuery(document).ready(function() {
@@ -37,6 +38,7 @@
             jQuery('body').css('position', 'relative').scrollspy({target: "#sidebar-navigation", offset: 150});
         });
         </script>
+        #}
         
     {% elif dynamic_page_hubdb_table_id %}
         <link href="{{ get_public_template_url("Custom/page/itemis/it-yakindu-docs-overview.css") }}" rel="stylesheet" type="text/css">
@@ -80,11 +82,6 @@
     </div><!--end header -->
 </div><!--end header wrapper -->
 
-
-
-
-
-
 <div class="body-container-wrapper">
     <div class="body-container container-fluid">
 
@@ -95,8 +92,6 @@
 
 {% if dynamic_page_hubdb_row %}
 
-
-
     <div class="row-fluid-wrapper row-depth-1 row-number-2 ">
     <div class="row-fluid ">
 
@@ -104,7 +99,7 @@
     <div class="cell-wrapper layout-widget-wrapper">
     {% widget_block raw_html "module_150227904680399" wrapping_html='', per_widget_wrapper_html='', overrideable=true, label='Custom HTML' %}
     {% widget_attribute "value" %}<div id="sidebar-navigation">
-        <h2><span>Statechart User Guide</span> THEMES</h2>
+        <h2>${navigation.title}</h2>
         <nav>
             <ol class="nav">
 
@@ -209,10 +204,11 @@
     <div class="primary">
         <div class="row-fluid-wrapper">
             <div class="row-fluid">
+
                 <div class="themes-container search span4">
-                    <h2>What's your problem?</h2>
-                    <p>Can't find what you're looking for?</p>
-                    <div id="navigation-search-form" data-cx="015950920325887884916:2e61oxlndni">
+                    <h2>Can't find what you're looking for?</h2>
+                    <p>Browse the whole documentation.</p>
+                    <div id="navigation-search-form" data-cx="015950920325887884916:nwstrxx2ycm">
                         <nav class="it-header__menu cf it-header__de hs-cta-wrapper">
                             <input data-id="it-header__search-input" placeholder="Type here." type="search"> <br /><br />
                             <a href="#" class="header-tools__search-icon it_cta_button_next white">search</a>
@@ -220,31 +216,24 @@
                     </div>
                 </div>
 
-        {% for row in hubdb_table_rows(dynamic_page_hubdb_table_id, "&chapter__gte=1&orderBy=chapter") %}
-            
-            {% if loop.index != 1 && loop.index % 3 == 0 %}
-                    </div>
-                </div>
-                <div class="row-fluid-wrapper">
-                    <div class="row-fluid">
-            {% endif %}
-            
-                    <div class="themes-container span4{% if row.pro_feature %} pro-feature{% endif %}">
-                        <a href="{{ request.path }}/{{ row.hs_path }}"><h2>{{row.hs_name}}</h2></a>
-                        <p>{{row.description}}</p>
-                        
-                        <div class="hs-cta-wrapper"><a href="{{ request.path }}/{{ row.hs_path }}" class="it_cta_button_next white">More</a></div>
-                    </div>
-            
-            
-            {% if loop.last && loop.index % 3 == 2 %}
+
+            {% for row in hubdb_table_rows(dynamic_page_hubdb_table_id, "&chapter__gte=1&orderBy=chapter") %}
+                
+                {% if loop.index != 1 && loop.index % 3 == 0 %}
+                        </div>
                     </div>
-                </div>
-                <div class="row-fluid-wrapper">
-                    <div class="row-fluid">
-            {% endif %}
-            
-        {% endfor %}
+                    <div class="row-fluid-wrapper">
+                        <div class="row-fluid">
+                {% endif %}
+                
+                        <div class="themes-container span4{% if row.pro_feature %} pro-feature{% endif %}">
+                            <a href="{{ request.path }}/{{ row.hs_path }}"><h2>{{row.hs_name}}</h2></a>
+                            <p>{{row.description}}</p>
+                            
+                            <div class="hs-cta-wrapper"><a href="{{ request.path }}/{{ row.hs_path }}" class="it_cta_button_next white">More</a></div>
+                        </div>
+                
+            {% endfor %}
         
             </div>
         </div>

+ 3 - 1
plugins/org.yakindu.sct.doc.user/src/website/p1.htmlf

@@ -24,6 +24,7 @@
                 counter-increment: h1 +{{dynamic_page_hubdb_row.chapter - 1}};
             }
         </style>
+        {#
         <script type="text/javascript" src="{{ get_public_template_url("custom/page/itemis/bootstrap-anchor.js") }}"></script>
         <script type="text/javascript">
         jQuery(document).ready(function() {
@@ -36,6 +37,7 @@
             jQuery('body').css('position', 'relative').scrollspy({target: "#sidebar-navigation", offset: 150});
         });
         </script>
+        #}
         
     {% elif dynamic_page_hubdb_table_id %}
         <link href="{{ get_public_template_url("Custom/page/itemis/it-yakindu-docs-overview.css") }}" rel="stylesheet" type="text/css">
@@ -102,7 +104,7 @@
     <div class="cell-wrapper layout-widget-wrapper">
     {% widget_block raw_html "module_150227904680399" wrapping_html='', per_widget_wrapper_html='', overrideable=true, label='Custom HTML' %}
     {% widget_attribute "value" %}<div id="sidebar-navigation">
-        <h2><span>Statechart User Guide</span> THEMES</h2>
+        <h2>${navigation.title}</h2>
         <nav>
             <ol class="nav">
 

+ 19 - 27
plugins/org.yakindu.sct.doc.user/src/website/p3.htmlf

@@ -24,9 +24,9 @@
         <div class="row-fluid-wrapper">
             <div class="row-fluid">
                 <div class="themes-container search span4">
-                    <h2>What's your problem?</h2>
-                    <p>Can't find what you're looking for?</p>
-                    <div id="navigation-search-form" data-cx="015950920325887884916:2e61oxlndni">
+                    <h2>Can't find what you're looking for?</h2>
+                    <p>Browse the whole documentation.</p>
+                    <div id="navigation-search-form" data-cx="015950920325887884916:nwstrxx2ycm">
                         <nav class="it-header__menu cf it-header__de hs-cta-wrapper">
                             <input data-id="it-header__search-input" placeholder="Type here." type="search"> <br /><br />
                             <a href="#" class="header-tools__search-icon it_cta_button_next white">search</a>
@@ -34,31 +34,23 @@
                     </div>
                 </div>
 
-        {% for row in hubdb_table_rows(dynamic_page_hubdb_table_id, "&chapter__gte=1&orderBy=chapter") %}
-            
-            {% if loop.index != 1 && loop.index % 3 == 0 %}
+            {% for row in hubdb_table_rows(dynamic_page_hubdb_table_id, "&chapter__gte=1&orderBy=chapter") %}
+                
+                {% if loop.index != 1 && loop.index % 3 == 0 %}
+                        </div>
                     </div>
-                </div>
-                <div class="row-fluid-wrapper">
-                    <div class="row-fluid">
-            {% endif %}
-            
-                    <div class="themes-container span4{% if row.pro_feature %} pro-feature{% endif %}">
-                        <a href="{{ request.path }}/{{ row.hs_path }}"><h2>{{row.hs_name}}</h2></a>
-                        <p>{{row.description}}</p>
-                        
-                        <div class="hs-cta-wrapper"><a href="{{ request.path }}/{{ row.hs_path }}" class="it_cta_button_next white">More</a></div>
-                    </div>
-            
-            
-            {% if loop.last && loop.index % 3 == 2 %}
-                    </div>
-                </div>
-                <div class="row-fluid-wrapper">
-                    <div class="row-fluid">
-            {% endif %}
-            
-        {% endfor %}
+                    <div class="row-fluid-wrapper">
+                        <div class="row-fluid">
+                {% endif %}
+                
+                        <div class="themes-container span4{% if row.pro_feature %} pro-feature{% endif %}">
+                            <a href="{{ request.path }}/{{ row.hs_path }}"><h2>{{row.hs_name}}</h2></a>
+                            <p>{{row.description}}</p>
+                            
+                            <div class="hs-cta-wrapper"><a href="{{ request.path }}/{{ row.hs_path }}" class="it_cta_button_next white">More</a></div>
+                        </div>
+                
+            {% endfor %}
         
             </div>
         </div>