Commit 655be0e8 authored by iliia@google.com's avatar iliia@google.com

DevTools: [Documentation] Update parser for WikiText

BUG=391593

Review URL: https://codereview.chromium.org/539353004

git-svn-id: svn://svn.chromium.org/blink/trunk@181901 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent 76fc0b6d
......@@ -11,12 +11,19 @@ function test()
function testWikiParser(next)
{
var testCases = [
"{{A|text=<code>it's not a code <code>}}",
"{{A|Code={{=}} }}",
"{{ABC|Array={{A|B=c}}{{X|y=Z}}|text=blabla}}",
"{{A|B=C}}",
"{{A|B={{C|D=blablabla}}}}",
"{{CS|Init=black|Values={{CSS Property Value\n|Data Type=color\n|Description=[[css/color|CSS color value]]}}\n}}",
"{{A|B={{C|D=bla}}|x=y}}",
"{{CS|Init=black|Values={{CSS Property Value\n|Data Type=color\n|Description= [[css/color|CSS color value]]}}\n}}",
"{{A}}",
"{{A|B=bla<a=c>bla}}",
"{{A}}",
"{{AbC|xyz \n \t \r}}"];
"{{A|B= [[google.com{{!}}Google]]}}",
"{{AbC|xyz \n\t \r}}",
"{{Table|there is a table {{{!}}\n}}",
"{{External_Attribution|MSDN_link=[http://msdn.microsoft.com/en-us/library/ie/ms536365(v=vs.85).aspx cloneNode Method]|HTML5Rocks_link=}}",
"{{JS_Syntax|Formats={{JS Syntax Format|Format='''JSON.stringify(''' value [ , replacer] [ , space] ''')'''}}\n}}"];
for (var i = 0; i < testCases.length; i++) {
var wikiParser = new WebInspector.WikiParser(testCases[i]);
InspectorTest.addResult("\"" + testCases[i].replace("\r", "\\r") + "\" is parsed");
......@@ -99,7 +106,7 @@ function test()
function testLinkInsideCode(next)
{
var linkInsideCode = "{{Summary_Section|<code> [[google.com|GOOGLE!]] < /code>}}";
var linkInsideCode = "{{Summary_Section|<code> [[google.com|GOOGLE!]] </code >}}";
var article = WebInspector.JSArticle.parse(linkInsideCode);
InspectorTest.addObject(article);
next();
......@@ -124,13 +131,16 @@ function test()
function testLinkWithoutSpace(next)
{
var linkWithoutSpaceTest = "{{Summary_Section|[[http://wrong.com|WRONG_LINK]]}}";
var article = WebInspector.JSArticle.parse(linkWithoutSpaceTest);
InspectorTest.addObject(article);
try {
var article = WebInspector.JSArticle.parse(linkWithoutSpaceTest);
InspectorTest.addObject(article);
} catch (error) {
InspectorTest.addResult("Expected error: " + error);
}
next();
}
]);
}
</script>
</head>
......
......@@ -166,6 +166,20 @@ String.prototype.escapeHTML = function()
return this.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;"); //" doublequotes just for editor
}
/**
* @return {string}
*/
String.prototype.unescapeHTML = function()
{
return this.replace(/&lt;/g, "<")
.replace(/&gt;/g, ">")
.replace(/&#58;/g, ":")
.replace(/&quot;/g, "\"")
.replace(/&#60;/g, "<")
.replace(/&#62;/g, ">")
.replace(/&amp;/g, "&");
}
/**
* @return {string}
*/
......
......@@ -22,6 +22,7 @@ WebInspector.DocumentationView.showDocumentationURL = function(url, searchItem)
if (!WebInspector.DocumentationView._view)
WebInspector.DocumentationView._view = new WebInspector.DocumentationView();
var view = WebInspector.DocumentationView._view;
view.element.removeChildren();
WebInspector.inspectorView.showCloseableViewInDrawer("documentation", WebInspector.UIString("Documentation"), view);
view.showDocumentation(url, searchItem);
}
......@@ -61,14 +62,19 @@ WebInspector.DocumentationView.prototype = {
return;
}
var wikiMarkupText = pages[wikiKeys[0]]["revisions"]["0"]["*"];
var article = WebInspector.JSArticle.parse(wikiMarkupText);
var article;
try {
article = WebInspector.JSArticle.parse(wikiMarkupText);
} catch (error) {
console.error("Article could not be parsed. " + error.message);
}
if (!article) {
this._createEmptyPage();
return;
}
var renderer = new WebInspector.DocumentationView.Renderer(article, searchItem);
this.element.removeChildren();
var renderer = new WebInspector.DocumentationView.Renderer(article, searchItem);
this.element.appendChild(renderer.renderJSArticle());
},
......@@ -171,7 +177,7 @@ WebInspector.DocumentationView.Renderer.prototype = {
if (i > 0)
signature.createTextChild(", ")
var parameterType = signature.createChild("span", "documentation-parameter-data-type-value");
parameterType.textContent = parameters[i].dataType + (parameters[i].optional ? "=" : "");;
parameterType.textContent = parameters[i].dataType + (parameters[i].optional ? "=" : "");
}
signature.createTextChild("): ");
var returnTypeElement = signature.createChild("span", "documentation-parameter-data-type-value");
......@@ -258,11 +264,11 @@ WebInspector.DocumentationView.Renderer.prototype = {
/**
* @param {!WebInspector.WikiParser.ArticleElement} article
* @return {!Element}
* @return {?Element}
*/
_renderBlock: function(article)
{
var element;
var element = null;
var elementTypes = WebInspector.WikiParser.ArticleElement.Type;
switch (article.type()) {
......@@ -288,14 +294,17 @@ WebInspector.DocumentationView.Renderer.prototype = {
if (article.isHighlighted())
element.classList.add("documentation-highlighted-text");
break;
default:
console.error("Unknown ArticleElement type " + article.type());
case elementTypes.Block:
element = document.createElement(article.hasBullet() ? "li" : "p");
break;
default:
console.error("Unknown ArticleElement type " + article.type());
return null;
}
if (article instanceof WebInspector.WikiParser.Block || article instanceof WebInspector.WikiParser.Inline) {
if (article.type() === WebInspector.WikiParser.ArticleElement.Type.Block
|| article.type() === WebInspector.WikiParser.ArticleElement.Type.Code
|| article.type() === WebInspector.WikiParser.ArticleElement.Type.Inline) {
for (var i = 0; i < article.children().length; ++i) {
var child = this._renderBlock(article.children()[i]);
if (child)
......
......@@ -25,43 +25,55 @@ WebInspector.JSArticle = function()
/**
* @constructor
* @param {string} name
* @param {string} dataType
* @param {string} optional
* @param {?WebInspector.WikiParser.Block} name
* @param {?WebInspector.WikiParser.Block} dataType
* @param {?WebInspector.WikiParser.Block} optional
* @param {?WebInspector.WikiParser.Block} description
*/
WebInspector.JSArticle.Parameter = function(name, dataType, optional, description)
{
this.name = name;
this.dataType = dataType;
this.optional = optional.toUpperCase() === "YES";
this.name = WebInspector.JSArticle.unfoldStringValue(name);
this.dataType = WebInspector.JSArticle.unfoldStringValue(dataType);
var textContent = WebInspector.JSArticle.unfoldStringValue(optional);
this.optional = textContent ? textContent.toUpperCase() === "YES" : false;
this.description = description;
}
/**
* @constructor
* @param {string} language
* @param {string} code
* @param {string} liveUrl
* @param {?WebInspector.WikiParser.Block} language
* @param {!WebInspector.WikiParser.Block} code
* @param {?WebInspector.WikiParser.Block} liveUrl
* @param {?WebInspector.WikiParser.Block} description
*/
WebInspector.JSArticle.Example = function(language, code, liveUrl, description)
{
this.language = language;
this.code = code;
this.liveUrl = liveUrl;
this.language = WebInspector.JSArticle.unfoldStringValue(language);
this.code = WebInspector.JSArticle.unfoldStringValue(code);
this.liveUrl = WebInspector.JSArticle.unfoldStringValue(liveUrl);
this.description = description;
}
/**
* @constructor
* @param {string} returnValueName
* @param {string} returnValueDescription
* @param {?WebInspector.WikiParser.Block} returnValueName
* @param {?WebInspector.WikiParser.Block} returnValueDescription
*/
WebInspector.JSArticle.Method = function(returnValueName, returnValueDescription)
{
this.returnValueName = returnValueName;
this.returnValueDescription = returnValueDescription;
this.returnValueName = WebInspector.JSArticle.unfoldStringValue(returnValueName);
this.returnValueDescription = WebInspector.JSArticle.unfoldStringValue(returnValueDescription);
}
/**
* @param {?WebInspector.WikiParser.Block} block
* @return {?string}
*/
WebInspector.JSArticle.unfoldStringValue = function(block)
{
if (block && block.hasChildren() && block.children()[0].hasChildren())
return block.children()[0].children()[0].text();
return null;
}
/**
......@@ -70,22 +82,8 @@ WebInspector.JSArticle.Method = function(returnValueName, returnValueDescription
*/
WebInspector.JSArticle.parse = function(wikiMarkupText)
{
/**
* @param {string} string
* @param {string} debugInfo
* @return {?WebInspector.WikiParser.Block}
*/
function parseString(string, debugInfo)
{
var result = wikiParser.parseString(string);
if (!result)
console.error("Can't parse " + debugInfo);
return result;
}
var wikiParser = new WebInspector.WikiParser(wikiMarkupText);
var wikiDocument = wikiParser.document();
var article = new WebInspector.JSArticle();
article.pageTitle = wikiDocument["Page_Title"];
if (typeof article.pageTitle !== "string")
......@@ -101,23 +99,18 @@ WebInspector.JSArticle.parse = function(wikiMarkupText)
article.methods = new WebInspector.JSArticle.Method(returnValueName, returnValue);
}
var remarks = wikiDocument["Remarks_Section"] ? wikiDocument["Remarks_Section"]["Remarks"] : null;
if (remarks)
article.remarks = parseString(remarks, "remarks");
var summary = wikiDocument["Summary_Section"];
if (summary)
article.summary = parseString(summary, "summary");
article.remarks = wikiDocument["Remarks_Section"] ? wikiDocument["Remarks_Section"]["Remarks"] : null;
article.summary = wikiDocument["Summary_Section"];
var examples = wikiDocument["Examples_Section"] ? wikiDocument["Examples_Section"]["Examples"] : [];
if (!Array.isArray(examples) && typeof examples !== "undefined")
examples = [examples];
for (var i = 0; i < examples.length; ++i) {
var language = examples[i]["Single Example"]["Language"];
var code = examples[i]["Single Example"]["Code"];
var liveUrl = examples[i]["Single Example"]["LiveURL"];
var description = parseString(examples[i]["Single Example"]["Description"], "example description");
var language = examples[i].values["Language"];
var code = examples[i].values["Code"];
var liveUrl = examples[i].values["LiveURL"];
var description = examples[i].values["Description"];
article.examples.push(new WebInspector.JSArticle.Example(language, code, liveUrl, description));
}
......@@ -126,10 +119,10 @@ WebInspector.JSArticle.parse = function(wikiMarkupText)
parameters = [parameters];
for (var i = 0; i < parameters.length; ++i) {
var name = parameters[i]["Method Parameter"]["Name"];
var dataType = parameters[i]["Method Parameter"]["Data type"];
var optional = parameters[i]["Method Parameter"]["Optional"];
var description = parseString(parameters[i]["Method Parameter"]["Description"], "method description");
var name = parameters[i].values["Name"];
var dataType = parameters[i].values["Data type"];
var optional = parameters[i].values["Optional"];
var description = parameters[i].values["Description"];
article.parameters.push(new WebInspector.JSArticle.Parameter(name, dataType, optional, description));
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment