Spaces:
Sleeping
Sleeping
<html> | |
<head> | |
<title>JSV: JSON Schema Validator</title> | |
<style type="text/css"> | |
/* 1140px CSS Fluid Grid System */ | |
html,body,div,span,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,address,cite,code,del,dfn,em,img,ins,q,small,strong,sub,sup,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td{border:0;margin:0;padding:0} | |
article,aside,figure,figure img,figcaption,hgroup,footer,header,nav,section,video,object{display:block} | |
a img{border:0} | |
figure{position:relative} | |
figure img{width:100%} | |
.container{padding-left:20px;padding-right:20px} | |
.row{width:100%;max-width:1140px;min-width:755px;overflow:hidden;margin:0 auto} | |
.onecol,.twocol,.threecol,.fourcol,.fivecol,.sixcol,.sevencol,.eightcol,.ninecol,.tencol,.elevencol{margin-right:3.8%;float:left;min-height:1px} | |
.row .onecol{width:4.85%} | |
.row .twocol{width:13.45%} | |
.row .threecol{width:22.05%} | |
.row .fourcol{width:30.75%} | |
.row .fivecol{width:39.45%} | |
.row .sixcol{width:48%} | |
.row .sevencol{width:56.75%} | |
.row .eightcol{width:65.4%} | |
.row .ninecol{width:74.05%} | |
.row .tencol{width:82.7%} | |
.row .elevencol{width:91.35%} | |
.row .twelvecol{width:100%;float:left} | |
.last{margin-right:0} | |
img,object,embed{max-width:100%} | |
img{height:auto} | |
@media only screen and (max-width: 1023px) { | |
body{font-size:.8em;line-height:1.5em} | |
} | |
@media handheld, only screen and (max-width: 767px) { | |
body{font-size:16px;-webkit-text-size-adjust:none} | |
.row,body,.container{width:100%;min-width:0;margin-left:0;margin-right:0;padding-left:0;padding-right:0} | |
.row .onecol,.row .twocol,.row .threecol,.row .fourcol,.row .fivecol,.row .sixcol,.row .sevencol,.row .eightcol,.row .ninecol,.row .tencol,.row .elevencol,.row .twelvecol{width:auto;float:none;margin-left:0;margin-right:0;padding-left:20px;padding-right:20px} | |
} | |
/* Styles */ | |
.container { padding-bottom: 20px; font-family: sans-serif; } | |
.row { margin-top: 20px; } | |
legend { font-weight: bold; font-size: 125%; } | |
label { display: block; font-weight: bold; } | |
.value_label { display: none; } | |
.value { height: 360px; font-size: 12px; tab-size: 4; } | |
.value, .uri { width: 100%; } | |
.value, .uri, .error code { font-family: Consolas, Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace, serif; } | |
.error { margin: 20px 0; font-size: 12px; } | |
.error:first-child { margin-top: 0; } | |
.error:last-child { margin-bottom: 0; } | |
.error_message { font-weight: bold; } | |
.error_schemaUri { margin-left: 15px; } | |
.error_attribute { margin-left: 15px; } | |
#report { padding: 20px; } | |
#report.valid { border: 1px solid #0f0; background-color: #efe; } | |
#report.invalid { border: 1px solid #f00; background-color: #fee; } | |
</style> | |
</head> | |
<body class="container"> | |
<div class="row"> | |
<h1>JSV: JSON Schema Validator</h1> | |
<p></p> | |
</div> | |
<form id="jsv" class="row"> | |
<div class="row"> | |
<div class="twelvecol last"> | |
<fieldset id="environment_properties"> | |
<label for="environment">Environment</label> | |
<select id="environment" name="environment"> | |
<option value="json-schema-draft-03">JSON Schema Draft-03</option> | |
<option value="json-schema-draft-02">JSON Schema Draft-02</option> | |
<option value="json-schema-draft-01">JSON Schema Draft-01</option> | |
</select> | |
</fieldset> | |
</div> | |
</div> | |
<div class="row"> | |
<div class="sixcol"> | |
<fieldset id="json_properties"> | |
<legend>Input</legend> | |
<label id="json_label" class="value_label" for="json">Value</label> | |
<textarea id="json" class="value" name="json" wrap="off"></textarea> | |
<label id="json_uri_label" class="uri_label" for="json_uri">URI</label> | |
<input id="json_uri" class="uri" type="text" name="json_uri" value="json"> | |
</fieldset> | |
</div> | |
<div class="sixcol last"> | |
<fieldset id="schema_properties"> | |
<legend>Schema</legend> | |
<label id="schema_label" class="value_label" for="schema">Value</label> | |
<textarea id="schema" class="value" name="schema" wrap="off"></textarea> | |
<label id="schema_uri_label" class="uri_label" for="schema_uri">URI</label> | |
<input id="schema_uri" class="uri" type="text" name="schema_uri" value="schema"> | |
</fieldset> | |
</div> | |
</div> | |
<div class="row"> | |
<div class="twelvecol last"> | |
<fieldset id="controls"> | |
<input id="validate" type="submit" value="Validate"/> | |
</fieldset> | |
</div> | |
</div> | |
</form> | |
<div class="row"> | |
<div id="report"></div> | |
</div> | |
<!-- Load Scripts --> | |
<script type="text/javascript"> | |
/* Code by: http://bitprophet.org/code/javascript_tab.html */ | |
var TAB_CHAR = "\t"; | |
function checkTab(evt) { | |
var t = evt.target; | |
var ss = t.selectionStart; | |
var se = t.selectionEnd; | |
// Tab key - insert tab expansion | |
if (evt.keyCode == 9) { | |
evt.preventDefault(); | |
// Special case of multi line selection | |
if (ss != se && t.value.slice(ss,se).indexOf("n") != -1) { | |
// In case selection was not of entire lines (e.g. selection begins in the middle of a line) | |
// we ought to tab at the beginning as well as at the start of every following line. | |
var pre = t.value.slice(0,ss); | |
var sel = t.value.slice(ss,se).replace(/n/g,"n"+TAB_CHAR); | |
var post = t.value.slice(se,t.value.length); | |
t.value = pre.concat(TAB_CHAR).concat(sel).concat(post); | |
t.selectionStart = ss + TAB_CHAR.length; | |
t.selectionEnd = se + TAB_CHAR.length; | |
} | |
// "Normal" case (no selection or selection on one line only) | |
else { | |
t.value = t.value.slice(0,ss).concat(TAB_CHAR).concat(t.value.slice(ss,t.value.length)); | |
if (ss == se) { | |
t.selectionStart = t.selectionEnd = ss + TAB_CHAR.length; | |
} | |
else { | |
t.selectionStart = ss + TAB_CHAR.length; | |
t.selectionEnd = se + TAB_CHAR.length; | |
} | |
} | |
} | |
// Backspace key - delete preceding tab expansion, if exists | |
else if (evt.keyCode==8 && t.value.slice(ss - 4,ss) == TAB_CHAR) { | |
evt.preventDefault(); | |
t.value = t.value.slice(0,ss - 4).concat(t.value.slice(ss,t.value.length)); | |
t.selectionStart = t.selectionEnd = ss - TAB_CHAR.length; | |
} | |
// Delete key - delete following tab expansion, if exists | |
else if (evt.keyCode==46 && t.value.slice(se,se + 4) == TAB_CHAR) { | |
evt.preventDefault(); | |
t.value = t.value.slice(0,ss).concat(t.value.slice(ss + 4,t.value.length)); | |
t.selectionStart = t.selectionEnd = ss; | |
} | |
// Left/right arrow keys - move across the tab in one go | |
else if (evt.keyCode == 37 && t.value.slice(ss - 4,ss) == TAB_CHAR) { | |
evt.preventDefault(); | |
t.selectionStart = t.selectionEnd = ss - 4; | |
} | |
else if (evt.keyCode == 39 && t.value.slice(ss,ss + 4) == TAB_CHAR) { | |
evt.preventDefault(); | |
t.selectionStart = t.selectionEnd = ss + 4; | |
} | |
} | |
/* Form Logic */ | |
window.addEventListener("load", function (event) { | |
var textareas = document.getElementsByTagName("textarea"); | |
for (var x = 0, xl = textareas.length; x < xl; ++x) { | |
textareas[x].addEventListener("keypress", checkTab); | |
} | |
var form = document.forms["jsv"]; | |
form.addEventListener("submit", function (event) { | |
try { | |
var environmentId = form.elements["environment"].value; | |
var json = form.elements["json"].value; | |
var jsonUri = form.elements["json_uri"].value; | |
var schema = form.elements["schema"].value; | |
var schemaUri = form.elements["schema_uri"].value; | |
try { | |
json = json ? JSON.parse(json) : undefined; | |
} catch (e) { | |
throw new Error("Input is not valid JSON"); | |
} | |
try { | |
schema = schema ? JSON.parse(schema) : undefined; | |
} catch (e) { | |
throw new Error("Schema is not valid JSON"); | |
} | |
var environment = JSV.createEnvironment(environmentId); | |
var report = environment.validate(environment.createInstance(json, jsonUri), environment.createSchema(schema, null, schemaUri)); | |
var reportElement = document.getElementById("report"); | |
var output; | |
if (report.errors.length) { | |
reportElement.className = "invalid"; | |
output = ""; | |
for (var x = 0, xl = report.errors.length; x < xl; ++x) { | |
output += '<div class="error"><span class="error_uri">Problem with <code>' + | |
report.errors[x].uri + | |
'</code> : </span><span class="error_message">' + | |
report.errors[x].message + | |
'</span><br/><span class="error_schemaUri">Reported by <code>' + | |
report.errors[x].schemaUri + | |
'</code></span><br/><span class="error_attribute">Attribute "<code>' + | |
report.errors[x].attribute + | |
'</code>"</span><span class="error_details"> (<code>' + | |
JSON.stringify(report.errors[x].details) + | |
'</code>)</span></div>'; | |
} | |
reportElement.innerHTML = output; | |
} else { | |
reportElement.className = "valid"; | |
reportElement.textContent = "Input is valid!"; | |
} | |
} catch (e) { | |
var reportElement = document.getElementById("report"); | |
reportElement.className = "invalid"; | |
reportElement.textContent = e; | |
} | |
event.preventDefault(); | |
return false; | |
}); | |
}); | |
</script> | |
<script type="text/javascript" src="../lib/uri/uri.js"></script> | |
<script type="text/javascript" src="../lib/uri/schemes/urn.js"></script> | |
<script type="text/javascript" src="../lib/jsv.js"></script> | |
<script type="text/javascript" src="../lib/json-schema-draft-03.js"></script> | |
<script type="text/javascript" src="../lib/json-schema-draft-02.js"></script> | |
<script type="text/javascript" src="../lib/json-schema-draft-01.js"></script> | |
</body> | |
</html> |