@mikaello/avrodoc-plus
Advanced tools
Comparing version 1.0.1 to 1.0.2
{ | ||
"name": "@mikaello/avrodoc-plus", | ||
"description": "Documentation tool for Avro schemas. Forked from https://github.com/leosilvadev/avrodoc-plus.", | ||
"version": "1.0.1", | ||
"version": "1.0.2", | ||
"author": "mikaello https://github.com/mikaello", | ||
@@ -6,0 +6,0 @@ "type": "module", |
@@ -59,2 +59,4 @@ /* global dust:false, markdown:false, Sammy:false */ | ||
}, | ||
html: true, | ||
sanitize: false, | ||
delay: { show: 200, hide: 50 }, | ||
@@ -61,0 +63,0 @@ template: |
@@ -139,3 +139,3 @@ /* global AvroDoc:false */ | ||
schema.type !== null && | ||
hasOwnProperty(built_in_type_fields, schema.type) | ||
hasOwnPropertyS(built_in_type_fields, schema.type) | ||
) { | ||
@@ -150,3 +150,3 @@ ignore_attributes = ignore_attributes.concat( | ||
if ( | ||
hasOwnProperty(schema, key) && | ||
hasOwnPropertyS(schema, key) && | ||
ignore_attributes.indexOf(key) === -1 | ||
@@ -358,3 +358,3 @@ ) { | ||
for (i = length; i-- !== 0; ) | ||
if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false; | ||
if (!hasOwnPropertyS(b, keys[i])) return false; | ||
@@ -388,3 +388,3 @@ for (i = length; i-- !== 0; ) { | ||
if (hasOwnProperty(shared_types, qualified_name)) { | ||
if (hasOwnPropertyS(shared_types, qualified_name)) { | ||
shared_schema = shared_types[qualified_name].find((shared_schema) => | ||
@@ -397,3 +397,3 @@ isEqual(new_type, typeEssence(shared_schema)) | ||
if (hasOwnProperty(named_types, qualified_name)) { | ||
if (hasOwnPropertyS(named_types, qualified_name)) { | ||
var existing_type = typeEssence(named_types[qualified_name]); | ||
@@ -572,3 +572,3 @@ if (!isEqual(new_type, existing_type)) { | ||
protocol.sorted_messages = Object.values(protocol.messages ?? {}).sort( | ||
stringCompareBy("name") | ||
stringCompareByS("name") | ||
); | ||
@@ -594,3 +594,3 @@ defineNamedType(protocol); | ||
_public.sorted_types = Object.values(named_types).sort( | ||
stringCompareBy("name") | ||
stringCompareByS("name") | ||
); | ||
@@ -597,0 +597,0 @@ |
@@ -1,29 +0,16 @@ | ||
/* =========================================================== | ||
* bootstrap-popover.js v2.1.1 | ||
* http://twitter.github.com/bootstrap/javascript.html#popovers | ||
* =========================================================== | ||
* Copyright 2012 Twitter, Inc. | ||
* | ||
* Licensed under the Apache License, Version 2.0 (the "License"); | ||
* you may not use this file except in compliance with the License. | ||
* You may obtain a copy of the License at | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software | ||
* distributed under the License is distributed on an "AS IS" BASIS, | ||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
* See the License for the specific language governing permissions and | ||
* limitations under the License. | ||
* =========================================================== */ | ||
/* ======================================================================== | ||
* Bootstrap: popover.js v3.4.1 | ||
* https://getbootstrap.com/docs/3.4/javascript/#popovers | ||
* ======================================================================== | ||
* Copyright 2011-2019 Twitter, Inc. | ||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) | ||
* ======================================================================== */ | ||
!function ($) { | ||
+function ($) { | ||
'use strict'; | ||
"use strict"; // jshint ;_; | ||
// POPOVER PUBLIC CLASS DEFINITION | ||
// =============================== | ||
/* POPOVER PUBLIC CLASS DEFINITION | ||
* =============================== */ | ||
var Popover = function (element, options) { | ||
@@ -33,59 +20,88 @@ this.init('popover', element, options) | ||
if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js') | ||
/* NOTE: POPOVER EXTENDS BOOTSTRAP-TOOLTIP.js | ||
========================================== */ | ||
Popover.VERSION = '3.4.1' | ||
Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype, { | ||
Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, { | ||
placement: 'right', | ||
trigger: 'click', | ||
content: '', | ||
template: '<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>' | ||
}) | ||
constructor: Popover | ||
, setContent: function () { | ||
var $tip = this.tip() | ||
, title = this.getTitle() | ||
, content = this.getContent() | ||
// NOTE: POPOVER EXTENDS tooltip.js | ||
// ================================ | ||
$tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title) | ||
$tip.find('.popover-content > *')[this.options.html ? 'html' : 'text'](content) | ||
Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype) | ||
$tip.removeClass('fade top bottom left right in') | ||
} | ||
Popover.prototype.constructor = Popover | ||
, hasContent: function () { | ||
return this.getTitle() || this.getContent() | ||
} | ||
Popover.prototype.getDefaults = function () { | ||
return Popover.DEFAULTS | ||
} | ||
, getContent: function () { | ||
var content | ||
, $e = this.$element | ||
, o = this.options | ||
Popover.prototype.setContent = function () { | ||
var $tip = this.tip() | ||
var title = this.getTitle() | ||
var content = this.getContent() | ||
content = $e.attr('data-content') | ||
|| (typeof o.content == 'function' ? o.content.call($e[0]) : o.content) | ||
if (this.options.html) { | ||
var typeContent = typeof content | ||
return content | ||
} | ||
if (this.options.sanitize) { | ||
title = this.sanitizeHtml(title) | ||
, tip: function () { | ||
if (!this.$tip) { | ||
this.$tip = $(this.options.template) | ||
if (typeContent === 'string') { | ||
content = this.sanitizeHtml(content) | ||
} | ||
} | ||
return this.$tip | ||
} | ||
, destroy: function () { | ||
this.hide().$element.off('.' + this.type).removeData(this.type) | ||
$tip.find('.popover-title').html(title) | ||
$tip.find('.popover-content').children().detach().end()[ | ||
typeContent === 'string' ? 'html' : 'append' | ||
](content) | ||
console.log($tip.find(".popover-content").prevObject[0].innerHTML) | ||
} else { | ||
$tip.find('.popover-title').text(title) | ||
$tip.find('.popover-content').children().detach().end().text(content) | ||
} | ||
}) | ||
$tip.removeClass('fade top bottom left right in') | ||
// IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do | ||
// this manually by checking the contents. | ||
if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide() | ||
} | ||
/* POPOVER PLUGIN DEFINITION | ||
* ======================= */ | ||
Popover.prototype.hasContent = function () { | ||
return this.getTitle() || this.getContent() | ||
} | ||
$.fn.popover = function (option) { | ||
Popover.prototype.getContent = function () { | ||
var $e = this.$element | ||
var o = this.options | ||
return $e.attr('data-content') | ||
|| (typeof o.content == 'function' ? | ||
o.content.call($e[0]) : | ||
o.content) | ||
} | ||
Popover.prototype.arrow = function () { | ||
return (this.$arrow = this.$arrow || this.tip().find('.arrow')) | ||
} | ||
// POPOVER PLUGIN DEFINITION | ||
// ========================= | ||
function Plugin(option) { | ||
return this.each(function () { | ||
var $this = $(this) | ||
, data = $this.data('popover') | ||
, options = typeof option == 'object' && option | ||
if (!data) $this.data('popover', (data = new Popover(this, options))) | ||
var $this = $(this) | ||
var data = $this.data('bs.popover') | ||
var options = typeof option == 'object' && option | ||
if (!data && /destroy|hide/.test(option)) return | ||
if (!data) $this.data('bs.popover', (data = new Popover(this, options))) | ||
if (typeof option == 'string') data[option]() | ||
@@ -95,11 +111,16 @@ }) | ||
var old = $.fn.popover | ||
$.fn.popover = Plugin | ||
$.fn.popover.Constructor = Popover | ||
$.fn.popover.defaults = $.extend({} , $.fn.tooltip.defaults, { | ||
placement: 'right' | ||
, trigger: 'click' | ||
, content: '' | ||
, template: '<div class="popover"><div class="arrow"></div><div class="popover-inner"><h3 class="popover-title"></h3><div class="popover-content"><p></p></div></div></div>' | ||
}) | ||
}(window.jQuery); | ||
// POPOVER NO CONFLICT | ||
// =================== | ||
$.fn.popover.noConflict = function () { | ||
$.fn.popover = old | ||
return this | ||
} | ||
}(jQuery); |
@@ -1,258 +0,659 @@ | ||
/* =========================================================== | ||
* bootstrap-tooltip.js v2.1.1 | ||
* http://twitter.github.com/bootstrap/javascript.html#tooltips | ||
/* ======================================================================== | ||
* Bootstrap: tooltip.js v3.4.1 | ||
* https://getbootstrap.com/docs/3.4/javascript/#tooltip | ||
* Inspired by the original jQuery.tipsy by Jason Frame | ||
* =========================================================== | ||
* Copyright 2012 Twitter, Inc. | ||
* | ||
* Licensed under the Apache License, Version 2.0 (the "License"); | ||
* you may not use this file except in compliance with the License. | ||
* You may obtain a copy of the License at | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software | ||
* distributed under the License is distributed on an "AS IS" BASIS, | ||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
* See the License for the specific language governing permissions and | ||
* limitations under the License. | ||
* ========================================================== */ | ||
* ======================================================================== | ||
* Copyright 2011-2019 Twitter, Inc. | ||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) | ||
* ======================================================================== */ | ||
+function ($) { | ||
'use strict'; | ||
!function ($) { | ||
var DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn'] | ||
"use strict"; // jshint ;_; | ||
var uriAttrs = [ | ||
'background', | ||
'cite', | ||
'href', | ||
'itemtype', | ||
'longdesc', | ||
'poster', | ||
'src', | ||
'xlink:href' | ||
] | ||
var ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i | ||
/* TOOLTIP PUBLIC CLASS DEFINITION | ||
* =============================== */ | ||
var DefaultWhitelist = { | ||
// Global attributes allowed on any supplied element below. | ||
'*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN], | ||
a: ['target', 'href', 'title', 'rel'], | ||
area: [], | ||
b: [], | ||
br: [], | ||
col: [], | ||
code: [], | ||
div: [], | ||
em: [], | ||
hr: [], | ||
h1: [], | ||
h2: [], | ||
h3: [], | ||
h4: [], | ||
h5: [], | ||
h6: [], | ||
i: [], | ||
img: ['src', 'alt', 'title', 'width', 'height'], | ||
li: [], | ||
ol: [], | ||
p: [], | ||
pre: [], | ||
s: [], | ||
small: [], | ||
span: [], | ||
sub: [], | ||
sup: [], | ||
strong: [], | ||
u: [], | ||
ul: [] | ||
} | ||
/** | ||
* A pattern that recognizes a commonly useful subset of URLs that are safe. | ||
* | ||
* Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts | ||
*/ | ||
var SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi | ||
/** | ||
* A pattern that matches safe data URLs. Only matches image, video and audio types. | ||
* | ||
* Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts | ||
*/ | ||
var DATA_URL_PATTERN = /^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i | ||
function allowedAttribute(attr, allowedAttributeList) { | ||
var attrName = attr.nodeName.toLowerCase() | ||
if ($.inArray(attrName, allowedAttributeList) !== -1) { | ||
if ($.inArray(attrName, uriAttrs) !== -1) { | ||
return Boolean(attr.nodeValue.match(SAFE_URL_PATTERN) || attr.nodeValue.match(DATA_URL_PATTERN)) | ||
} | ||
return true | ||
} | ||
var regExp = $(allowedAttributeList).filter(function (index, value) { | ||
return value instanceof RegExp | ||
}) | ||
// Check if a regular expression validates the attribute. | ||
for (var i = 0, l = regExp.length; i < l; i++) { | ||
if (attrName.match(regExp[i])) { | ||
return true | ||
} | ||
} | ||
return false | ||
} | ||
function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) { | ||
if (unsafeHtml.length === 0) { | ||
return unsafeHtml | ||
} | ||
if (sanitizeFn && typeof sanitizeFn === 'function') { | ||
return sanitizeFn(unsafeHtml) | ||
} | ||
// IE 8 and below don't support createHTMLDocument | ||
if (!document.implementation || !document.implementation.createHTMLDocument) { | ||
return unsafeHtml | ||
} | ||
var createdDocument = document.implementation.createHTMLDocument('sanitization') | ||
createdDocument.body.innerHTML = unsafeHtml | ||
var whitelistKeys = $.map(whiteList, function (el, i) { return i }) | ||
var elements = $(createdDocument.body).find('*') | ||
for (var i = 0, len = elements.length; i < len; i++) { | ||
var el = elements[i] | ||
var elName = el.nodeName.toLowerCase() | ||
if ($.inArray(elName, whitelistKeys) === -1) { | ||
el.parentNode.removeChild(el) | ||
continue | ||
} | ||
var attributeList = $.map(el.attributes, function (el) { return el }) | ||
var whitelistedAttributes = [].concat(whiteList['*'] || [], whiteList[elName] || []) | ||
for (var j = 0, len2 = attributeList.length; j < len2; j++) { | ||
if (!allowedAttribute(attributeList[j], whitelistedAttributes)) { | ||
el.removeAttribute(attributeList[j].nodeName) | ||
} | ||
} | ||
} | ||
return createdDocument.body.innerHTML | ||
} | ||
// TOOLTIP PUBLIC CLASS DEFINITION | ||
// =============================== | ||
var Tooltip = function (element, options) { | ||
this.type = null | ||
this.options = null | ||
this.enabled = null | ||
this.timeout = null | ||
this.hoverState = null | ||
this.$element = null | ||
this.inState = null | ||
this.init('tooltip', element, options) | ||
} | ||
Tooltip.prototype = { | ||
Tooltip.VERSION = '3.4.1' | ||
constructor: Tooltip | ||
Tooltip.TRANSITION_DURATION = 150 | ||
, init: function (type, element, options) { | ||
var eventIn | ||
, eventOut | ||
Tooltip.DEFAULTS = { | ||
animation: true, | ||
placement: 'top', | ||
selector: false, | ||
template: '<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>', | ||
trigger: 'hover focus', | ||
title: '', | ||
delay: 0, | ||
html: false, | ||
container: false, | ||
viewport: { | ||
selector: 'body', | ||
padding: 0 | ||
}, | ||
sanitize : true, | ||
sanitizeFn : null, | ||
whiteList : DefaultWhitelist | ||
} | ||
this.type = type | ||
this.$element = $(element) | ||
this.options = this.getOptions(options) | ||
this.enabled = true | ||
Tooltip.prototype.init = function (type, element, options) { | ||
this.enabled = true | ||
this.type = type | ||
this.$element = $(element) | ||
this.options = this.getOptions(options) | ||
this.$viewport = this.options.viewport && $(document).find($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport)) | ||
this.inState = { click: false, hover: false, focus: false } | ||
if (this.options.trigger == 'click') { | ||
if (this.$element[0] instanceof document.constructor && !this.options.selector) { | ||
throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!') | ||
} | ||
var triggers = this.options.trigger.split(' ') | ||
for (var i = triggers.length; i--;) { | ||
var trigger = triggers[i] | ||
if (trigger == 'click') { | ||
this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this)) | ||
} else if (this.options.trigger != 'manual') { | ||
eventIn = this.options.trigger == 'hover' ? 'mouseenter' : 'focus' | ||
eventOut = this.options.trigger == 'hover' ? 'mouseleave' : 'blur' | ||
this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this)) | ||
} else if (trigger != 'manual') { | ||
var eventIn = trigger == 'hover' ? 'mouseenter' : 'focusin' | ||
var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout' | ||
this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this)) | ||
this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this)) | ||
} | ||
} | ||
this.options.selector ? | ||
(this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) : | ||
this.fixTitle() | ||
this.options.selector ? | ||
(this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) : | ||
this.fixTitle() | ||
} | ||
Tooltip.prototype.getDefaults = function () { | ||
return Tooltip.DEFAULTS | ||
} | ||
Tooltip.prototype.getOptions = function (options) { | ||
var dataAttributes = this.$element.data() | ||
for (var dataAttr in dataAttributes) { | ||
if (dataAttributes.hasOwnProperty(dataAttr) && $.inArray(dataAttr, DISALLOWED_ATTRIBUTES) !== -1) { | ||
delete dataAttributes[dataAttr] | ||
} | ||
} | ||
, getOptions: function (options) { | ||
options = $.extend({}, $.fn[this.type].defaults, options, this.$element.data()) | ||
options = $.extend({}, this.getDefaults(), dataAttributes, options) | ||
if (options.delay && typeof options.delay == 'number') { | ||
options.delay = { | ||
show: options.delay | ||
, hide: options.delay | ||
} | ||
if (options.delay && typeof options.delay == 'number') { | ||
options.delay = { | ||
show: options.delay, | ||
hide: options.delay | ||
} | ||
} | ||
return options | ||
if (options.sanitize) { | ||
options.template = sanitizeHtml(options.template, options.whiteList, options.sanitizeFn) | ||
} | ||
, enter: function (e) { | ||
var self = $(e.currentTarget)[this.type](this._options).data(this.type) | ||
return options | ||
} | ||
if (!self.options.delay || !self.options.delay.show) return self.show() | ||
Tooltip.prototype.getDelegateOptions = function () { | ||
var options = {} | ||
var defaults = this.getDefaults() | ||
clearTimeout(this.timeout) | ||
this._options && $.each(this._options, function (key, value) { | ||
if (defaults[key] != value) options[key] = value | ||
}) | ||
return options | ||
} | ||
Tooltip.prototype.enter = function (obj) { | ||
var self = obj instanceof this.constructor ? | ||
obj : $(obj.currentTarget).data('bs.' + this.type) | ||
if (!self) { | ||
self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) | ||
$(obj.currentTarget).data('bs.' + this.type, self) | ||
} | ||
if (obj instanceof $.Event) { | ||
self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true | ||
} | ||
if (self.tip().hasClass('in') || self.hoverState == 'in') { | ||
self.hoverState = 'in' | ||
this.timeout = setTimeout(function() { | ||
if (self.hoverState == 'in') self.show() | ||
}, self.options.delay.show) | ||
return | ||
} | ||
, leave: function (e) { | ||
var self = $(e.currentTarget)[this.type](this._options).data(this.type) | ||
clearTimeout(self.timeout) | ||
if (this.timeout) clearTimeout(this.timeout) | ||
if (!self.options.delay || !self.options.delay.hide) return self.hide() | ||
self.hoverState = 'in' | ||
self.hoverState = 'out' | ||
this.timeout = setTimeout(function() { | ||
if (self.hoverState == 'out') self.hide() | ||
}, self.options.delay.hide) | ||
if (!self.options.delay || !self.options.delay.show) return self.show() | ||
self.timeout = setTimeout(function () { | ||
if (self.hoverState == 'in') self.show() | ||
}, self.options.delay.show) | ||
} | ||
Tooltip.prototype.isInStateTrue = function () { | ||
for (var key in this.inState) { | ||
if (this.inState[key]) return true | ||
} | ||
, show: function () { | ||
var $tip | ||
, inside | ||
, pos | ||
, actualWidth | ||
, actualHeight | ||
, placement | ||
, tp | ||
return false | ||
} | ||
if (this.hasContent() && this.enabled) { | ||
$tip = this.tip() | ||
this.setContent() | ||
Tooltip.prototype.leave = function (obj) { | ||
var self = obj instanceof this.constructor ? | ||
obj : $(obj.currentTarget).data('bs.' + this.type) | ||
if (this.options.animation) { | ||
$tip.addClass('fade') | ||
} | ||
if (!self) { | ||
self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) | ||
$(obj.currentTarget).data('bs.' + this.type, self) | ||
} | ||
placement = typeof this.options.placement == 'function' ? | ||
this.options.placement.call(this, $tip[0], this.$element[0]) : | ||
this.options.placement | ||
if (obj instanceof $.Event) { | ||
self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false | ||
} | ||
inside = /in/.test(placement) | ||
if (self.isInStateTrue()) return | ||
$tip | ||
.remove() | ||
.css({ top: 0, left: 0, display: 'block' }) | ||
.appendTo(inside ? this.$element : document.body) | ||
clearTimeout(self.timeout) | ||
pos = this.getPosition(inside) | ||
self.hoverState = 'out' | ||
actualWidth = $tip[0].offsetWidth | ||
actualHeight = $tip[0].offsetHeight | ||
if (!self.options.delay || !self.options.delay.hide) return self.hide() | ||
switch (inside ? placement.split(' ')[1] : placement) { | ||
case 'bottom': | ||
tp = {top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2} | ||
break | ||
case 'top': | ||
tp = {top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2} | ||
break | ||
case 'left': | ||
tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth} | ||
break | ||
case 'right': | ||
tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width} | ||
break | ||
} | ||
self.timeout = setTimeout(function () { | ||
if (self.hoverState == 'out') self.hide() | ||
}, self.options.delay.hide) | ||
} | ||
Tooltip.prototype.show = function () { | ||
var e = $.Event('show.bs.' + this.type) | ||
if (this.hasContent() && this.enabled) { | ||
this.$element.trigger(e) | ||
var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0]) | ||
if (e.isDefaultPrevented() || !inDom) return | ||
var that = this | ||
var $tip = this.tip() | ||
var tipId = this.getUID(this.type) | ||
this.setContent() | ||
$tip.attr('id', tipId) | ||
this.$element.attr('aria-describedby', tipId) | ||
if (this.options.animation) $tip.addClass('fade') | ||
var placement = typeof this.options.placement == 'function' ? | ||
this.options.placement.call(this, $tip[0], this.$element[0]) : | ||
this.options.placement | ||
var autoToken = /\s?auto?\s?/i | ||
var autoPlace = autoToken.test(placement) | ||
if (autoPlace) placement = placement.replace(autoToken, '') || 'top' | ||
$tip | ||
.detach() | ||
.css({ top: 0, left: 0, display: 'block' }) | ||
.addClass(placement) | ||
.data('bs.' + this.type, this) | ||
this.options.container ? $tip.appendTo($(document).find(this.options.container)) : $tip.insertAfter(this.$element) | ||
this.$element.trigger('inserted.bs.' + this.type) | ||
var pos = this.getPosition() | ||
var actualWidth = $tip[0].offsetWidth | ||
var actualHeight = $tip[0].offsetHeight | ||
if (autoPlace) { | ||
var orgPlacement = placement | ||
var viewportDim = this.getPosition(this.$viewport) | ||
placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top' : | ||
placement == 'top' && pos.top - actualHeight < viewportDim.top ? 'bottom' : | ||
placement == 'right' && pos.right + actualWidth > viewportDim.width ? 'left' : | ||
placement == 'left' && pos.left - actualWidth < viewportDim.left ? 'right' : | ||
placement | ||
$tip | ||
.css(tp) | ||
.removeClass(orgPlacement) | ||
.addClass(placement) | ||
.addClass('in') | ||
} | ||
} | ||
, setContent: function () { | ||
var $tip = this.tip() | ||
, title = this.getTitle() | ||
var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight) | ||
$tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title) | ||
$tip.removeClass('fade in top bottom left right') | ||
this.applyPlacement(calculatedOffset, placement) | ||
var complete = function () { | ||
var prevHoverState = that.hoverState | ||
that.$element.trigger('shown.bs.' + that.type) | ||
that.hoverState = null | ||
if (prevHoverState == 'out') that.leave(that) | ||
} | ||
$.support.transition && this.$tip.hasClass('fade') ? | ||
$tip | ||
.one('bsTransitionEnd', complete) | ||
.emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : | ||
complete() | ||
} | ||
} | ||
, hide: function () { | ||
var that = this | ||
, $tip = this.tip() | ||
Tooltip.prototype.applyPlacement = function (offset, placement) { | ||
var $tip = this.tip() | ||
var width = $tip[0].offsetWidth | ||
var height = $tip[0].offsetHeight | ||
$tip.removeClass('in') | ||
// manually read margins because getBoundingClientRect includes difference | ||
var marginTop = parseInt($tip.css('margin-top'), 10) | ||
var marginLeft = parseInt($tip.css('margin-left'), 10) | ||
function removeWithAnimation() { | ||
var timeout = setTimeout(function () { | ||
$tip.off($.support.transition.end).remove() | ||
}, 500) | ||
// we must check for NaN for ie 8/9 | ||
if (isNaN(marginTop)) marginTop = 0 | ||
if (isNaN(marginLeft)) marginLeft = 0 | ||
$tip.one($.support.transition.end, function () { | ||
clearTimeout(timeout) | ||
$tip.remove() | ||
offset.top += marginTop | ||
offset.left += marginLeft | ||
// $.fn.offset doesn't round pixel values | ||
// so we use setOffset directly with our own function B-0 | ||
$.offset.setOffset($tip[0], $.extend({ | ||
using: function (props) { | ||
$tip.css({ | ||
top: Math.round(props.top), | ||
left: Math.round(props.left) | ||
}) | ||
} | ||
}, offset), 0) | ||
$.support.transition && this.$tip.hasClass('fade') ? | ||
removeWithAnimation() : | ||
$tip.remove() | ||
$tip.addClass('in') | ||
return this | ||
// check to see if placing tip in new offset caused the tip to resize itself | ||
var actualWidth = $tip[0].offsetWidth | ||
var actualHeight = $tip[0].offsetHeight | ||
if (placement == 'top' && actualHeight != height) { | ||
offset.top = offset.top + height - actualHeight | ||
} | ||
, fixTitle: function () { | ||
var $e = this.$element | ||
if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') { | ||
$e.attr('data-original-title', $e.attr('title') || '').removeAttr('title') | ||
var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight) | ||
if (delta.left) offset.left += delta.left | ||
else offset.top += delta.top | ||
var isVertical = /top|bottom/.test(placement) | ||
var arrowDelta = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight | ||
var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight' | ||
$tip.offset(offset) | ||
this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical) | ||
} | ||
Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) { | ||
this.arrow() | ||
.css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%') | ||
.css(isVertical ? 'top' : 'left', '') | ||
} | ||
Tooltip.prototype.setContent = function () { | ||
var $tip = this.tip() | ||
var title = this.getTitle() | ||
if (this.options.html) { | ||
if (this.options.sanitize) { | ||
title = sanitizeHtml(title, this.options.whiteList, this.options.sanitizeFn) | ||
} | ||
} | ||
, hasContent: function () { | ||
return this.getTitle() | ||
$tip.find('.tooltip-inner').html(title) | ||
} else { | ||
$tip.find('.tooltip-inner').text(title) | ||
} | ||
, getPosition: function (inside) { | ||
return $.extend({}, (inside ? {top: 0, left: 0} : this.$element.offset()), { | ||
width: this.$element[0].offsetWidth | ||
, height: this.$element[0].offsetHeight | ||
}) | ||
$tip.removeClass('fade in top bottom left right') | ||
} | ||
Tooltip.prototype.hide = function (callback) { | ||
var that = this | ||
var $tip = $(this.$tip) | ||
var e = $.Event('hide.bs.' + this.type) | ||
function complete() { | ||
if (that.hoverState != 'in') $tip.detach() | ||
if (that.$element) { // TODO: Check whether guarding this code with this `if` is really necessary. | ||
that.$element | ||
.removeAttr('aria-describedby') | ||
.trigger('hidden.bs.' + that.type) | ||
} | ||
callback && callback() | ||
} | ||
, getTitle: function () { | ||
var title | ||
, $e = this.$element | ||
, o = this.options | ||
this.$element.trigger(e) | ||
title = $e.attr('data-original-title') | ||
|| (typeof o.title == 'function' ? o.title.call($e[0]) : o.title) | ||
if (e.isDefaultPrevented()) return | ||
return title | ||
$tip.removeClass('in') | ||
$.support.transition && $tip.hasClass('fade') ? | ||
$tip | ||
.one('bsTransitionEnd', complete) | ||
.emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : | ||
complete() | ||
this.hoverState = null | ||
return this | ||
} | ||
Tooltip.prototype.fixTitle = function () { | ||
var $e = this.$element | ||
if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') { | ||
$e.attr('data-original-title', $e.attr('title') || '').attr('title', '') | ||
} | ||
} | ||
, tip: function () { | ||
return this.$tip = this.$tip || $(this.options.template) | ||
Tooltip.prototype.hasContent = function () { | ||
return this.getTitle() | ||
} | ||
Tooltip.prototype.getPosition = function ($element) { | ||
$element = $element || this.$element | ||
var el = $element[0] | ||
var isBody = el.tagName == 'BODY' | ||
var elRect = el.getBoundingClientRect() | ||
if (elRect.width == null) { | ||
// width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093 | ||
elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top }) | ||
} | ||
var isSvg = window.SVGElement && el instanceof window.SVGElement | ||
// Avoid using $.offset() on SVGs since it gives incorrect results in jQuery 3. | ||
// See https://github.com/twbs/bootstrap/issues/20280 | ||
var elOffset = isBody ? { top: 0, left: 0 } : (isSvg ? null : $element.offset()) | ||
var scroll = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() } | ||
var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null | ||
, validate: function () { | ||
if (!this.$element[0].parentNode) { | ||
this.hide() | ||
this.$element = null | ||
this.options = null | ||
return $.extend({}, elRect, scroll, outerDims, elOffset) | ||
} | ||
Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) { | ||
return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } : | ||
placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } : | ||
placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } : | ||
/* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width } | ||
} | ||
Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) { | ||
var delta = { top: 0, left: 0 } | ||
if (!this.$viewport) return delta | ||
var viewportPadding = this.options.viewport && this.options.viewport.padding || 0 | ||
var viewportDimensions = this.getPosition(this.$viewport) | ||
if (/right|left/.test(placement)) { | ||
var topEdgeOffset = pos.top - viewportPadding - viewportDimensions.scroll | ||
var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight | ||
if (topEdgeOffset < viewportDimensions.top) { // top overflow | ||
delta.top = viewportDimensions.top - topEdgeOffset | ||
} else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow | ||
delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset | ||
} | ||
} else { | ||
var leftEdgeOffset = pos.left - viewportPadding | ||
var rightEdgeOffset = pos.left + viewportPadding + actualWidth | ||
if (leftEdgeOffset < viewportDimensions.left) { // left overflow | ||
delta.left = viewportDimensions.left - leftEdgeOffset | ||
} else if (rightEdgeOffset > viewportDimensions.right) { // right overflow | ||
delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset | ||
} | ||
} | ||
, enable: function () { | ||
this.enabled = true | ||
} | ||
return delta | ||
} | ||
, disable: function () { | ||
this.enabled = false | ||
} | ||
Tooltip.prototype.getTitle = function () { | ||
var title | ||
var $e = this.$element | ||
var o = this.options | ||
, toggleEnabled: function () { | ||
this.enabled = !this.enabled | ||
title = $e.attr('data-original-title') | ||
|| (typeof o.title == 'function' ? o.title.call($e[0]) : o.title) | ||
return title | ||
} | ||
Tooltip.prototype.getUID = function (prefix) { | ||
do prefix += ~~(Math.random() * 1000000) | ||
while (document.getElementById(prefix)) | ||
return prefix | ||
} | ||
Tooltip.prototype.tip = function () { | ||
if (!this.$tip) { | ||
this.$tip = $(this.options.template) | ||
if (this.$tip.length != 1) { | ||
throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!') | ||
} | ||
} | ||
return this.$tip | ||
} | ||
, toggle: function () { | ||
this[this.tip().hasClass('in') ? 'hide' : 'show']() | ||
Tooltip.prototype.arrow = function () { | ||
return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')) | ||
} | ||
Tooltip.prototype.enable = function () { | ||
this.enabled = true | ||
} | ||
Tooltip.prototype.disable = function () { | ||
this.enabled = false | ||
} | ||
Tooltip.prototype.toggleEnabled = function () { | ||
this.enabled = !this.enabled | ||
} | ||
Tooltip.prototype.toggle = function (e) { | ||
var self = this | ||
if (e) { | ||
self = $(e.currentTarget).data('bs.' + this.type) | ||
if (!self) { | ||
self = new this.constructor(e.currentTarget, this.getDelegateOptions()) | ||
$(e.currentTarget).data('bs.' + this.type, self) | ||
} | ||
} | ||
, destroy: function () { | ||
this.hide().$element.off('.' + this.type).removeData(this.type) | ||
if (e) { | ||
self.inState.click = !self.inState.click | ||
if (self.isInStateTrue()) self.enter(self) | ||
else self.leave(self) | ||
} else { | ||
self.tip().hasClass('in') ? self.leave(self) : self.enter(self) | ||
} | ||
} | ||
Tooltip.prototype.destroy = function () { | ||
var that = this | ||
clearTimeout(this.timeout) | ||
this.hide(function () { | ||
that.$element.off('.' + that.type).removeData('bs.' + that.type) | ||
if (that.$tip) { | ||
that.$tip.detach() | ||
} | ||
that.$tip = null | ||
that.$arrow = null | ||
that.$viewport = null | ||
that.$element = null | ||
}) | ||
} | ||
Tooltip.prototype.sanitizeHtml = function (unsafeHtml) { | ||
return sanitizeHtml(unsafeHtml, this.options.whiteList, this.options.sanitizeFn) | ||
} | ||
/* TOOLTIP PLUGIN DEFINITION | ||
* ========================= */ | ||
// TOOLTIP PLUGIN DEFINITION | ||
// ========================= | ||
$.fn.tooltip = function ( option ) { | ||
function Plugin(option) { | ||
return this.each(function () { | ||
var $this = $(this) | ||
, data = $this.data('tooltip') | ||
, options = typeof option == 'object' && option | ||
if (!data) $this.data('tooltip', (data = new Tooltip(this, options))) | ||
var $this = $(this) | ||
var data = $this.data('bs.tooltip') | ||
var options = typeof option == 'object' && option | ||
if (!data && /destroy|hide/.test(option)) return | ||
if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options))) | ||
if (typeof option == 'string') data[option]() | ||
@@ -262,15 +663,16 @@ }) | ||
var old = $.fn.tooltip | ||
$.fn.tooltip = Plugin | ||
$.fn.tooltip.Constructor = Tooltip | ||
$.fn.tooltip.defaults = { | ||
animation: true | ||
, placement: 'top' | ||
, selector: false | ||
, template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>' | ||
, trigger: 'hover' | ||
, title: '' | ||
, delay: 0 | ||
, html: true | ||
// TOOLTIP NO CONFLICT | ||
// =================== | ||
$.fn.tooltip.noConflict = function () { | ||
$.fn.tooltip = old | ||
return this | ||
} | ||
}(window.jQuery); | ||
}(jQuery); |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
640237
15475
2