1c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet/* 2c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * Copyright (C) 2015 The Android Open Source Project 3c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * 4c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * Licensed under the Apache License, Version 2.0 (the "License"); 5c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * you may not use this file except in compliance with the License. 6c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * You may obtain a copy of the License at 7c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * 8c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * http://www.apache.org/licenses/LICENSE-2.0 9c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * 10c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * Unless required by applicable law or agreed to in writing, software 11c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * distributed under the License is distributed on an "AS IS" BASIS, 12c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * See the License for the specific language governing permissions and 14c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * limitations under the License. 15c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet */ 16c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 1732d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung#include <algorithm> 18c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#include <iostream> 19c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#include <sstream> 20c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 21c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#include "Generator.h" 22c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#include "Specification.h" 23c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#include "Utilities.h" 24c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 25c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletusing namespace std; 26c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 27c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstruct DetailedFunctionEntry { 28c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet VersionInfo info; 29c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet string htmlDeclaration; 30c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}; 31c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 322217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouilletstatic const char OVERVIEW_HTML_FILE_NAME[] = "overview.html"; 332217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouilletstatic const char INDEX_HTML_FILE_NAME[] = "index.html"; 3432d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung 3532d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sungstatic void writeHeader(GeneratedFile* file, const string& title, 3632d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung const SpecFile& specFile) { 3732d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung // Generate DevSite markups 3832d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung *file 3932d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung << "<html devsite>\n" 4032d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung "<!-- " << AUTO_GENERATED_WARNING << "-->\n" 4132d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung "<head>\n" 4232d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung " <title>RenderScript " << title << "</title>\n" 4332d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung " <meta name=\"top_category\" value=\"develop\" />\n" 4432d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung " <meta name=\"subcategory\" value=\"guide\" />\n" 4532d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung " <meta name=\"book_path\" value=\"/guide/_book.yaml\" />\n" 4632d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung " <meta name=\"project_path\" value=\"/guide/_project.yaml\" />\n"; 4732d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung auto desc = specFile.getFullDescription(); 4832d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung if (desc.size()) { 4932d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung *file << " <meta name=\"description\" content=\""; 5032d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung // Output only the first two lines. Assuming there's no other HTML 5132d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung // markups there 5232d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung // TODO: escape/remove markups 536e6b65617d3a779d939e7d6dd26663a898205ee3I-Jui (Ray) Sung for (unsigned int i = 0; i < std::min(desc.size(), 2UL); ++i) { 5432d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung if (i) *file << " "; 5532d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung *file << desc[i]; 5632d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung } 5732d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung *file << "…\">\n"; 582217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet } 5932d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung *file << "</head>\n\n" 6032d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung "<body>\n\n"; 61918944e41306198807728ae3f05a1799773895c5Jean-Luc Brouillet *file << "<div class='renderscript'>\n"; 62c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet} 63c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 6432d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sungstatic void writeFooter(GeneratedFile* file) { 65918944e41306198807728ae3f05a1799773895c5Jean-Luc Brouillet *file << "</div>\n"; 6632d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung *file << "\n\n</body>\n"; 6732d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung *file << "</html>\n"; 68c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet} 69c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 70c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet// If prefix starts input, copy it to stream and remove it from input. 71c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstatic void skipPrefix(ostringstream* stream, string* input, const string& prefix) { 72c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet size_t size = prefix.size(); 73c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (input->compare(0, size, prefix) != 0) { 74c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return; 75c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 76c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet input->erase(0, size); 77c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *stream << prefix; 78c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet} 79c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 80c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet// Merge b into a. Returns true if successful 81c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstatic bool mergeVersionInfo(VersionInfo* a, const VersionInfo& b) { 82c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (a->intSize != b.intSize) { 83c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet cerr << "Error. We don't currently support versions that differ based on int size\n"; 84c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return false; 85c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 86c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (b.minVersion != 0 && a->maxVersion == b.minVersion - 1) { 87c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet a->maxVersion = b.maxVersion; 88c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } else if (b.maxVersion != 0 && a->minVersion == b.maxVersion + 1) { 89c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet a->minVersion = b.minVersion; 90c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } else { 91c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet cerr << "Error. This code currently assume that all versions are contiguous. Don't know " 92c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet "how to merge versions (" << a->minVersion << " - " << a->maxVersion << ") and (" 93c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet << b.minVersion << " - " << b.maxVersion << ")\n"; 94c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return false; 95c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 96c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return true; 97c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet} 98c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 99c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstatic string getHtmlStringForType(const ParameterDefinition& parameter) { 100c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet string s = parameter.rsType; 101c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet ostringstream stream; 102c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet skipPrefix(&stream, &s, "const "); 103c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet skipPrefix(&stream, &s, "volatile "); 104c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet bool endsWithAsterisk = s.size() > 0 && s[s.size() - 1] == '*'; 105c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (endsWithAsterisk) { 106c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet s.erase(s.size() - 1, 1); 107c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 108c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 109c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet string anchor = systemSpecification.getHtmlAnchor(s); 110c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (anchor.empty()) { 111c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // Not a RenderScript specific type. 112c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return parameter.rsType; 113c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } else { 114c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet stream << anchor; 115c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 116c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (endsWithAsterisk) { 117c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet stream << "*"; 118c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 119c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return stream.str(); 120c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet} 121c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 122c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstatic string getDetailedHtmlDeclaration(const FunctionPermutation& permutation) { 123c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet ostringstream stream; 124c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet auto ret = permutation.getReturn(); 125c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (ret) { 126c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet stream << getHtmlStringForType(*ret); 127c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } else { 128c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet stream << "void"; 129c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 130c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet stream << " " << permutation.getName() << "("; 131c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet bool needComma = false; 132c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet for (auto p : permutation.getParams()) { 133c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (needComma) { 134c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet stream << ", "; 135c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 136c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet stream << getHtmlStringForType(*p); 137c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (p->isOutParameter) { 138c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet stream << "*"; 139c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 140c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (!p->specName.empty()) { 141c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet stream << " " << p->specName; 142c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 143c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet needComma = true; 144c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 145c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet stream << ");\n"; 146c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return stream.str(); 147c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet} 148c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 149c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet/* Some functions (like max) have changed implementations but not their 150c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * declaration. We need to unify these so that we don't end up with entries 151c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * like: 152c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * char max(char a, char b); Removed from API level 20 153c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * char max(char a, char b); Added to API level 20 154c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet */ 155c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstatic bool getUnifiedFunctionPrototypes(Function* function, 156c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet map<string, DetailedFunctionEntry>* entries) { 157c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet for (auto f : function->getSpecifications()) { 158c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet DetailedFunctionEntry entry; 159c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet entry.info = f->getVersionInfo(); 160c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet for (auto p : f->getPermutations()) { 161c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet entry.htmlDeclaration = getDetailedHtmlDeclaration(*p); 162c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const string s = stripHtml(entry.htmlDeclaration); 163c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet auto i = entries->find(s); 164c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (i == entries->end()) { 165c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet entries->insert(pair<string, DetailedFunctionEntry>(s, entry)); 166c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } else { 167c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (!mergeVersionInfo(&i->second.info, entry.info)) { 168c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return false; 169c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 170c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 171c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 172c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 173c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return true; 174c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet} 175c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 176c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet// Convert words starting with @ into HTML references. Returns false if error. 177c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstatic bool convertDocumentationRefences(string* s) { 178c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet bool success = true; 179c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet size_t end = 0; 180c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet for (;;) { 181c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet size_t start = s->find('@', end); 182c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (start == string::npos) { 183c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet break; 184c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 185c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // Find the end of the identifier 186c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet end = start; 187c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet char c; 188c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet do { 189c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet c = (*s)[++end]; 190c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } while (isalnum(c) || c == '_'); 191c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 192c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const string id = s->substr(start + 1, end - start - 1); 193c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet string anchor = systemSpecification.getHtmlAnchor(id); 194c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (anchor.empty()) { 195c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet cerr << "Error: Can't convert the documentation reference @" << id << "\n"; 196c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet success = false; 197c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 198c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet s->replace(start, end - start, anchor); 199c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 200c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return success; 201c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet} 202c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 203c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstatic bool generateHtmlParagraphs(GeneratedFile* file, const vector<string>& description) { 204c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet bool inParagraph = false; 205c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet for (auto s : description) { 206c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // Empty lines in the .spec marks paragraphs. 207c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (s.empty()) { 208c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (inParagraph) { 209c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << "</p>\n"; 210c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet inParagraph = false; 211c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 212c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } else { 213c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (!inParagraph) { 214c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << "<p> "; 215c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet inParagraph = true; 216c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 217c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 218c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (!convertDocumentationRefences(&s)) { 219c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return false; 220c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 221c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << s << "\n"; 222c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 223c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (inParagraph) { 224c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << "</p>\n"; 225c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 226c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return true; 227c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet} 228c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 2294a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouilletstatic void writeSummaryTableStart(GeneratedFile* file, const string& label, bool labelIsHeading) { 230c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (labelIsHeading) { 2316386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet *file << "<h2 style='margin-bottom: 0px;'>" << label << "</h2>\n"; 232c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 2334a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *file << "<table class='jd-sumtable'><tbody>\n"; 234c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (!labelIsHeading) { 2354a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *file << " <tr><th colspan='2'>" << label << "</th></tr>\n"; 236c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 237c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet} 238c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 239c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstatic void writeSummaryTableEnd(GeneratedFile* file) { 240c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << "</tbody></table>\n"; 241c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet} 242c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 2434a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouilletenum DeprecatedSelector { 2444a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet DEPRECATED_ONLY, 2454a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet NON_DEPRECATED_ONLY, 2464a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet ALL, 2474a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet}; 2484a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet 2494a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouilletstatic void writeSummaryTableEntry(ostream* stream, Definition* definition, 2504a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet DeprecatedSelector deprecatedSelector) { 2514a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet if (definition->hidden()) { 252c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return; 253c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 2544a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet const bool deprecated = definition->deprecated(); 2554a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet if ((deprecatedSelector == DEPRECATED_ONLY && !deprecated) || 2564a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet (deprecatedSelector == NON_DEPRECATED_ONLY && deprecated)) { 257c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return; 258c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 2594a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet 2604a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *stream << " <tr class='alt-color api apilevel-1'>\n"; 2614a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *stream << " <td class='jd-linkcol'>\n"; 2622217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet *stream << " <a href='" << definition->getUrl() << "'>" << definition->getName() 2632217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet << "</a>\n"; 2644a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *stream << " </td>\n"; 2654a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *stream << " <td class='jd-descrcol' width='100%'>\n"; 2664a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *stream << " "; 2674a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet if (deprecated) { 2684a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *stream << "<b>Deprecated</b>. "; 2694a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet } 2704a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *stream << definition->getSummary() << "\n"; 2714a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *stream << " </td>\n"; 2724a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *stream << " </tr>\n"; 273c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet} 274c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 2754a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouilletstatic void writeSummaryTable(GeneratedFile* file, const ostringstream* entries, const char* name, 2764a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet DeprecatedSelector deprecatedSelector, bool labelAsHeader) { 2774a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet string s = entries->str(); 2784a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet if (!s.empty()) { 2794a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet string prefix; 2804a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet if (deprecatedSelector == DEPRECATED_ONLY) { 2814a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet prefix = "Deprecated "; 2824a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet } 2834a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet writeSummaryTableStart(file, prefix + name, labelAsHeader); 2844a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *file << s; 2854a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet writeSummaryTableEnd(file); 2864a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet } 287c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet} 288c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 289c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstatic void writeSummaryTables(GeneratedFile* file, const map<string, Constant*>& constants, 290c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const map<string, Type*>& types, 2914a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet const map<string, Function*>& functions, 2924a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet DeprecatedSelector deprecatedSelector, bool labelAsHeader) { 2934a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet ostringstream constantStream; 2944a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet for (auto e : constants) { 2954a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet writeSummaryTableEntry(&constantStream, e.second, deprecatedSelector); 296c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 2974a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet writeSummaryTable(file, &constantStream, "Constants", deprecatedSelector, labelAsHeader); 298c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 2994a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet ostringstream typeStream; 3004a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet for (auto e : types) { 3014a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet writeSummaryTableEntry(&typeStream, e.second, deprecatedSelector); 302c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 3034a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet writeSummaryTable(file, &typeStream, "Types", deprecatedSelector, labelAsHeader); 304c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 3054a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet ostringstream functionStream; 3064a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet for (auto e : functions) { 3074a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet writeSummaryTableEntry(&functionStream, e.second, deprecatedSelector); 308c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 3094a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet writeSummaryTable(file, &functionStream, "Functions", deprecatedSelector, labelAsHeader); 310c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet} 311c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 312ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hinesstatic void writeHtmlVersionTag(GeneratedFile* file, VersionInfo info, 313ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines bool addSpacing) { 3144a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet ostringstream stream; 315c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (info.intSize == 32) { 3164a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet stream << "When compiling for 32 bits. "; 317c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } else if (info.intSize == 64) { 3184a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet stream << "When compiling for 64 bits. "; 319c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 320c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 321c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (info.minVersion > 1 || info.maxVersion) { 322c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const char* mid = 323c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet "<a " 324c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet "href='http://developer.android.com/guide/topics/manifest/" 325c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet "uses-sdk-element.html#ApiLevels'>API level "; 326c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (info.minVersion <= 1) { 327c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // No minimum 328c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (info.maxVersion > 0) { 329ffc1710c382168e74386ef87d0101de65aca91b0Jean-Luc Brouillet stream << "Removed from " << mid << info.maxVersion + 1 << " and higher"; 330c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 331c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } else { 332c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (info.maxVersion == 0) { 333c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // No maximum 3344a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet stream << "Added in " << mid << info.minVersion; 335c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } else { 3364a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet stream << mid << info.minVersion << " - " << info.maxVersion; 337c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 338c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 3394a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet stream << "</a>"; 3404a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet } 341ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines string s = stream.str(); 342ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines // Remove any trailing whitespace 343ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines while (s.back() == ' ') { 344ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines s.pop_back(); 345ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines } 3464a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet if (!s.empty()) { 347ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines *file << (addSpacing ? " " : "") << s << "\n"; 348c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 349c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet} 350c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 35136e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouilletstatic void writeDetailedTypeSpecification(GeneratedFile* file, const TypeSpecification* spec) { 35236e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet switch (spec->getKind()) { 35336e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet case SIMPLE: { 35436e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet Type* type = spec->getType(); 35536e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet *file << "<p>A typedef of: " << spec->getSimpleType() 356ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines << makeAttributeTag(spec->getAttribute(), "", type->getDeprecatedApiLevel(), 35736e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet type->getDeprecatedMessage()) 3584a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet << " "; 359ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines writeHtmlVersionTag(file, spec->getVersionInfo(), false); 360ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines *file << "</p>\n"; 361ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines break; 362ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines } 363ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines case RS_OBJECT: { 364ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines *file << "<p>"; 365ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines writeHtmlVersionTag(file, spec->getVersionInfo(), false); 3664a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *file << "</p>\n"; 367c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet break; 36836e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet } 369c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet case ENUM: { 3704a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *file << "<p>An enum with the following values: \n"; 371ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines writeHtmlVersionTag(file, spec->getVersionInfo(), false); 3724a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *file << "</p>\n"; 373c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 3744a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *file << " <table class='jd-tagtable'><tbody>\n"; 37536e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet const vector<string>& values = spec->getValues(); 37636e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet const vector<string>& valueComments = spec->getValueComments(); 377c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet for (size_t i = 0; i < values.size(); i++) { 3784a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *file << " <tr><th>" << values[i] << "</th><td>"; 3794a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet if (valueComments.size() > i) { 3804a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *file << valueComments[i]; 381c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 3824a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *file << "</td></tr>\n"; 383c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 3844a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *file << " </tbody></table><br/>\n"; 385c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet break; 386c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 387c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet case STRUCT: { 3884a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *file << "<p>A structure with the following fields: "; 389ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines writeHtmlVersionTag(file, spec->getVersionInfo(), false); 3904a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *file << "</p>\n"; 3914a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet 3924a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *file << " <table class='jd-tagtable'><tbody>\n"; 39336e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet const vector<string>& fields = spec->getFields(); 39436e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet const vector<string>& fieldComments = spec->getFieldComments(); 395c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet for (size_t i = 0; i < fields.size(); i++) { 3964a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *file << " <tr><th>" << fields[i] << "</th><td>"; 397c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (fieldComments.size() > i && !fieldComments[i].empty()) { 3984a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *file << fieldComments[i]; 399c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 4004a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *file << "</td></tr>\n"; 401c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 4024a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *file << " </tbody></table><br/>\n"; 403c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet break; 404c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 405c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 406c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet} 407c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 4084a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouilletstatic void writeDetailedConstantSpecification(GeneratedFile* file, ConstantSpecification* c) { 4094a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *file << " <tr><td>"; 410c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << "Value: " << c->getValue() << "\n"; 411ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines writeHtmlVersionTag(file, c->getVersionInfo(), true); 4124a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *file << " </td></tr>\n"; 4134a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *file << "<br/>\n"; 414c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet} 415c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 416c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstatic bool writeOverviewForFile(GeneratedFile* file, const SpecFile& specFile) { 417c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet bool success = true; 418c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << "<h2>" << specFile.getBriefDescription() << "</h2>\n"; 419c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (!generateHtmlParagraphs(file, specFile.getFullDescription())) { 420c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet success = false; 421c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 422c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 423c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // Write the summary tables. 424c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // file << "<h2>Summary</h2>\n"; 4257c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet writeSummaryTables(file, specFile.getDocumentedConstants(), specFile.getDocumentedTypes(), 4264a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet specFile.getDocumentedFunctions(), NON_DEPRECATED_ONLY, false); 4274a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet 428c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return success; 429c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet} 430c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 43132d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sungstatic bool generateOverview(const string& directory) { 432c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet GeneratedFile file; 43332d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung if (!file.start(directory, OVERVIEW_HTML_FILE_NAME)) { 434c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return false; 435c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 436c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet bool success = true; 437c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 43832d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung // Take the description from the first spec file (rs_core.spec, based on how 43932d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung // currently this generator is called) 44032d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung writeHeader(&file, "Runtime API Reference", 44132d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung *(systemSpecification.getSpecFiles()[0])); 442c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 443c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet for (auto specFile : systemSpecification.getSpecFiles()) { 444c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (!writeOverviewForFile(&file, *specFile)) { 445c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet success = false; 446c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 447c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 448c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 44932d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung writeFooter(&file); 450c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet file.close(); 451c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return success; 452c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet} 453c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 45432d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sungstatic bool generateAlphabeticalIndex(const string& directory) { 455c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet GeneratedFile file; 45632d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung if (!file.start(directory, INDEX_HTML_FILE_NAME)) { 457c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return false; 458c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 45932d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung writeHeader(&file, "Index", SpecFile("")); 460c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 461c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet writeSummaryTables(&file, systemSpecification.getConstants(), systemSpecification.getTypes(), 4624a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet systemSpecification.getFunctions(), NON_DEPRECATED_ONLY, true); 4634a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet 4644a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet writeSummaryTables(&file, systemSpecification.getConstants(), systemSpecification.getTypes(), 4654a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet systemSpecification.getFunctions(), DEPRECATED_ONLY, true); 466c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 46732d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung writeFooter(&file); 468c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet file.close(); 469c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return true; 470c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet} 471c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 4724a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouilletstatic void writeDeprecatedWarning(GeneratedFile* file, Definition* definition) { 4734a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet if (definition->deprecated()) { 4744a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *file << " <p><b>Deprecated.</b> "; 4754a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet string s = definition->getDeprecatedMessage(); 4764a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet convertDocumentationRefences(&s); 4774a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet if (!s.empty()) { 4784a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *file << s; 4794a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet } else { 4804a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *file << "Do not use."; 4814a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet } 4824a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *file << "</p>\n"; 4834a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet } 4844a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet} 4854a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet 486c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstatic bool writeDetailedConstant(GeneratedFile* file, Constant* constant) { 487c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (constant->hidden()) { 488c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return true; 489c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 490c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const string& name = constant->getName(); 491c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 492918944e41306198807728ae3f05a1799773895c5Jean-Luc Brouillet *file << "<a name='android_rs:" << name << "'></a>\n"; 493c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << "<div class='jd-details'>\n"; 494c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " <h4 class='jd-details-title'>\n"; 495c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " <span class='sympad'>" << name << "</span>\n"; 496c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " <span class='normal'>: " << constant->getSummary() << "</span>\n"; 497c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " </h4>\n"; 498c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 499c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " <div class='jd-details-descr'>\n"; 500c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " <table class='jd-tagtable'><tbody>\n"; 5014a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet auto specifications = constant->getSpecifications(); 5024a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet bool addSeparator = specifications.size() > 1; 5034a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet for (auto spec : specifications) { 5044a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet if (addSeparator) { 5054a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *file << " <h5 class='jd-tagtitle'>Variant:</h5>\n"; 5064a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet } 5074a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet writeDetailedConstantSpecification(file, spec); 508c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 509c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " </tbody></table>\n"; 510c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " </div>\n"; 511c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 512c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " <div class='jd-tagdata jd-tagdescr'>\n"; 513c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 5144a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet writeDeprecatedWarning(file, constant); 515c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (!generateHtmlParagraphs(file, constant->getDescription())) { 516c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return false; 517c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 518c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " </div>\n"; 519c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 520c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << "</div>\n"; 521c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << "\n"; 522c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return true; 523c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet} 524c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 525c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstatic bool writeDetailedType(GeneratedFile* file, Type* type) { 526c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (type->hidden()) { 527c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return true; 528c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 529c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const string& name = type->getName(); 530c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 531918944e41306198807728ae3f05a1799773895c5Jean-Luc Brouillet *file << "<a name='android_rs:" << name << "'></a>\n"; 532c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << "<div class='jd-details'>\n"; 533c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " <h4 class='jd-details-title'>\n"; 534c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " <span class='sympad'>" << name << "</span>\n"; 535c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " <span class='normal'>: " << type->getSummary() << "</span>\n"; 536c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " </h4>\n"; 537c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 538c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " <div class='jd-details-descr'>\n"; 5394a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet for (auto spec : type->getSpecifications()) { 5404a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet writeDetailedTypeSpecification(file, spec); 541c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 542c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 5434a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet writeDeprecatedWarning(file, type); 544c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (!generateHtmlParagraphs(file, type->getDescription())) { 545c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return false; 546c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 547c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 5484a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *file << " </div>\n"; 549c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << "</div>\n"; 550c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << "\n"; 551c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return true; 552c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet} 553c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 554c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstatic bool writeDetailedFunction(GeneratedFile* file, Function* function) { 5556386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet if (function->hidden()) { 5566386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet return true; 5576386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet } 558c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const string& name = function->getName(); 559c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 560918944e41306198807728ae3f05a1799773895c5Jean-Luc Brouillet *file << "<a name='android_rs:" << name << "'></a>\n"; 561c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << "<div class='jd-details'>\n"; 562c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " <h4 class='jd-details-title'>\n"; 563c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " <span class='sympad'>" << name << "</span>\n"; 564c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " <span class='normal'>: " << function->getSummary() << "</span>\n"; 565c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " </h4>\n"; 566c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 567c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " <div class='jd-details-descr'>\n"; 568c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet map<string, DetailedFunctionEntry> entries; 569c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (!getUnifiedFunctionPrototypes(function, &entries)) { 570c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return false; 571c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 5724a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *file << " <table class='jd-tagtable'><tbody>\n"; 573c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet for (auto i : entries) { 574c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " <tr>\n"; 5754a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *file << " <td>" << i.second.htmlDeclaration << "</td>\n"; 576c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " <td>"; 577ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines writeHtmlVersionTag(file, i.second.info, true); 5784a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *file << " </td>\n"; 579c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " </tr>\n"; 580c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 581c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " </tbody></table>\n"; 582c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " </div>\n"; 583c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 584c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (function->someParametersAreDocumented()) { 585c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " <div class='jd-tagdata'>"; 586c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " <h5 class='jd-tagtitle'>Parameters</h5>\n"; 587c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " <table class='jd-tagtable'><tbody>\n"; 588c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet for (ParameterEntry* p : function->getParameters()) { 589c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " <tr><th>" << p->name << "</th><td>" << p->documentation << "</td></tr>\n"; 590c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 591c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " </tbody></table>\n"; 592c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " </div>\n"; 593c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 594c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 595c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet string ret = function->getReturnDocumentation(); 596c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (!ret.empty()) { 597c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " <div class='jd-tagdata'>"; 598c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " <h5 class='jd-tagtitle'>Returns</h5>\n"; 599c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " <table class='jd-tagtable'><tbody>\n"; 600c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " <tr><td>" << ret << "</td></tr>\n"; 601c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " </tbody></table>\n"; 602c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " </div>\n"; 603c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 604c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 605c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " <div class='jd-tagdata jd-tagdescr'>\n"; 6064a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet writeDeprecatedWarning(file, function); 607c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (!generateHtmlParagraphs(file, function->getDescription())) { 608c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return false; 609c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 610c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " </div>\n"; 611c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 612c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << "</div>\n"; 613c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << "\n"; 614c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return true; 615c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet} 616c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 61732d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sungstatic bool writeDetailedDocumentationFile(const string& directory, 61832d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung const SpecFile& specFile) { 6192217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet if (!specFile.hasSpecifications()) { 6202217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet // This is true for rs_core.spec 6212217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet return true; 6222217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet } 6232217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet 624c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet GeneratedFile file; 6252217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet const string fileName = stringReplace(specFile.getSpecFileName(), ".spec", 62632d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung ".html"); 6272217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet if (!file.start(directory, fileName)) { 628c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return false; 629c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 630c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet bool success = true; 631c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 6322217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet string title = specFile.getBriefDescription(); 63332d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung writeHeader(&file, title, specFile); 634c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 635c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet file << "<h2>Overview</h2>\n"; 636c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (!generateHtmlParagraphs(&file, specFile.getFullDescription())) { 637c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet success = false; 638c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 639c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 640c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // Write the summary tables. 641c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet file << "<h2>Summary</h2>\n"; 6427c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet const auto& constants = specFile.getDocumentedConstants(); 6437c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet const auto& types = specFile.getDocumentedTypes(); 6447c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet const auto& functions = specFile.getDocumentedFunctions(); 6454a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet 6464a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet writeSummaryTables(&file, constants, types, functions, NON_DEPRECATED_ONLY, false); 6474a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet writeSummaryTables(&file, constants, types, functions, DEPRECATED_ONLY, false); 648c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 649c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // Write the full details of each constant, type, and function. 650c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (!constants.empty()) { 651c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet file << "<h2>Constants</h2>\n"; 652c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet for (auto i : constants) { 653c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (!writeDetailedConstant(&file, i.second)) { 654c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet success = false; 655c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 656c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 657c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 658c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (!types.empty()) { 659c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet file << "<h2>Types</h2>\n"; 660c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet for (auto i : types) { 661c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (!writeDetailedType(&file, i.second)) { 662c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet success = false; 663c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 664c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 665c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 666c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (!functions.empty()) { 667c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet file << "<h2>Functions</h2>\n"; 668c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet for (auto i : functions) { 669c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (!writeDetailedFunction(&file, i.second)) { 670c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet success = false; 671c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 672c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 673c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 674c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 67532d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung writeFooter(&file); 676c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet file.close(); 677c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 678c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (!success) { 679c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // If in error, write a final message to make it easier to figure out which file failed. 6802217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet cerr << fileName << ": Failed due to errors.\n"; 681c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 682c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return success; 683c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet} 684c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 6852217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouilletstatic void generateSnippet(GeneratedFile* file, const string& fileName, const string& title) { 6862217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet const char offset[] = " "; 6872217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet *file << offset << "<li><a href=\"<?cs var:toroot ?>guide/topics/renderscript/reference/" 6882217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet << fileName << "\">\n"; 6892217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet *file << offset << " <span class=\"en\">" << title << "</span>\n"; 6902217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet *file << offset << "</a></li>\n"; 6912217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet} 6922217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet 6932217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet/* Generate a partial file of links that should be cut & pasted into the proper section of the 6942217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet * guide_toc.cs file. 6952217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet */ 6962217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouilletstatic bool generateAndroidTableOfContentSnippet(const string& directory) { 6972217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet GeneratedFile file; 6982217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet if (!file.start(directory, "guide_toc.cs")) { 6992217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet return false; 7002217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet } 7012217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet file << "<!-- Copy and paste the following lines into the RenderScript section of\n"; 7022217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet file << " platform/frameworks/base/docs/html/guide/guide_toc.cs\n\n"; 7032217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet 7046386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet const char offset[] = " "; 7056386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet file << offset << "<li class=\"nav-section\">\n"; 7066386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet file << offset << " <div class=\"nav-section-header\">\n"; 7076386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet file << offset << " <a href=\"<?cs var:toroot ?>guide/topics/renderscript/reference/" << 7086386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet OVERVIEW_HTML_FILE_NAME << "\">\n"; 7096386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet file << offset << " <span class=\"en\">Runtime API Reference</span>\n"; 7106386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet file << offset << " </a></div>\n"; 7116386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet file << offset << " <ul>\n"; 7126386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet 7132217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet for (auto specFile : systemSpecification.getSpecFiles()) { 7142217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet if (specFile->hasSpecifications()) { 7152217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet const string fileName = stringReplace(specFile->getSpecFileName(), ".spec", ".html"); 7162217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet generateSnippet(&file, fileName, specFile->getBriefDescription()); 7172217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet } 7182217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet } 7192217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet generateSnippet(&file, INDEX_HTML_FILE_NAME, "Index"); 7206386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet 7216386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet file << offset << " </ul>\n"; 7226386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet file << offset << "</li>\n"; 7236386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet 7242217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet return true; 7252217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet} 7262217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet 72732d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sungbool generateDocumentation(const string& directory) { 72832d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung bool success = generateOverview(directory) && 72932d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung generateAlphabeticalIndex(directory) && 7302217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet generateAndroidTableOfContentSnippet(directory); 731c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet for (auto specFile : systemSpecification.getSpecFiles()) { 73232d3520f388756d384fb1a130fd1142b8481f190I-Jui (Ray) Sung if (!writeDetailedDocumentationFile(directory, *specFile)) { 733c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet success = false; 734c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 735c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 736c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return success; 737c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet} 738