Skip to content

Commit

Permalink
Merge branch 'pr/41'
Browse files Browse the repository at this point in the history
  • Loading branch information
yanick committed Feb 10, 2018
2 parents a3b582d + 8353c7f commit b5f888e
Show file tree
Hide file tree
Showing 19 changed files with 4,579 additions and 20 deletions.
1 change: 1 addition & 0 deletions Changes.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

## NEXT

* Resolve #definitions of non-root schemas. [GH#49, Frassle, yanick]
* Avoid requesting the same URL multiple times. [GH#46, jpmckinney]
* Relative local paths are based on the referring schema, not the original one. [GH#53, Krokop]
* Add Nightwatch.js-based tests.
Expand Down
119 changes: 103 additions & 16 deletions docson.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,43 @@ var docson = docson || {};

docson.templateBaseUrl="templates";

define(["lib/jquery", "lib/handlebars", "lib/highlight", "lib/jsonpointer", "lib/marked", "lib/traverse"], function(jquery, handlebars, highlight, jsonpointer, marked) {
define(["lib/jquery", "lib/handlebars", "lib/highlight", "lib/jsonpointer", "lib/marked",
"lib/URI",
"lib/traverse"], function(jquery, handlebars, highlight, jsonpointer, marked, URI) {

var ready = $.Deferred();
var boxTemplate;
var signatureTemplate;
var source;
var stack = [];
var boxes=[];
var requests = {};

var schemaDocuments = {};

var resolveRefsReentrant;

function get_document(url) {
if( !schemaDocuments[url] ) {
schemaDocuments[url] = $.get(url).then(function(content){
if(typeof content != "object") {
try {
content = JSON.parse(content);
} catch(e) {
console.error("Unable to parse "+segments[0], e);
content = {};
}
}
return content;
});

schemaDocuments[url].then(function(schema){
resolveRefsReentrant(schema, url );
})
}
return schemaDocuments[url];
}



Handlebars.registerHelper('scope', function(schema, options) {
var result;
Expand Down Expand Up @@ -335,10 +363,16 @@ define(["lib/jquery", "lib/handlebars", "lib/highlight", "lib/jsonpointer", "lib
}

var refsPromise = $.Deferred().resolve().promise();
var refs = {};

var renderBox;
var refs = {};
var get_ref = function(uri) {
get_document( uri.clone().hash('').toString() ).then(function(schema){
refs[uri.toString()] = uri.hash() ? jsonpointer.get( schema, uri.hash() ) : schema;
}).then(function(){ renderBox() });
};

var renderBox = function() {
renderBox = function() {
stack.push(refs);
var target = schema;
if(ref) {
Expand Down Expand Up @@ -434,17 +468,52 @@ define(["lib/jquery", "lib/handlebars", "lib/highlight", "lib/jsonpointer", "lib
});
};

var resolveRefsReentrant = function(schema, relPath){
if (relPath === undefined) {relPath = baseUrl}
traverse(schema).forEach(function(item) {
// Fix Swagger weird generation for array.
if(item && item.$ref == "array") {
delete item.$ref;
item.type ="array";
var resolveSchemaRef = function( parentObject, item, baseUrl ) {
// not a $ref? we're done
if( parentObject.key !== "$ref") return;

if ( typeof baseUrl === 'string' ) {
baseUrl = new URI( baseUrl );
}


var uri = new URI( item );

// ah, it's a relative url
if( ! uri.host() ) {
if ( uri.path() ) {
if( uri.path()[0] !== '/' ) { // relative path
var dir = [ baseUrl.directory(), uri.path() ].join('/');
uri.path(dir);
}
}
else {
uri = baseUrl.clone().hash( uri.hash() );
}
}

uri.normalize();

// use the normalized uri
parentObject.update( uri.toString() );

get_ref( uri );

return;


var segments = item.split('#');

if( ! /^https?:\/\//.test(segment[0]) ) {
segment[0] = relPath + segment[0];
}

get_document(segment[0]).then(function(schema) {
})


// Fetch external schema
if(this.key === "$ref") {

var external = false;
//Local meaning local to this server, but not in this file.
var local = false;
Expand All @@ -465,7 +534,7 @@ define(["lib/jquery", "lib/handlebars", "lib/highlight", "lib/jsonpointer", "lib
var segments = item.split("#");
refs[item] = null;
var url = segments[0];
var request = requests[url] = requests[url] || $.get(url);
var request = get_document(url);
var p = request.then(function(content) {
if(typeof content != "object") {
try {
Expand All @@ -475,7 +544,9 @@ define(["lib/jquery", "lib/handlebars", "lib/highlight", "lib/jsonpointer", "lib
}
}
if(content) {
refs[item] = content;
refs[item] = segments.length == 1 ? content
: jsonpointer.get(content, segments[1]);
refs[item] = jsonpointer.get(content, segments[1]);
renderBox();
resolveRefsReentrant(content);
}
Expand All @@ -486,7 +557,7 @@ define(["lib/jquery", "lib/handlebars", "lib/highlight", "lib/jsonpointer", "lib
var segments = item.split("#");
refs[item] = null;
var url = relPath + segments[0];
var request = requests[url] = requests[url] || $.get(url);
var request = get_document(url);
var p = request.then(function(content) {
if(typeof content != "object") {
try {
Expand All @@ -496,14 +567,30 @@ define(["lib/jquery", "lib/handlebars", "lib/highlight", "lib/jsonpointer", "lib
}
}
if(content) {
refs[item] = content;
refs[item] = segments.length == 1 ? content
: jsonpointer.get(content, segments[1]);
renderBox();
var splitSegment = segments[0].split('/')
resolveRefsReentrant(content, relPath+splitSegment.slice(0, splitSegment.length-1).join('/')+"/");
}
});
}
}

resolveRefsReentrant = function(schema, relPath){
if (relPath === undefined) {
relPath = new URI(baseUrl);
}

traverse(schema).forEach(function(item) {
// Fix Swagger weird generation for array.
if(item && item.$ref == "array") {
delete item.$ref;
item.type ="array";
}

resolveSchemaRef( this, item, relPath );

});
};

Expand Down
2 changes: 1 addition & 1 deletion index.html
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@
if(segments[0]) {
function render(schema) {
try {
docson.doc("doc", schema, segments[1], segments[0].replace(/\/[^\/]*\/?$/, '/')).done(function() {
docson.doc("doc", schema, segments[1], segments[0]).done(function() {
maybeExpand(segments);
});
} catch (e) {
Expand Down
185 changes: 185 additions & 0 deletions lib/IPv6.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,185 @@
/*!
* URI.js - Mutating URLs
* IPv6 Support
*
* Version: 1.19.0
*
* Author: Rodney Rehm
* Web: http://medialize.github.io/URI.js/
*
* Licensed under
* MIT License http://www.opensource.org/licenses/mit-license
*
*/

(function (root, factory) {
'use strict';
// https://github.com/umdjs/umd/blob/master/returnExports.js
if (typeof module === 'object' && module.exports) {
// Node
module.exports = factory();
} else if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
define(factory);
} else {
// Browser globals (root is window)
root.IPv6 = factory(root);
}
}(this, function (root) {
'use strict';

/*
var _in = "fe80:0000:0000:0000:0204:61ff:fe9d:f156";
var _out = IPv6.best(_in);
var _expected = "fe80::204:61ff:fe9d:f156";
console.log(_in, _out, _expected, _out === _expected);
*/

// save current IPv6 variable, if any
var _IPv6 = root && root.IPv6;

function bestPresentation(address) {
// based on:
// Javascript to test an IPv6 address for proper format, and to
// present the "best text representation" according to IETF Draft RFC at
// http://tools.ietf.org/html/draft-ietf-6man-text-addr-representation-04
// 8 Feb 2010 Rich Brown, Dartware, LLC
// Please feel free to use this code as long as you provide a link to
// http://www.intermapper.com
// http://intermapper.com/support/tools/IPV6-Validator.aspx
// http://download.dartware.com/thirdparty/ipv6validator.js

var _address = address.toLowerCase();
var segments = _address.split(':');
var length = segments.length;
var total = 8;

// trim colons (:: or ::a:b:c… or …a:b:c::)
if (segments[0] === '' && segments[1] === '' && segments[2] === '') {
// must have been ::
// remove first two items
segments.shift();
segments.shift();
} else if (segments[0] === '' && segments[1] === '') {
// must have been ::xxxx
// remove the first item
segments.shift();
} else if (segments[length - 1] === '' && segments[length - 2] === '') {
// must have been xxxx::
segments.pop();
}

length = segments.length;

// adjust total segments for IPv4 trailer
if (segments[length - 1].indexOf('.') !== -1) {
// found a "." which means IPv4
total = 7;
}

// fill empty segments them with "0000"
var pos;
for (pos = 0; pos < length; pos++) {
if (segments[pos] === '') {
break;
}
}

if (pos < total) {
segments.splice(pos, 1, '0000');
while (segments.length < total) {
segments.splice(pos, 0, '0000');
}
}

// strip leading zeros
var _segments;
for (var i = 0; i < total; i++) {
_segments = segments[i].split('');
for (var j = 0; j < 3 ; j++) {
if (_segments[0] === '0' && _segments.length > 1) {
_segments.splice(0,1);
} else {
break;
}
}

segments[i] = _segments.join('');
}

// find longest sequence of zeroes and coalesce them into one segment
var best = -1;
var _best = 0;
var _current = 0;
var current = -1;
var inzeroes = false;
// i; already declared

for (i = 0; i < total; i++) {
if (inzeroes) {
if (segments[i] === '0') {
_current += 1;
} else {
inzeroes = false;
if (_current > _best) {
best = current;
_best = _current;
}
}
} else {
if (segments[i] === '0') {
inzeroes = true;
current = i;
_current = 1;
}
}
}

if (_current > _best) {
best = current;
_best = _current;
}

if (_best > 1) {
segments.splice(best, _best, '');
}

length = segments.length;

// assemble remaining segments
var result = '';
if (segments[0] === '') {
result = ':';
}

for (i = 0; i < length; i++) {
result += segments[i];
if (i === length - 1) {
break;
}

result += ':';
}

if (segments[length - 1] === '') {
result += ':';
}

return result;
}

function noConflict() {
/*jshint validthis: true */
if (root.IPv6 === this) {
root.IPv6 = _IPv6;
}

return this;
}

return {
best: bestPresentation,
noConflict: noConflict
};
}));
Loading

0 comments on commit b5f888e

Please sign in to comment.