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 17c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#include <iostream> 18c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#include <sstream> 19c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 20c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#include "Generator.h" 21c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#include "Specification.h" 22c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#include "Utilities.h" 23c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 24c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletusing namespace std; 25c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 26c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstruct DetailedFunctionEntry { 27c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet VersionInfo info; 28c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet string htmlDeclaration; 29c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}; 30c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 312217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouilletstatic const char OVERVIEW_HTML_FILE_NAME[] = "overview.html"; 322217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouilletstatic const char OVERVIEW_JD_FILE_NAME[] = "overview.jd"; 332217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouilletstatic const char INDEX_HTML_FILE_NAME[] = "index.html"; 342217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouilletstatic const char INDEX_JD_FILE_NAME[] = "index.jd"; 352217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet 362217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouilletstatic void writeHeader(GeneratedFile* file, bool forVerification, const string& title) { 372217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet if (forVerification) { 382217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet *file << "<!DOCTYPE html>\n"; 392217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet *file << "<!-- " << AUTO_GENERATED_WARNING << "-->\n"; 406386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet *file << "<html><head>\n" 416386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet "<title>RenderScript Reference</title>\n" 426386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet "<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>\n" 432217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet "<link rel='stylesheet' " 442217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet "href='http://fonts.googleapis.com/css?family=Roboto+Condensed'>\n" 452217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet "<link rel='stylesheet' href='http://fonts.googleapis.com/" 462217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet "css?family=Roboto:light,regular,medium,thin,italic,mediumitalic,bold' " 472217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet "title='roboto'>\n" 486386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet "<link href='default.css' rel='stylesheet' type='text/css'>\n" 496386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet "<link href='fullscreen.css' rel='stylesheet' class='fullscreen' " 502217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet "type='text/css'>\n" 516386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet "<body class='gc-documentation develop reference'>\n\n"; 522217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet *file << "<h1>" << title << "</h1>\n"; 532217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet } else { 542217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet *file << "page.title=RenderScript " << title << "\n\n"; 552217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet *file << "@jd:body\n\n"; 562217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet } 57918944e41306198807728ae3f05a1799773895c5Jean-Luc Brouillet *file << "<div class='renderscript'>\n"; 58c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet} 59c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 602217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouilletstatic void writeFooter(GeneratedFile* file, bool forVerification) { 61918944e41306198807728ae3f05a1799773895c5Jean-Luc Brouillet *file << "</div>\n"; 622217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet if (forVerification) { 636386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet *file << "</body></html>\n"; 642217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet } 65c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet} 66c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 67c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet// If prefix starts input, copy it to stream and remove it from input. 68c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstatic void skipPrefix(ostringstream* stream, string* input, const string& prefix) { 69c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet size_t size = prefix.size(); 70c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (input->compare(0, size, prefix) != 0) { 71c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return; 72c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 73c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet input->erase(0, size); 74c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *stream << prefix; 75c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet} 76c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 77c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet// Merge b into a. Returns true if successful 78c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstatic bool mergeVersionInfo(VersionInfo* a, const VersionInfo& b) { 79c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (a->intSize != b.intSize) { 80c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet cerr << "Error. We don't currently support versions that differ based on int size\n"; 81c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return false; 82c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 83c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (b.minVersion != 0 && a->maxVersion == b.minVersion - 1) { 84c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet a->maxVersion = b.maxVersion; 85c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } else if (b.maxVersion != 0 && a->minVersion == b.maxVersion + 1) { 86c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet a->minVersion = b.minVersion; 87c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } else { 88c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet cerr << "Error. This code currently assume that all versions are contiguous. Don't know " 89c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet "how to merge versions (" << a->minVersion << " - " << a->maxVersion << ") and (" 90c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet << b.minVersion << " - " << b.maxVersion << ")\n"; 91c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return false; 92c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 93c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return true; 94c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet} 95c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 96c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstatic string getHtmlStringForType(const ParameterDefinition& parameter) { 97c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet string s = parameter.rsType; 98c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet ostringstream stream; 99c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet skipPrefix(&stream, &s, "const "); 100c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet skipPrefix(&stream, &s, "volatile "); 101c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet bool endsWithAsterisk = s.size() > 0 && s[s.size() - 1] == '*'; 102c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (endsWithAsterisk) { 103c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet s.erase(s.size() - 1, 1); 104c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 105c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 106c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet string anchor = systemSpecification.getHtmlAnchor(s); 107c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (anchor.empty()) { 108c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // Not a RenderScript specific type. 109c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return parameter.rsType; 110c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } else { 111c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet stream << anchor; 112c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 113c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (endsWithAsterisk) { 114c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet stream << "*"; 115c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 116c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return stream.str(); 117c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet} 118c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 119c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstatic string getDetailedHtmlDeclaration(const FunctionPermutation& permutation) { 120c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet ostringstream stream; 121c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet auto ret = permutation.getReturn(); 122c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (ret) { 123c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet stream << getHtmlStringForType(*ret); 124c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } else { 125c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet stream << "void"; 126c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 127c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet stream << " " << permutation.getName() << "("; 128c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet bool needComma = false; 129c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet for (auto p : permutation.getParams()) { 130c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (needComma) { 131c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet stream << ", "; 132c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 133c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet stream << getHtmlStringForType(*p); 134c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (p->isOutParameter) { 135c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet stream << "*"; 136c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 137c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (!p->specName.empty()) { 138c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet stream << " " << p->specName; 139c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 140c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet needComma = true; 141c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 142c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet stream << ");\n"; 143c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return stream.str(); 144c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet} 145c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 146c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet/* Some functions (like max) have changed implementations but not their 147c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * declaration. We need to unify these so that we don't end up with entries 148c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * like: 149c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * char max(char a, char b); Removed from API level 20 150c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * char max(char a, char b); Added to API level 20 151c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet */ 152c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstatic bool getUnifiedFunctionPrototypes(Function* function, 153c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet map<string, DetailedFunctionEntry>* entries) { 154c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet for (auto f : function->getSpecifications()) { 155c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet DetailedFunctionEntry entry; 156c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet entry.info = f->getVersionInfo(); 157c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet for (auto p : f->getPermutations()) { 158c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet entry.htmlDeclaration = getDetailedHtmlDeclaration(*p); 159c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const string s = stripHtml(entry.htmlDeclaration); 160c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet auto i = entries->find(s); 161c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (i == entries->end()) { 162c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet entries->insert(pair<string, DetailedFunctionEntry>(s, entry)); 163c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } else { 164c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (!mergeVersionInfo(&i->second.info, entry.info)) { 165c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return false; 166c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 167c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 168c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 169c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 170c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return true; 171c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet} 172c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 173c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet// Convert words starting with @ into HTML references. Returns false if error. 174c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstatic bool convertDocumentationRefences(string* s) { 175c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet bool success = true; 176c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet size_t end = 0; 177c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet for (;;) { 178c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet size_t start = s->find('@', end); 179c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (start == string::npos) { 180c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet break; 181c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 182c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // Find the end of the identifier 183c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet end = start; 184c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet char c; 185c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet do { 186c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet c = (*s)[++end]; 187c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } while (isalnum(c) || c == '_'); 188c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 189c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const string id = s->substr(start + 1, end - start - 1); 190c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet string anchor = systemSpecification.getHtmlAnchor(id); 191c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (anchor.empty()) { 192c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet cerr << "Error: Can't convert the documentation reference @" << id << "\n"; 193c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet success = false; 194c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 195c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet s->replace(start, end - start, anchor); 196c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 197c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return success; 198c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet} 199c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 200c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstatic bool generateHtmlParagraphs(GeneratedFile* file, const vector<string>& description) { 201c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet bool inParagraph = false; 202c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet for (auto s : description) { 203c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // Empty lines in the .spec marks paragraphs. 204c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (s.empty()) { 205c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (inParagraph) { 206c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << "</p>\n"; 207c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet inParagraph = false; 208c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 209c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } else { 210c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (!inParagraph) { 211c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << "<p> "; 212c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet inParagraph = true; 213c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 214c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 215c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (!convertDocumentationRefences(&s)) { 216c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return false; 217c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 218c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << s << "\n"; 219c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 220c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (inParagraph) { 221c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << "</p>\n"; 222c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 223c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return true; 224c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet} 225c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 2264a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouilletstatic void writeSummaryTableStart(GeneratedFile* file, const string& label, bool labelIsHeading) { 227c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (labelIsHeading) { 2286386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet *file << "<h2 style='margin-bottom: 0px;'>" << label << "</h2>\n"; 229c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 2304a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *file << "<table class='jd-sumtable'><tbody>\n"; 231c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (!labelIsHeading) { 2324a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *file << " <tr><th colspan='2'>" << label << "</th></tr>\n"; 233c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 234c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet} 235c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 236c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstatic void writeSummaryTableEnd(GeneratedFile* file) { 237c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << "</tbody></table>\n"; 238c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet} 239c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 2404a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouilletenum DeprecatedSelector { 2414a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet DEPRECATED_ONLY, 2424a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet NON_DEPRECATED_ONLY, 2434a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet ALL, 2444a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet}; 2454a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet 2464a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouilletstatic void writeSummaryTableEntry(ostream* stream, Definition* definition, 2474a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet DeprecatedSelector deprecatedSelector) { 2484a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet if (definition->hidden()) { 249c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return; 250c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 2514a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet const bool deprecated = definition->deprecated(); 2524a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet if ((deprecatedSelector == DEPRECATED_ONLY && !deprecated) || 2534a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet (deprecatedSelector == NON_DEPRECATED_ONLY && deprecated)) { 254c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return; 255c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 2564a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet 2574a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *stream << " <tr class='alt-color api apilevel-1'>\n"; 2584a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *stream << " <td class='jd-linkcol'>\n"; 2592217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet *stream << " <a href='" << definition->getUrl() << "'>" << definition->getName() 2602217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet << "</a>\n"; 2614a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *stream << " </td>\n"; 2624a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *stream << " <td class='jd-descrcol' width='100%'>\n"; 2634a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *stream << " "; 2644a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet if (deprecated) { 2654a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *stream << "<b>Deprecated</b>. "; 2664a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet } 2674a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *stream << definition->getSummary() << "\n"; 2684a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *stream << " </td>\n"; 2694a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *stream << " </tr>\n"; 270c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet} 271c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 2724a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouilletstatic void writeSummaryTable(GeneratedFile* file, const ostringstream* entries, const char* name, 2734a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet DeprecatedSelector deprecatedSelector, bool labelAsHeader) { 2744a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet string s = entries->str(); 2754a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet if (!s.empty()) { 2764a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet string prefix; 2774a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet if (deprecatedSelector == DEPRECATED_ONLY) { 2784a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet prefix = "Deprecated "; 2794a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet } 2804a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet writeSummaryTableStart(file, prefix + name, labelAsHeader); 2814a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *file << s; 2824a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet writeSummaryTableEnd(file); 2834a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet } 284c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet} 285c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 286c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstatic void writeSummaryTables(GeneratedFile* file, const map<string, Constant*>& constants, 287c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const map<string, Type*>& types, 2884a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet const map<string, Function*>& functions, 2894a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet DeprecatedSelector deprecatedSelector, bool labelAsHeader) { 2904a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet ostringstream constantStream; 2914a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet for (auto e : constants) { 2924a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet writeSummaryTableEntry(&constantStream, e.second, deprecatedSelector); 293c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 2944a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet writeSummaryTable(file, &constantStream, "Constants", deprecatedSelector, labelAsHeader); 295c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 2964a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet ostringstream typeStream; 2974a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet for (auto e : types) { 2984a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet writeSummaryTableEntry(&typeStream, e.second, deprecatedSelector); 299c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 3004a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet writeSummaryTable(file, &typeStream, "Types", deprecatedSelector, labelAsHeader); 301c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 3024a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet ostringstream functionStream; 3034a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet for (auto e : functions) { 3044a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet writeSummaryTableEntry(&functionStream, e.second, deprecatedSelector); 305c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 3064a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet writeSummaryTable(file, &functionStream, "Functions", deprecatedSelector, labelAsHeader); 307c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet} 308c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 309ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hinesstatic void writeHtmlVersionTag(GeneratedFile* file, VersionInfo info, 310ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines bool addSpacing) { 3114a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet ostringstream stream; 312c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (info.intSize == 32) { 3134a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet stream << "When compiling for 32 bits. "; 314c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } else if (info.intSize == 64) { 3154a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet stream << "When compiling for 64 bits. "; 316c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 317c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 318c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (info.minVersion > 1 || info.maxVersion) { 319c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const char* mid = 320c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet "<a " 321c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet "href='http://developer.android.com/guide/topics/manifest/" 322c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet "uses-sdk-element.html#ApiLevels'>API level "; 323c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (info.minVersion <= 1) { 324c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // No minimum 325c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (info.maxVersion > 0) { 326ffc1710c382168e74386ef87d0101de65aca91b0Jean-Luc Brouillet stream << "Removed from " << mid << info.maxVersion + 1 << " and higher"; 327c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 328c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } else { 329c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (info.maxVersion == 0) { 330c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // No maximum 3314a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet stream << "Added in " << mid << info.minVersion; 332c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } else { 3334a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet stream << mid << info.minVersion << " - " << info.maxVersion; 334c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 335c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 3364a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet stream << "</a>"; 3374a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet } 338ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines string s = stream.str(); 339ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines // Remove any trailing whitespace 340ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines while (s.back() == ' ') { 341ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines s.pop_back(); 342ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines } 3434a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet if (!s.empty()) { 344ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines *file << (addSpacing ? " " : "") << s << "\n"; 345c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 346c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet} 347c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 34836e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouilletstatic void writeDetailedTypeSpecification(GeneratedFile* file, const TypeSpecification* spec) { 34936e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet switch (spec->getKind()) { 35036e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet case SIMPLE: { 35136e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet Type* type = spec->getType(); 35236e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet *file << "<p>A typedef of: " << spec->getSimpleType() 353ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines << makeAttributeTag(spec->getAttribute(), "", type->getDeprecatedApiLevel(), 35436e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet type->getDeprecatedMessage()) 3554a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet << " "; 356ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines writeHtmlVersionTag(file, spec->getVersionInfo(), false); 357ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines *file << "</p>\n"; 358ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines break; 359ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines } 360ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines case RS_OBJECT: { 361ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines *file << "<p>"; 362ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines writeHtmlVersionTag(file, spec->getVersionInfo(), false); 3634a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *file << "</p>\n"; 364c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet break; 36536e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet } 366c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet case ENUM: { 3674a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *file << "<p>An enum with the following values: \n"; 368ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines writeHtmlVersionTag(file, spec->getVersionInfo(), false); 3694a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *file << "</p>\n"; 370c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 3714a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *file << " <table class='jd-tagtable'><tbody>\n"; 37236e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet const vector<string>& values = spec->getValues(); 37336e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet const vector<string>& valueComments = spec->getValueComments(); 374c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet for (size_t i = 0; i < values.size(); i++) { 3754a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *file << " <tr><th>" << values[i] << "</th><td>"; 3764a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet if (valueComments.size() > i) { 3774a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *file << valueComments[i]; 378c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 3794a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *file << "</td></tr>\n"; 380c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 3814a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *file << " </tbody></table><br/>\n"; 382c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet break; 383c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 384c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet case STRUCT: { 3854a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *file << "<p>A structure with the following fields: "; 386ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines writeHtmlVersionTag(file, spec->getVersionInfo(), false); 3874a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *file << "</p>\n"; 3884a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet 3894a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *file << " <table class='jd-tagtable'><tbody>\n"; 39036e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet const vector<string>& fields = spec->getFields(); 39136e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet const vector<string>& fieldComments = spec->getFieldComments(); 392c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet for (size_t i = 0; i < fields.size(); i++) { 3934a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *file << " <tr><th>" << fields[i] << "</th><td>"; 394c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (fieldComments.size() > i && !fieldComments[i].empty()) { 3954a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *file << fieldComments[i]; 396c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 3974a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *file << "</td></tr>\n"; 398c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 3994a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *file << " </tbody></table><br/>\n"; 400c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet break; 401c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 402c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 403c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet} 404c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 4054a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouilletstatic void writeDetailedConstantSpecification(GeneratedFile* file, ConstantSpecification* c) { 4064a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *file << " <tr><td>"; 407c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << "Value: " << c->getValue() << "\n"; 408ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines writeHtmlVersionTag(file, c->getVersionInfo(), true); 4094a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *file << " </td></tr>\n"; 4104a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *file << "<br/>\n"; 411c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet} 412c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 413c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstatic bool writeOverviewForFile(GeneratedFile* file, const SpecFile& specFile) { 414c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet bool success = true; 415c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << "<h2>" << specFile.getBriefDescription() << "</h2>\n"; 416c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (!generateHtmlParagraphs(file, specFile.getFullDescription())) { 417c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet success = false; 418c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 419c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 420c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // Write the summary tables. 421c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // file << "<h2>Summary</h2>\n"; 4227c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet writeSummaryTables(file, specFile.getDocumentedConstants(), specFile.getDocumentedTypes(), 4234a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet specFile.getDocumentedFunctions(), NON_DEPRECATED_ONLY, false); 4244a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet 425c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return success; 426c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet} 427c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 4282217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouilletstatic bool generateOverview(const string& directory, bool forVerification) { 429c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet GeneratedFile file; 4302217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet if (!file.start(directory, forVerification ? OVERVIEW_HTML_FILE_NAME : OVERVIEW_JD_FILE_NAME)) { 431c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return false; 432c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 433c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet bool success = true; 434c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 4356386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet writeHeader(&file, forVerification, "Runtime API Reference"); 436c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 437c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet for (auto specFile : systemSpecification.getSpecFiles()) { 438c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (!writeOverviewForFile(&file, *specFile)) { 439c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet success = false; 440c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 441c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 442c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 4432217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet writeFooter(&file, forVerification); 444c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet file.close(); 445c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return success; 446c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet} 447c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 4482217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouilletstatic bool generateAlphabeticalIndex(const string& directory, bool forVerification) { 449c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet GeneratedFile file; 4502217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet if (!file.start(directory, forVerification ? INDEX_HTML_FILE_NAME : INDEX_JD_FILE_NAME)) { 451c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return false; 452c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 4532217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet writeHeader(&file, forVerification, "Index"); 454c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 455c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet writeSummaryTables(&file, systemSpecification.getConstants(), systemSpecification.getTypes(), 4564a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet systemSpecification.getFunctions(), NON_DEPRECATED_ONLY, true); 4574a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet 4584a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet writeSummaryTables(&file, systemSpecification.getConstants(), systemSpecification.getTypes(), 4594a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet systemSpecification.getFunctions(), DEPRECATED_ONLY, true); 460c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 4612217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet writeFooter(&file, forVerification); 462c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet file.close(); 463c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return true; 464c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet} 465c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 4664a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouilletstatic void writeDeprecatedWarning(GeneratedFile* file, Definition* definition) { 4674a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet if (definition->deprecated()) { 4684a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *file << " <p><b>Deprecated.</b> "; 4694a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet string s = definition->getDeprecatedMessage(); 4704a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet convertDocumentationRefences(&s); 4714a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet if (!s.empty()) { 4724a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *file << s; 4734a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet } else { 4744a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *file << "Do not use."; 4754a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet } 4764a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *file << "</p>\n"; 4774a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet } 4784a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet} 4794a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet 480c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstatic bool writeDetailedConstant(GeneratedFile* file, Constant* constant) { 481c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (constant->hidden()) { 482c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return true; 483c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 484c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const string& name = constant->getName(); 485c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 486918944e41306198807728ae3f05a1799773895c5Jean-Luc Brouillet *file << "<a name='android_rs:" << name << "'></a>\n"; 487c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << "<div class='jd-details'>\n"; 488c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " <h4 class='jd-details-title'>\n"; 489c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " <span class='sympad'>" << name << "</span>\n"; 490c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " <span class='normal'>: " << constant->getSummary() << "</span>\n"; 491c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " </h4>\n"; 492c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 493c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " <div class='jd-details-descr'>\n"; 494c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " <table class='jd-tagtable'><tbody>\n"; 4954a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet auto specifications = constant->getSpecifications(); 4964a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet bool addSeparator = specifications.size() > 1; 4974a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet for (auto spec : specifications) { 4984a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet if (addSeparator) { 4994a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *file << " <h5 class='jd-tagtitle'>Variant:</h5>\n"; 5004a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet } 5014a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet writeDetailedConstantSpecification(file, spec); 502c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 503c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " </tbody></table>\n"; 504c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " </div>\n"; 505c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 506c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " <div class='jd-tagdata jd-tagdescr'>\n"; 507c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 5084a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet writeDeprecatedWarning(file, constant); 509c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (!generateHtmlParagraphs(file, constant->getDescription())) { 510c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return false; 511c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 512c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " </div>\n"; 513c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 514c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << "</div>\n"; 515c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << "\n"; 516c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return true; 517c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet} 518c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 519c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstatic bool writeDetailedType(GeneratedFile* file, Type* type) { 520c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (type->hidden()) { 521c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return true; 522c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 523c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const string& name = type->getName(); 524c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 525918944e41306198807728ae3f05a1799773895c5Jean-Luc Brouillet *file << "<a name='android_rs:" << name << "'></a>\n"; 526c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << "<div class='jd-details'>\n"; 527c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " <h4 class='jd-details-title'>\n"; 528c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " <span class='sympad'>" << name << "</span>\n"; 529c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " <span class='normal'>: " << type->getSummary() << "</span>\n"; 530c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " </h4>\n"; 531c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 532c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " <div class='jd-details-descr'>\n"; 5334a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet for (auto spec : type->getSpecifications()) { 5344a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet writeDetailedTypeSpecification(file, spec); 535c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 536c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 5374a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet writeDeprecatedWarning(file, type); 538c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (!generateHtmlParagraphs(file, type->getDescription())) { 539c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return false; 540c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 541c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 5424a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *file << " </div>\n"; 543c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << "</div>\n"; 544c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << "\n"; 545c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return true; 546c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet} 547c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 548c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstatic bool writeDetailedFunction(GeneratedFile* file, Function* function) { 5496386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet if (function->hidden()) { 5506386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet return true; 5516386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet } 552c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const string& name = function->getName(); 553c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 554918944e41306198807728ae3f05a1799773895c5Jean-Luc Brouillet *file << "<a name='android_rs:" << name << "'></a>\n"; 555c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << "<div class='jd-details'>\n"; 556c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " <h4 class='jd-details-title'>\n"; 557c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " <span class='sympad'>" << name << "</span>\n"; 558c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " <span class='normal'>: " << function->getSummary() << "</span>\n"; 559c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " </h4>\n"; 560c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 561c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " <div class='jd-details-descr'>\n"; 562c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet map<string, DetailedFunctionEntry> entries; 563c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (!getUnifiedFunctionPrototypes(function, &entries)) { 564c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return false; 565c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 5664a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *file << " <table class='jd-tagtable'><tbody>\n"; 567c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet for (auto i : entries) { 568c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " <tr>\n"; 5694a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *file << " <td>" << i.second.htmlDeclaration << "</td>\n"; 570c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " <td>"; 571ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines writeHtmlVersionTag(file, i.second.info, true); 5724a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *file << " </td>\n"; 573c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " </tr>\n"; 574c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 575c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " </tbody></table>\n"; 576c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " </div>\n"; 577c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 578c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (function->someParametersAreDocumented()) { 579c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " <div class='jd-tagdata'>"; 580c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " <h5 class='jd-tagtitle'>Parameters</h5>\n"; 581c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " <table class='jd-tagtable'><tbody>\n"; 582c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet for (ParameterEntry* p : function->getParameters()) { 583c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " <tr><th>" << p->name << "</th><td>" << p->documentation << "</td></tr>\n"; 584c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 585c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " </tbody></table>\n"; 586c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " </div>\n"; 587c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 588c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 589c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet string ret = function->getReturnDocumentation(); 590c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (!ret.empty()) { 591c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " <div class='jd-tagdata'>"; 592c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " <h5 class='jd-tagtitle'>Returns</h5>\n"; 593c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " <table class='jd-tagtable'><tbody>\n"; 594c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " <tr><td>" << ret << "</td></tr>\n"; 595c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " </tbody></table>\n"; 596c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " </div>\n"; 597c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 598c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 599c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " <div class='jd-tagdata jd-tagdescr'>\n"; 6004a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet writeDeprecatedWarning(file, function); 601c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (!generateHtmlParagraphs(file, function->getDescription())) { 602c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return false; 603c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 604c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << " </div>\n"; 605c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 606c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << "</div>\n"; 607c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *file << "\n"; 608c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return true; 609c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet} 610c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 6112217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouilletstatic bool writeDetailedDocumentationFile(const string& directory, const SpecFile& specFile, 6122217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet bool forVerification) { 6132217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet if (!specFile.hasSpecifications()) { 6142217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet // This is true for rs_core.spec 6152217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet return true; 6162217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet } 6172217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet 618c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet GeneratedFile file; 6192217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet const string fileName = stringReplace(specFile.getSpecFileName(), ".spec", 6202217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet forVerification ? ".html" : ".jd"); 6212217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet if (!file.start(directory, fileName)) { 622c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return false; 623c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 624c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet bool success = true; 625c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 6262217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet string title = specFile.getBriefDescription(); 6272217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet writeHeader(&file, forVerification, title); 628c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 629c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet file << "<h2>Overview</h2>\n"; 630c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (!generateHtmlParagraphs(&file, specFile.getFullDescription())) { 631c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet success = false; 632c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 633c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 634c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // Write the summary tables. 635c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet file << "<h2>Summary</h2>\n"; 6367c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet const auto& constants = specFile.getDocumentedConstants(); 6377c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet const auto& types = specFile.getDocumentedTypes(); 6387c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet const auto& functions = specFile.getDocumentedFunctions(); 6394a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet 6404a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet writeSummaryTables(&file, constants, types, functions, NON_DEPRECATED_ONLY, false); 6414a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet writeSummaryTables(&file, constants, types, functions, DEPRECATED_ONLY, false); 642c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 643c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // Write the full details of each constant, type, and function. 644c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (!constants.empty()) { 645c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet file << "<h2>Constants</h2>\n"; 646c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet for (auto i : constants) { 647c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (!writeDetailedConstant(&file, i.second)) { 648c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet success = false; 649c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 650c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 651c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 652c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (!types.empty()) { 653c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet file << "<h2>Types</h2>\n"; 654c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet for (auto i : types) { 655c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (!writeDetailedType(&file, i.second)) { 656c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet success = false; 657c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 658c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 659c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 660c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (!functions.empty()) { 661c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet file << "<h2>Functions</h2>\n"; 662c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet for (auto i : functions) { 663c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (!writeDetailedFunction(&file, i.second)) { 664c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet success = false; 665c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 666c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 667c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 668c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 6692217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet writeFooter(&file, forVerification); 670c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet file.close(); 671c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 672c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (!success) { 673c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // If in error, write a final message to make it easier to figure out which file failed. 6742217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet cerr << fileName << ": Failed due to errors.\n"; 675c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 676c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return success; 677c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet} 678c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 6792217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouilletstatic void generateSnippet(GeneratedFile* file, const string& fileName, const string& title) { 6802217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet const char offset[] = " "; 6812217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet *file << offset << "<li><a href=\"<?cs var:toroot ?>guide/topics/renderscript/reference/" 6822217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet << fileName << "\">\n"; 6832217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet *file << offset << " <span class=\"en\">" << title << "</span>\n"; 6842217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet *file << offset << "</a></li>\n"; 6852217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet} 6862217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet 6872217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet/* Generate a partial file of links that should be cut & pasted into the proper section of the 6882217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet * guide_toc.cs file. 6892217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet */ 6902217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouilletstatic bool generateAndroidTableOfContentSnippet(const string& directory) { 6912217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet GeneratedFile file; 6922217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet if (!file.start(directory, "guide_toc.cs")) { 6932217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet return false; 6942217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet } 6952217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet file << "<!-- Copy and paste the following lines into the RenderScript section of\n"; 6962217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet file << " platform/frameworks/base/docs/html/guide/guide_toc.cs\n\n"; 6972217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet 6986386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet const char offset[] = " "; 6996386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet file << offset << "<li class=\"nav-section\">\n"; 7006386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet file << offset << " <div class=\"nav-section-header\">\n"; 7016386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet file << offset << " <a href=\"<?cs var:toroot ?>guide/topics/renderscript/reference/" << 7026386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet OVERVIEW_HTML_FILE_NAME << "\">\n"; 7036386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet file << offset << " <span class=\"en\">Runtime API Reference</span>\n"; 7046386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet file << offset << " </a></div>\n"; 7056386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet file << offset << " <ul>\n"; 7066386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet 7072217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet for (auto specFile : systemSpecification.getSpecFiles()) { 7082217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet if (specFile->hasSpecifications()) { 7092217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet const string fileName = stringReplace(specFile->getSpecFileName(), ".spec", ".html"); 7102217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet generateSnippet(&file, fileName, specFile->getBriefDescription()); 7112217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet } 7122217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet } 7132217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet generateSnippet(&file, INDEX_HTML_FILE_NAME, "Index"); 7146386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet 7156386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet file << offset << " </ul>\n"; 7166386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet file << offset << "</li>\n"; 7176386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet 7182217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet return true; 7192217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet} 7202217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet 7212217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouilletbool generateDocumentation(const string& directory, bool forVerification) { 7222217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet bool success = generateOverview(directory, forVerification) && 7232217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet generateAlphabeticalIndex(directory, forVerification) && 7242217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet generateAndroidTableOfContentSnippet(directory); 725c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet for (auto specFile : systemSpecification.getSpecFiles()) { 7262217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet if (!writeDetailedDocumentationFile(directory, *specFile, forVerification)) { 727c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet success = false; 728c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 729c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 730c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return success; 731c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet} 732