1e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)// found in the LICENSE file.
4e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
5e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)/**
6e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) * @constructor
7e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) */
8e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)WebInspector.JSArticle = function()
9e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles){
10e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    /** @type {string} */
11e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    this.pageTitle;
12e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    /** @type {string} */
13e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    this.standardizationStatus;
147242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    /** @type {?WebInspector.WikiParser.Block} */
15e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    this.summary;
167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    /** @type {!Array.<!WebInspector.JSArticle.Parameter>} */
177242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    this.parameters = [];
187242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    /** @type {?WebInspector.JSArticle.Method} */
19e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    this.methods;
207242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    /** @type {?WebInspector.WikiParser.Block} */
21e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    this.remarks;
227242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    /** @type {!Array.<!WebInspector.JSArticle.Example>} */
237242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    this.examples = [];
247242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
257242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
267242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci/**
277242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci * @constructor
287242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci * @param {?WebInspector.WikiParser.Block} name
297242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci * @param {?WebInspector.WikiParser.Block} dataType
307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci * @param {?WebInspector.WikiParser.Block} optional
317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci * @param {?WebInspector.WikiParser.Block} description
327242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci */
337242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciWebInspector.JSArticle.Parameter = function(name, dataType, optional, description)
347242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    this.name = WebInspector.JSArticle.unfoldStringValue(name);
367242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    this.dataType = WebInspector.JSArticle.unfoldStringValue(dataType);
377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    var textContent = WebInspector.JSArticle.unfoldStringValue(optional);
387242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    this.optional = textContent ? textContent.toUpperCase() === "YES" : false;
397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    this.description = description;
407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
427242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci/**
437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci * @constructor
447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci * @param {?WebInspector.WikiParser.Block} language
457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci * @param {!WebInspector.WikiParser.Block} code
467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci * @param {?WebInspector.WikiParser.Block} liveUrl
477242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci * @param {?WebInspector.WikiParser.Block} description
487242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci */
497242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciWebInspector.JSArticle.Example = function(language, code, liveUrl, description)
507242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
517242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    this.language = WebInspector.JSArticle.unfoldStringValue(language);
527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    this.code = WebInspector.JSArticle.unfoldStringValue(code);
537242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    this.liveUrl = WebInspector.JSArticle.unfoldStringValue(liveUrl);
547242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    this.description = description;
557242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
567242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
577242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci/**
587242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci * @constructor
597242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci * @param {?WebInspector.WikiParser.Block} returnValueName
607242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci * @param {?WebInspector.WikiParser.Block} returnValueDescription
617242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci */
627242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciWebInspector.JSArticle.Method = function(returnValueName, returnValueDescription)
637242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
647242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    this.returnValueName = WebInspector.JSArticle.unfoldStringValue(returnValueName);
657242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    this.returnValueDescription = returnValueDescription;
667242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
677242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
687242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci/**
697242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci * @param {?WebInspector.WikiParser.Block} block
707242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci * @return {?string}
717242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci */
727242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciWebInspector.JSArticle.unfoldStringValue = function(block)
737242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
747242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (block && block.hasChildren() && block.children()[0].hasChildren())
757242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return block.children()[0].children()[0].text();
767242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return null;
77e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)}
78e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
79e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)/**
80e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) * @param {string} wikiMarkupText
81e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) * @return {!WebInspector.JSArticle}
82e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) */
83e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)WebInspector.JSArticle.parse = function(wikiMarkupText)
84e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles){
85e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    var wikiParser = new WebInspector.WikiParser(wikiMarkupText);
86e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    var wikiDocument = wikiParser.document();
87e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    var article = new WebInspector.JSArticle();
887242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    article.pageTitle = wikiDocument["Page_Title"];
897242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (typeof article.pageTitle !== "string")
907242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        delete article.pageTitle;
917242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    article.standardizationStatus = wikiDocument["Standardization_Status"];
927242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (article.standardizationStatus !== "string")
937242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        delete article.standardizationStatus;
947242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    var apiObjectMethod = wikiDocument["API_Object_Method"];
957242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (apiObjectMethod) {
967242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        var returnValueName = apiObjectMethod["Javascript_data_type"];
977242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        var returnValue = apiObjectMethod["Return_value_description"];
987242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        if (returnValueName && returnValue)
997242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            article.methods = new WebInspector.JSArticle.Method(returnValueName, returnValue);
1007242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
1017242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1027242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    article.remarks = wikiDocument["Remarks_Section"] ? wikiDocument["Remarks_Section"]["Remarks"] : null;
1037242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    article.summary = wikiDocument["Summary_Section"];
1047242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1057242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    var examples = wikiDocument["Examples_Section"] && wikiDocument["Examples_Section"]["Examples"] ? wikiDocument["Examples_Section"]["Examples"] : [];
1067242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (!Array.isArray(examples) && typeof examples !== "undefined")
1077242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        examples = [examples];
1087242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1097242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    for (var i = 0; i < examples.length; ++i) {
1107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        if (!examples[i].values)
1117242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            break;
1127242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        var language = examples[i].values["Language"];
1137242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        var code = examples[i].values["Code"];
1147242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        var liveUrl = examples[i].values["LiveURL"];
1157242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        var description = examples[i].values["Description"];
1167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        article.examples.push(new WebInspector.JSArticle.Example(language, code, liveUrl, description));
1177242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
1187242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1197242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    var parameters = apiObjectMethod ? apiObjectMethod["Parameters"] : [];
1207242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (!Array.isArray(parameters) && typeof parameters !== "undefined")
1217242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        parameters = [parameters];
1227242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1237242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    for (var i = 0; i < parameters.length; ++i) {
1247242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        if (!parameters[i].values)
1257242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            break;
1267242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        var name = parameters[i].values["Name"];
1277242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        var dataType = parameters[i].values["Data type"];
1287242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        var optional = parameters[i].values["Optional"];
1297242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        var description = parameters[i].values["Description"];
1307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        article.parameters.push(new WebInspector.JSArticle.Parameter(name, dataType, optional, description));
1317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
132e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
133e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    return article;
134e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)}
135