diff --git a/docker/Dockerfile.demo b/docker/Dockerfile.demo index 82487bf91b..2808bb55aa 100644 --- a/docker/Dockerfile.demo +++ b/docker/Dockerfile.demo @@ -64,3 +64,5 @@ COPY --from=war --chown=1001:0 target/openliberty-website-1.0-SNAPSHOT /config/a # This script will add the requested server configurations, apply any interim fixes and populate caches to # optimize runtime RUN configure.sh +ARG VERBOSE=true +ENV OPENJ9_SCC=false diff --git a/docker/Dockerfile.draft b/docker/Dockerfile.draft index 2336e537a8..090ba4fb7d 100644 --- a/docker/Dockerfile.draft +++ b/docker/Dockerfile.draft @@ -65,3 +65,5 @@ COPY --from=war --chown=1001:0 target/openliberty-website-1.0-SNAPSHOT /config/a # This script will add the requested server configurations, apply any interim fixes and populate caches to # optimize runtime RUN configure.sh +ARG VERBOSE=true +ENV OPENJ9_SCC=false diff --git a/scripts/build/javadoc_modify.sh b/scripts/build/javadoc_modify.sh index d538030085..611036ff00 100755 --- a/scripts/build/javadoc_modify.sh +++ b/scripts/build/javadoc_modify.sh @@ -3,6 +3,18 @@ modifyStylesheet () { # Append extra javadoc styling located in the css direcctory to the stylesheet.css located in the javadoc subdirectories cat src/main/content/antora_ui/src/css/javadoc-extended-stylesheet.css >> "$1" + # insert extra import to the beginning of the file + sed '1 i\ + @import url("https://fonts.googleapis.com/css?family=Asap:300,400,500"); + ' "$1" > newstylesheet.css + + mv newstylesheet.css "$1" +} + +modifyStylesheetFrameless () { + # Append extra javadoc styling located in the css direcctory to the stylesheet.css located in the javadoc api/spi subdirectories + cat src/main/content/antora_ui/src/css/javadoc-extended-stylesheet-frameless.css >> "$1" + # insert extra import to the beginning of the file sed '1 i\ @import url("https://fonts.googleapis.com/css?family=Asap:300,400,500"); @@ -25,10 +37,14 @@ modifyRedirect () { } export -f modifyStylesheet +export -f modifyStylesheetFrameless export -f modifySearch export -f modifyRedirect -find target/jekyll-webapp/docs -name stylesheet.css -exec bash -c 'modifyStylesheet {}' \; +find target/jekyll-webapp/docs -path "*microprofile*/stylesheet.css" -exec bash -c 'modifyStylesheet {}' \; +find target/jekyll-webapp/docs -path "*liberty-*/stylesheet.css" -exec bash -c 'modifyStylesheet {}' \; +find target/jekyll-webapp/docs -path "*io.openliberty*/stylesheet.css" -exec bash -c 'modifyStylesheetFrameless {}' \; +find target/jekyll-webapp/docs -path "*com.ibm.websphere.appserver*/stylesheet.css" -exec bash -c 'modifyStylesheetFrameless {}' \; find target/jekyll-webapp/docs -name search.js -exec bash -c 'modifySearch {}' \; find target/jekyll-webapp/docs -name script.js -exec bash -c 'modifyRedirect {}' \; diff --git a/src/main/content/antora_ui/src/css/javadoc-extended-stylesheet-frameless.css b/src/main/content/antora_ui/src/css/javadoc-extended-stylesheet-frameless.css new file mode 100644 index 0000000000..ba9cc935dd --- /dev/null +++ b/src/main/content/antora_ui/src/css/javadoc-extended-stylesheet-frameless.css @@ -0,0 +1,281 @@ +/******************************************************************************* + * Copyright (c) 2023 IBM Corporation 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 + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +/* + * Since this is a separate section to override the existing or adding new stylings to javadoc, it is sometimes + * necessary to put in existing styling again here so that the intended styling would not be overriden by the ones + * provided in this section. + * + * A combined css file will be created using the original stylesheet.css + this css with the extended styling + * appended to the end of the combined file. + */ +body { + background-color: white; + font-family: Asap, 'DejaVu Sans', Arial, Helvetica, sans-serif; } + +#javadoc_container { + height: 100%; } + +a[target="packageFrame"], +a[target="classFrame"] { + font-size: 14px; + color: #5d6a8e; + letter-spacing: 0; + line-height: 24px; } + +h1 { + font-family: BunueloLight, Arial Narrow, Helvetica, Arial; } + +h2 { + font-family: BunueloBold, Arial Narrow, Helvetica, Arial; } + +.table-header { + font-family: BunueloBold, Arial Narrow, Helvetica, Arial; + font-size: 11px; } + +th > a { + font-weight: 500; + font-size: 14px; } + +main { + padding-left: 0px; + padding-top: 96px } + +.bar a, .bar a:link, .bar a:visited, .bar a:active { + color: black; + text-transform: none; } + +.bar { + border-top: 1px solid #D4D7E3; + padding: 20px 0px 0px 8px; + margin: 20px 10px 5px 0px; + font-family: BunueloBold, Arial Narrow, Helvetica, Arial; + font-size: 14px; + color: #313653; + text-transform: uppercase; + background-color: white; } + +.top-nav { + background-color: #f1f4fe; + color: #5E6B8D; + height: 52px; + font-size: 16px; + padding-top: 0px; } + +/* open a standalone with no frame to check the top and bottom: All Classes is displayed but nothing else */ +.bottom-nav { + display: none; } + +.sub-nav { + background-color: unset; + float: unset; + overflow: unset; + width: unset; + font-size: unset; } + +/* this is used in the header of the right frame too - Start of Top navbar */ +.sub-nav .nav-list { + display: none; } + +.sub-nav .nav-list:nth-of-type(2) { + display: none; } + +.sub-nav div { + display: none; + /* Hide the Summary sub-nav filters from javadoc */ } + +/* used in Start of Top NavBar with display: none */ +ul.nav-list, ul.sub-nav-list { + display: table; + height: 100%; } + +/* All Classes at the top in a standalone with no frame */ +ul.nav-list li { + display: table-cell; + vertical-align: middle; + text-align: center; + padding: 0px 22px; + font-size: 16px; + font-weight: 500; + float: none; } + +/* doesn't seem to pick up this on focus */ +.clickableNavListTab, ul.nav-list li:focus { + background-color: #D6D9E4; + color: #253441; } + +.clickableNavListTab:hover { + cursor: pointer; } + +ul.nav-list li > a:hover { + color: inherit; } + +ul.nav-list-search { + margin: 5px 14px 0 0; } + +ul.nav-list-search li label, ul.nav-list-search li span { + display: none; } + +.top-nav a:link, .top-nav a:active, .top-nav a:visited, .bottom-nav a:link, .bottom-nav a:active, .bottom-nav a:visited { + color: #5E6B8D; + font-weight: 500; } + +.nav-bar-cell1-rev { + background-color: #D6D9E4; } + +.indexNav { + display: none; } + +ul.block-list ul.block-list ul.block-list li.block-list h3 { + background-color: #C8CCD8; } + +#all-packages-table tr:nth-child(1):not(.even-row-color) { + font-family: BunueloBold, Arial Narrow, Helvetica, Arial; } + +/* +#all-packages-table .summary-table .table-header { + padding-top: 20px; + padding-bottom: 0px; }*/ + +#all-packages-table .caption span, #class-summary .caption span, .field-summary .caption span, #related-package-summary .caption span, .details .caption span, #interface .caption span, #field .caption span, #method .caption span, .constructor-summary .caption span, .nested-class-summary .caption span, +.caption span, +div.table-tabs > button { + background-color: #D6D9E4; + font-family: BunueloLight, Arial Narrow, Helvetica, Arial; + font-size: 35px; + height: auto; } + +#method-summary-table .table-tabs { + padding-top: 0px; +} + +.table-tabs button.active-table-tab { + background-color: #D6D9E4; + height: auto; } + +.table-tabs button.table-tab { + height: auto; } + +div.table-tabs > button.active-table-tab { + background-color: #D6D9E4; } + +.table-header.col-first, .table-header.col-second, .table-header.col-last, .col-constructor-name, +.col-first, .col-second, .col-last { + vertical-align: middle; + /* override top in the original css */ } + +.col-first, .col-second, .col-last, .col-constructor-name { + background: #C8CCD8; + padding: 0px 3px 0px 7px; } + +.col-first, .table-header.col-first { + font-size: 14px; } + +/* Has to provide the same font-size here as the original otherwise th[scope='col'] will override the font-size */ +.col-second, .table-header.col-second, .col-last, .col-constructor-name, .table-header.col-last { + font-size: 13px; } + +.constantsSummary th, .packagesSummary th { + font-size: 13px; } + +#all-packages-table .col-first, #all-packages-table .col-second, #all-packages-table .col-last { +/*#method-summary-table .col-first, #method-summary-table .col-second, #method-summary-table .col-last, #method-summary-table .col-constructor-name, +.constructor-summary .col-first, .constructor-summary .col-second, .constructor-summary .col-last, .constructor-summary .ol-constructor-name {*/ + height: 45px; + padding-left: 49px; + padding-top: 20px; + padding-bottom: 0px; + vertical-align: middle; } + +/* has to copy over this styling from the original css, otherwise th.col-first background is picked up */ +.even-row-color, .even-row-color th { + background-color: #FFFFFF; } + +.odd-row-color, .odd-row-color th { + background-color: #EEEFF3; } + +div.block { + font-family: Asap, 'DejaVu Serif', Georgia, "Times New Roman", Times, serif; } + +.leftTop { + height: 45%; + transition: height 0.5s; + border-right: none; + border-bottom: none; } + +.leftBottom { + height: 55%; + transition: height 0.5s; + border-right: none; + border-top: none; } + +.rightContainer { + border-left: none; } + +.sticky { + position: fixed; + top: 0; + width: 100%; + background: white; + z-index: 1; + margin-top: 0px; + /* get rid of the user agent stylesheet margin temporarily */ } + +.sticky::before { + content: ' '; + position: absolute; + top: 20px; + /* This value will be replaced with a calculated value during scrolling */ + left: 0px; + right: 00px; + bottom: 0px; + border-top: 0px solid transparent; + /* This value will be replaced with the same border-top from the frame during scrolling */ + z-index: -1; } + +ul.ui-autocomplete { + font-family: Asap; } + +#search { + background-position: 2px 5px; + padding: 5px 5px 5px 20px; } + +#reset { + left: -5px; } + +.leftFrameHeaderStyling { + border-top: 3px solid #d9d9d9; + padding-top: 30px; } + +/* Custom expand/collapse button */ +div.toggle { + width: 11px; + margin-right: 10px; + margin-top: -1px; + float: left; } + +/* Minus toggle svg */ +div.toggle[collapsed='false'] { + margin-top: -5px; } + +div.toggle:hover { + cursor: pointer; } + +input[type='checkbox'] { + display: none; } + +label { + cursor: pointer; + float: left !important; + /* Overrides the inline float left */ } + +.header { + margin: 0; +} diff --git a/src/main/content/antora_ui/src/js/06-javadocs.js b/src/main/content/antora_ui/src/js/06-javadocs.js index 2546de5a5b..2fd0a083b7 100644 --- a/src/main/content/antora_ui/src/js/06-javadocs.js +++ b/src/main/content/antora_ui/src/js/06-javadocs.js @@ -15,6 +15,7 @@ var DEFAULT_PACKAGE_HTML = "allclasses-frame.html"; var DEFAULT_CLASS_HTML = "overview-summary.html"; var PACKAGE_PARAM = "package"; var CLASS_PARAM = "class"; +var FRAMELESS_DEFAULT_PACKAGE_HTML = "allclasses.html"; var defaultHtmlRootPath = ""; var defaultPackageHtml = ""; @@ -248,6 +249,9 @@ function addLeftFrameScrollListener(frameToListen, frameElementToListen) { var frame = $("#javadoc_container") .contents() .find(frameToListen); + if (frame.length === 0) { + return; + } var frameHeader = frame.contents().find(frameElementToListen); var packagesList = frame .contents() @@ -365,7 +369,7 @@ function addNavHoverListener() { // Returns a json object with the package and class from the url function parseQueryParams() { var targetPage = {}; - var queryParams = window.location.search; + var queryParams = window.location.search; if (queryParams && queryParams !== undefined) { queryParams = queryParams.substring(1); // Remove the '?' var splitQueryParams = queryParams.split("&"); @@ -392,14 +396,28 @@ function parseQueryParams() { function setDynamicIframeContent() { // setup the default html path if (defaultPackageHtml === "") { - var alocation = $("#javadoc_container") + var container = $("#javadoc_container"); + var isFrameless = container.contents().find('iframe').length === 0; + var alocation; + if (isFrameless) { + alocation = container.contents().attr('location'); + } else { + alocation = container .contents() .find(".leftTop iframe") .contents() .attr("location"); - defaultHtmlRootPath = getJavaDocHtmlPath(alocation.href, true); - defaultPackageHtml = defaultHtmlRootPath + DEFAULT_PACKAGE_HTML; - defaultClassHtml = defaultHtmlRootPath + DEFAULT_CLASS_HTML; + } + + if (alocation) { + defaultHtmlRootPath = getJavaDocHtmlPath(alocation.href, true); + defaultClassHtml = defaultHtmlRootPath + DEFAULT_CLASS_HTML; + if (isFrameless) { + defaultPackageHtml = defaultHtmlRootPath + FRAMELESS_DEFAULT_PACKAGE_HTML; + } else { + defaultPackageHtml = defaultHtmlRootPath + DEFAULT_PACKAGE_HTML; + } + } } var targetPage = parseQueryParams(); @@ -427,7 +445,8 @@ function updateTitle(currentPage) { } function addClickListeners() { - var iframes = $("#javadoc_container") + var main_frame = $("#javadoc_container"); + var iframes = main_frame .contents() .find("iframe"); @@ -442,6 +461,7 @@ function addClickListener(contents) { var iframeName = CLASS_FRAME; var paramKey = CLASS_PARAM; var href = e.target.href; + if (e.target.target === undefined) { // handling // @@ -452,7 +472,7 @@ function addClickListener(contents) { // ... // if (e.target.parentNode.localName === "a") { - href = e.target.parentNode.href; + href = e.target.parentNode.href; // This is when a click happens in the contents instead of one of the tabs in the javadoc. if (e.target.parentNode.target === "packageFrame") { iframeName = PACKAGE_FRAME; paramKey = PACKAGE_PARAM; @@ -480,6 +500,7 @@ function addClickListener(contents) { // provide state data to be used by the popstate event to render the frame contents var state = {}; state[iframeName] = href; + var otherQueryParamsContent = getRemainingQueryParam(queryParams, paramKey); testObject = otherQueryParamsContent; for (key in otherQueryParamsContent) { @@ -536,15 +557,17 @@ function setPackageContainerHeight() { function setIFrameContent(iframeName, href) { window.onpopstate = (e) => { popStateOrPageRefresh(); - }; if(iFrameClicked == false) { popStateOrPageRefresh(); } - var iframeContent = $("#javadoc_container") - .contents() + + var iframeContent = $("#javadoc_container").contents() .find(iframeName) .contents(); + if (iframeContent.length === 0) { + return; + } var errorhref = "/docs/ref/javadocs/doc-404.html"; // get current version to create path to all classes frame var path = window.top.location.pathname; @@ -554,12 +577,14 @@ function setIFrameContent(iframeName, href) { "/javadocs/microprofile-" + currentVersion + "-javadoc/allclasses-frame.html"; - } else { + } else if (path.includes("liberty-javaee")) { var currentVersion = path.slice(-2, -1); var allClassesHref = "/javadocs/liberty-javaee" + currentVersion + "-javadoc/allclasses-frame.html"; + } else { + var allClassesHref = defaultPackageHtml; } // check if href results in 404 and redirect to doc-404.html if it does @@ -646,6 +671,7 @@ function getJavaDocHtmlPath(href, returnBase) { } else { javaDocPath = groups[2]; } + console.log(javadocPath); } catch (e) {} return javaDocPath; } @@ -678,6 +704,7 @@ function getDocInfo(iframe_src) { } else { // Should never happen doc_version = 0; + doc_type = 0; } return {version: doc_version, type: doc_type}; } @@ -712,7 +739,6 @@ function getLibertyVersionFromUrl() { } function modifyPackageTopLinks() { - var iframe_src = $("#javadoc_container").attr("src").toLowerCase(); var liberty_version = getLibertyVersionFromUrl(); // e.g. 21.0.0.12 var doc = getDocInfo(iframe_src); @@ -772,11 +798,57 @@ function replaceCanonicalUrl(url) { canonicalTag.href = newCanonicalUrl; } +function setFramelessQueryParams(){ + var mainFrame = $('#javadoc_container'); + var isFrameless = mainFrame.contents().find('iframe').length === 0; + if (isFrameless) { + var alocation = mainFrame.contents().attr('location').href; + //var origin = window.location.origin; + alocation = alocation.substring(origin.length); + // remove /docs/modules/reference/ + if (alocation.indexOf('/docs/modules/reference/') === 0) { + alocation = alocation.substring(24); + } + + var newURL = new URL(window.location.href); + var queryParams = newURL.searchParams; + queryParams.set('path', alocation); + var search = window.location.search; + var hash = window.location.hash; + var newURL = window.location.href.replace(search, '').replace(hash, '') + '?' + decodeURIComponent(queryParams.toString()); + window.history.pushState({}, null, newURL); + } +} + +// Load the frameless javadoc location if the javadocPath query parameter does not match the existing iframe src +function loadJavadocFromUrl(){ + var mainFrame = $('#javadoc_container'); + var isFrameless = mainFrame.contents().find('iframe').length === 0; + if(isFrameless){ + var search = window.location.search; + var params = new URLSearchParams(search); + //var old_query_params = parseQueryParams(); + var javadocPath = encodeURI(params.get('path')); + var tempJavadocPath = javadocPath; + // add back /docs/modules/reference/ + if (!javadocPath.startsWith('/docs/modules/reference/')) { + tempJavadocPath = "/docs/modules/reference/" + javadocPath; + } + if (!(javadocPath === null || javadocPath === "null" || javadocPath === "")) { + if (mainFrame[0].contentWindow.location.href !== tempJavadocPath) { + mainFrame[0].src = tempJavadocPath; + } + } + } +} + $(document).ready(function() { iFrameClicked = false; $(window).on("resize", function() { resizeJavaDocWindow(); }); + + loadJavadocFromUrl(); $("#javadoc_container").on("load", function() { resizeJavaDocWindow(); @@ -789,6 +861,7 @@ $(document).ready(function() { addClickListeners(); addiPadScrolling(); highlightTOC(".leftTop iframe"); + setFramelessQueryParams(); $("#javadoc_container") .contents() @@ -827,13 +900,24 @@ $(document).ready(function() { .contents() .find(".leftTop iframe") .ready(function() { - modifyPackageTopLinks(); + var mainFrame = $('#javadoc_container'); + var isFrameless = mainFrame.contents().find('iframe').length === 0; + if(!isFrameless){ + modifyPackageTopLinks(); + } }); setDynamicIframeContent(); window.onpopstate = function(event) { if (event.state) { + var mainfr = $("#javadoc_container"); + var isFrameless = mainfr.contents().find('iframe').length === 0; + if (isFrameless) { + if (window.history) { + window.history.back(); + } + } $.each(event.state, function(key, value) { setIFrameContent(key, value); }); diff --git a/src/main/content/antora_ui/src/layouts/javadoc.hbs b/src/main/content/antora_ui/src/layouts/javadoc.hbs index 60e9ab85d0..ad530f675c 100644 --- a/src/main/content/antora_ui/src/layouts/javadoc.hbs +++ b/src/main/content/antora_ui/src/layouts/javadoc.hbs @@ -1,7 +1,7 @@ -{{> head defaultPageTitle="Untitled"}} +{{> head defaultPageTitle="Javadoc"}} {{#if site.keys.googleAnalytics}} diff --git a/src/main/content/antora_ui/src/sass/javadoc-extended-stylesheet.scss b/src/main/content/antora_ui/src/sass/javadoc-extended-stylesheet.scss index 9f213bb645..1274eba6ec 100644 --- a/src/main/content/antora_ui/src/sass/javadoc-extended-stylesheet.scss +++ b/src/main/content/antora_ui/src/sass/javadoc-extended-stylesheet.scss @@ -395,4 +395,8 @@ input[type='checkbox'] { label { cursor: pointer; float: left !important; /* Overrides the inline float left */ +} + +.header { + margin: 0; } \ No newline at end of file diff --git a/src/main/content/antora_ui/src/sass/nav.scss b/src/main/content/antora_ui/src/sass/nav.scss index e7059f4d73..bfe7b7a7fa 100644 --- a/src/main/content/antora_ui/src/sass/nav.scss +++ b/src/main/content/antora_ui/src/sass/nav.scss @@ -239,6 +239,9 @@ html.is-clipped--nav { margin-left: calc( -1 * (var(--TOC-indention-first-level) + var(--TOC-indention)) ); + margin-right: calc( + -1 * (var(--TOC-indention-first-level) + var(--TOC-indention)) + ); padding-left: calc( var(--TOC-indention-first-level) + var(--TOC-indention) - var(--TOC-orange-border-width) @@ -255,6 +258,9 @@ html.is-clipped--nav { margin-left: calc( -1 * (var(--TOC-indention-first-level) + 2 * var(--TOC-indention)) ); + margin-right: calc( + -1 * (var(--TOC-indention-first-level) + 2 * var(--TOC-indention)) + ); padding-left: calc( var(--TOC-indention-first-level) + 2 * var(--TOC-indention) - var(--TOC-orange-border-width) @@ -271,6 +277,9 @@ html.is-clipped--nav { margin-left: calc( -1 * (var(--TOC-indention-first-level) + 3 * var(--TOC-indention)) ); + margin-right: calc( + -1 * (var(--TOC-indention-first-level) + 3 * var(--TOC-indention)) + ); padding-left: calc( var(--TOC-indention-first-level) + 3 * var(--TOC-indention) - var(--TOC-orange-border-width) @@ -287,6 +296,9 @@ html.is-clipped--nav { margin-left: calc( -1 * (var(--TOC-indention-first-level) + 4 * var(--TOC-indention)) ); + margin-right: calc( + -1 * (var(--TOC-indention-first-level) + 4 * var(--TOC-indention)) + ); padding-left: calc( var(--TOC-indention-first-level) + 4 * var(--TOC-indention) - var(--TOC-orange-border-width)