├── 2016 ├── 11 │ └── 08 │ │ └── redis不谈缓存和队列 │ │ └── index.html └── 04 │ └── 28 │ └── 如何优雅的设计java异常 │ └── index.html ├── 2017 ├── 10 │ └── 13 │ │ └── java编程最佳实践 │ │ └── index.html ├── 03 │ └── 04 │ │ └── 细思极恐-你真的会写java吗 │ │ └── index.html └── 07 │ └── 09 │ └── 再谈websocket-论架构设计 │ └── index.html ├── 2018 ├── 01 │ └── 25 │ │ └── 正确的打日志姿势 │ │ └── index.html ├── 05 │ └── 09 │ │ └── java 10中的局部类型推断,好像并没什么用!(翻译文章) │ │ └── index.html ├── 06 │ └── 11 │ │ └── 做IT,需要一种情怀,thougthworks │ │ └── index.html └── 08 │ └── 30 │ └── java匠人手法-优雅的处理空值 │ └── index.html ├── 2020 └── 01 │ └── 19 │ └── 2019小结 │ └── index.html ├── aboutme └── index.html ├── archives ├── 2016 │ ├── 11 │ │ └── index.html │ ├── 04 │ │ └── index.html │ └── index.html ├── 2017 │ ├── 10 │ │ └── index.html │ ├── 03 │ │ └── index.html │ ├── 07 │ │ └── index.html │ └── index.html ├── 2018 │ ├── 01 │ │ └── index.html │ ├── 05 │ │ └── index.html │ ├── 06 │ │ └── index.html │ ├── 08 │ │ └── index.html │ └── index.html ├── 2020 │ ├── 01 │ │ └── index.html │ └── index.html └── index.html ├── categories ├── java │ └── index.html └── java匠人手法 │ └── index.html ├── css └── main.css ├── favicon.ico ├── images ├── Supportedbrowser.jpeg ├── WeChat_1499585246.jpeg ├── WeChat_1499585625.jpeg ├── avatar.gif ├── cc-by-nc-nd.svg ├── cc-by-nc-sa.svg ├── cc-by-nc.svg ├── cc-by-nd.svg ├── cc-by-sa.svg ├── cc-by.svg ├── cc-zero.svg ├── compareWebsocketHttp.png ├── default_avatar.jpg ├── httpwebsocket.jpg ├── loading.gif ├── message-flow-simple-broker.png ├── placeholder.gif ├── quote-l.svg ├── quote-r.svg └── searchicon.png ├── index.html ├── js └── src │ ├── affix.js │ ├── bootstrap.js │ ├── hook-duoshuo.js │ ├── motion.js │ ├── post-details.js │ ├── schemes │ └── pisces.js │ ├── scrollspy.js │ └── utils.js ├── lib ├── fancybox │ └── source │ │ ├── blank.gif │ │ ├── fancybox_loading.gif │ │ ├── fancybox_loading@2x.gif │ │ ├── fancybox_overlay.png │ │ ├── fancybox_sprite.png │ │ ├── fancybox_sprite@2x.png │ │ ├── helpers │ │ ├── fancybox_buttons.png │ │ ├── jquery.fancybox-buttons.css │ │ ├── jquery.fancybox-buttons.js │ │ ├── jquery.fancybox-media.js │ │ ├── jquery.fancybox-thumbs.css │ │ └── jquery.fancybox-thumbs.js │ │ ├── jquery.fancybox.css │ │ ├── jquery.fancybox.js │ │ └── jquery.fancybox.pack.js ├── fastclick │ ├── LICENSE │ ├── README.html │ ├── bower.json │ └── lib │ │ ├── fastclick.js │ │ └── fastclick.min.js ├── font-awesome │ ├── HELP-US-OUT.txt │ ├── bower.json │ ├── css │ │ ├── font-awesome.css │ │ ├── font-awesome.css.map │ │ └── font-awesome.min.css │ └── fonts │ │ ├── FontAwesome.otf │ │ ├── fontawesome-webfont.eot │ │ ├── fontawesome-webfont.svg │ │ ├── fontawesome-webfont.ttf │ │ ├── fontawesome-webfont.woff │ │ └── fontawesome-webfont.woff2 ├── jquery │ └── index.js ├── jquery_lazyload │ ├── CONTRIBUTING.html │ ├── README.html │ ├── bower.json │ ├── jquery.lazyload.js │ └── jquery.scrollstop.js ├── ua-parser-js │ └── dist │ │ ├── ua-parser.min.js │ │ └── ua-parser.pack.js └── velocity │ ├── bower.json │ ├── velocity.js │ ├── velocity.min.js │ ├── velocity.ui.js │ └── velocity.ui.min.js ├── payimage ├── alipay-reward-image.png └── wechat-reward-image.png └── tags ├── exception └── index.html ├── java └── index.html ├── jdk-10 └── index.html ├── logback └── index.html ├── redis └── index.html ├── 日志 └── index.html └── 面试 └── index.html /favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lrwinx/lrwinx.github.io/beda2a2a4e83cce586623446e8156138ca63647f/favicon.ico -------------------------------------------------------------------------------- /images/Supportedbrowser.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lrwinx/lrwinx.github.io/beda2a2a4e83cce586623446e8156138ca63647f/images/Supportedbrowser.jpeg -------------------------------------------------------------------------------- /images/WeChat_1499585246.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lrwinx/lrwinx.github.io/beda2a2a4e83cce586623446e8156138ca63647f/images/WeChat_1499585246.jpeg -------------------------------------------------------------------------------- /images/WeChat_1499585625.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lrwinx/lrwinx.github.io/beda2a2a4e83cce586623446e8156138ca63647f/images/WeChat_1499585625.jpeg -------------------------------------------------------------------------------- /images/avatar.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lrwinx/lrwinx.github.io/beda2a2a4e83cce586623446e8156138ca63647f/images/avatar.gif -------------------------------------------------------------------------------- /images/cc-by-nc-nd.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 19 | 21 | 24 | 31 | 32 | 33 | 56 | 58 | 59 | 61 | image/svg+xml 62 | 64 | 65 | 66 | 67 | 71 | 74 | 77 | 84 | 91 | 96 | 100 | 109 | 113 | 114 | 115 | 119 | 120 | 121 | 122 | -------------------------------------------------------------------------------- /images/cc-by-nc.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 19 | 21 | 24 | 31 | 32 | 33 | 56 | 58 | 59 | 61 | image/svg+xml 62 | 64 | 65 | 66 | 67 | 71 | 74 | 77 | 84 | 91 | 96 | 100 | 109 | 113 | 114 | 115 | 119 | 120 | 121 | 122 | -------------------------------------------------------------------------------- /images/cc-by-nd.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 19 | 21 | 24 | 31 | 32 | 33 | 56 | 58 | 59 | 61 | image/svg+xml 62 | 64 | 65 | 66 | 67 | 71 | 74 | 81 | 88 | 93 | 97 | 106 | 110 | 111 | 115 | 116 | 117 | 118 | -------------------------------------------------------------------------------- /images/cc-by-sa.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 19 | 21 | 24 | 31 | 32 | 33 | 56 | 58 | 59 | 61 | image/svg+xml 62 | 64 | 65 | 66 | 67 | 71 | 74 | 77 | 84 | 91 | 96 | 100 | 109 | 113 | 114 | 115 | 119 | 120 | 121 | 122 | -------------------------------------------------------------------------------- /images/cc-by.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 19 | 21 | 24 | 31 | 32 | 33 | 56 | 58 | 59 | 61 | image/svg+xml 62 | 64 | 65 | 66 | 67 | 71 | 74 | 77 | 84 | 91 | 96 | 100 | 109 | 113 | 114 | 115 | 119 | 120 | 121 | 122 | -------------------------------------------------------------------------------- /images/cc-zero.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 17 | 26 | 27 | 28 | 29 | 30 | 31 | 35 | 38 | 45 | 46 | 47 | 53 | 57 | 63 | 66 | 68 | 69 | 70 | 71 | 72 | 73 | -------------------------------------------------------------------------------- /images/compareWebsocketHttp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lrwinx/lrwinx.github.io/beda2a2a4e83cce586623446e8156138ca63647f/images/compareWebsocketHttp.png -------------------------------------------------------------------------------- /images/default_avatar.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lrwinx/lrwinx.github.io/beda2a2a4e83cce586623446e8156138ca63647f/images/default_avatar.jpg -------------------------------------------------------------------------------- /images/httpwebsocket.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lrwinx/lrwinx.github.io/beda2a2a4e83cce586623446e8156138ca63647f/images/httpwebsocket.jpg -------------------------------------------------------------------------------- /images/loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lrwinx/lrwinx.github.io/beda2a2a4e83cce586623446e8156138ca63647f/images/loading.gif -------------------------------------------------------------------------------- /images/message-flow-simple-broker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lrwinx/lrwinx.github.io/beda2a2a4e83cce586623446e8156138ca63647f/images/message-flow-simple-broker.png -------------------------------------------------------------------------------- /images/placeholder.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lrwinx/lrwinx.github.io/beda2a2a4e83cce586623446e8156138ca63647f/images/placeholder.gif -------------------------------------------------------------------------------- /images/quote-l.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 8 | 13 | 14 | -------------------------------------------------------------------------------- /images/quote-r.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 8 | 12 | 13 | -------------------------------------------------------------------------------- /images/searchicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lrwinx/lrwinx.github.io/beda2a2a4e83cce586623446e8156138ca63647f/images/searchicon.png -------------------------------------------------------------------------------- /js/src/affix.js: -------------------------------------------------------------------------------- 1 | /* ======================================================================== 2 | * Bootstrap: affix.js v3.3.5 3 | * http://getbootstrap.com/javascript/#affix 4 | * ======================================================================== 5 | * Copyright 2011-2015 Twitter, Inc. 6 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 7 | * ======================================================================== */ 8 | 9 | 10 | +function ($) { 11 | 'use strict'; 12 | 13 | // AFFIX CLASS DEFINITION 14 | // ====================== 15 | 16 | var Affix = function (element, options) { 17 | this.options = $.extend({}, Affix.DEFAULTS, options) 18 | 19 | this.$target = $(this.options.target) 20 | .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this)) 21 | .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this)) 22 | 23 | this.$element = $(element) 24 | this.affixed = null 25 | this.unpin = null 26 | this.pinnedOffset = null 27 | 28 | this.checkPosition() 29 | } 30 | 31 | Affix.VERSION = '3.3.5' 32 | 33 | Affix.RESET = 'affix affix-top affix-bottom' 34 | 35 | Affix.DEFAULTS = { 36 | offset: 0, 37 | target: window 38 | } 39 | 40 | Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) { 41 | var scrollTop = this.$target.scrollTop() 42 | var position = this.$element.offset() 43 | var targetHeight = this.$target.height() 44 | 45 | if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false 46 | 47 | if (this.affixed == 'bottom') { 48 | if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom' 49 | return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom' 50 | } 51 | 52 | var initializing = this.affixed == null 53 | var colliderTop = initializing ? scrollTop : position.top 54 | var colliderHeight = initializing ? targetHeight : height 55 | 56 | if (offsetTop != null && scrollTop <= offsetTop) return 'top' 57 | if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom' 58 | 59 | return false 60 | } 61 | 62 | Affix.prototype.getPinnedOffset = function () { 63 | if (this.pinnedOffset) return this.pinnedOffset 64 | this.$element.removeClass(Affix.RESET).addClass('affix') 65 | var scrollTop = this.$target.scrollTop() 66 | var position = this.$element.offset() 67 | return (this.pinnedOffset = position.top - scrollTop) 68 | } 69 | 70 | Affix.prototype.checkPositionWithEventLoop = function () { 71 | setTimeout($.proxy(this.checkPosition, this), 1) 72 | } 73 | 74 | Affix.prototype.checkPosition = function () { 75 | if (!this.$element.is(':visible')) return 76 | 77 | var height = this.$element.height() 78 | var offset = this.options.offset 79 | var offsetTop = offset.top 80 | var offsetBottom = offset.bottom 81 | var scrollHeight = Math.max($(document).height(), $(document.body).height()) 82 | 83 | if (typeof offset != 'object') offsetBottom = offsetTop = offset 84 | if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element) 85 | if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element) 86 | 87 | var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom) 88 | 89 | if (this.affixed != affix) { 90 | if (this.unpin != null) this.$element.css('top', '') 91 | 92 | var affixType = 'affix' + (affix ? '-' + affix : '') 93 | var e = $.Event(affixType + '.bs.affix') 94 | 95 | this.$element.trigger(e) 96 | 97 | if (e.isDefaultPrevented()) return 98 | 99 | this.affixed = affix 100 | this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null 101 | 102 | this.$element 103 | .removeClass(Affix.RESET) 104 | .addClass(affixType) 105 | .trigger(affixType.replace('affix', 'affixed') + '.bs.affix') 106 | } 107 | 108 | if (affix == 'bottom') { 109 | this.$element.offset({ 110 | top: scrollHeight - height - offsetBottom 111 | }) 112 | } 113 | } 114 | 115 | 116 | // AFFIX PLUGIN DEFINITION 117 | // ======================= 118 | 119 | function Plugin(option) { 120 | return this.each(function () { 121 | var $this = $(this) 122 | var data = $this.data('bs.affix') 123 | var options = typeof option == 'object' && option 124 | 125 | if (!data) $this.data('bs.affix', (data = new Affix(this, options))) 126 | if (typeof option == 'string') data[option]() 127 | }) 128 | } 129 | 130 | var old = $.fn.affix 131 | 132 | $.fn.affix = Plugin 133 | $.fn.affix.Constructor = Affix 134 | 135 | 136 | // AFFIX NO CONFLICT 137 | // ================= 138 | 139 | $.fn.affix.noConflict = function () { 140 | $.fn.affix = old 141 | return this 142 | } 143 | 144 | 145 | // AFFIX DATA-API 146 | // ============== 147 | 148 | $(window).on('load', function () { 149 | $('[data-spy="affix"]').each(function () { 150 | var $spy = $(this) 151 | var data = $spy.data() 152 | 153 | data.offset = data.offset || {} 154 | 155 | if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom 156 | if (data.offsetTop != null) data.offset.top = data.offsetTop 157 | 158 | Plugin.call($spy, data) 159 | }) 160 | }) 161 | 162 | }(jQuery); 163 | -------------------------------------------------------------------------------- /js/src/bootstrap.js: -------------------------------------------------------------------------------- 1 | /* global NexT: true */ 2 | 3 | $(document).ready(function () { 4 | 5 | $(document).trigger('bootstrap:before'); 6 | 7 | NexT.utils.isMobile() && window.FastClick.attach(document.body); 8 | 9 | NexT.utils.lazyLoadPostsImages(); 10 | 11 | NexT.utils.registerBackToTop(); 12 | 13 | $('.site-nav-toggle button').on('click', function () { 14 | var $siteNav = $('.site-nav'); 15 | var ON_CLASS_NAME = 'site-nav-on'; 16 | var isSiteNavOn = $siteNav.hasClass(ON_CLASS_NAME); 17 | var animateAction = isSiteNavOn ? 'slideUp' : 'slideDown'; 18 | var animateCallback = isSiteNavOn ? 'removeClass' : 'addClass'; 19 | 20 | $siteNav.stop()[animateAction]('fast', function () { 21 | $siteNav[animateCallback](ON_CLASS_NAME); 22 | }); 23 | }); 24 | 25 | 26 | CONFIG.fancybox && NexT.utils.wrapImageWithFancyBox(); 27 | NexT.utils.embeddedVideoTransformer(); 28 | NexT.utils.addActiveClassToMenuItem(); 29 | 30 | 31 | // Define Motion Sequence. 32 | NexT.motion.integrator 33 | .add(NexT.motion.middleWares.logo) 34 | .add(NexT.motion.middleWares.menu) 35 | .add(NexT.motion.middleWares.postList) 36 | .add(NexT.motion.middleWares.sidebar); 37 | 38 | $(document).trigger('motion:before'); 39 | 40 | // Bootstrap Motion. 41 | CONFIG.motion && NexT.motion.integrator.bootstrap(); 42 | 43 | $(document).trigger('bootstrap:after'); 44 | }); 45 | -------------------------------------------------------------------------------- /js/src/hook-duoshuo.js: -------------------------------------------------------------------------------- 1 | /* global DUOSHUO: true */ 2 | /* jshint camelcase: false */ 3 | 4 | typeof DUOSHUO !== 'undefined' ? 5 | hookTemplate() : 6 | ($('#duoshuo-script')[0].onload = hookTemplate); 7 | 8 | 9 | function hookTemplate() { 10 | var post = DUOSHUO.templates.post; 11 | 12 | DUOSHUO.templates.post = function (e, t) { 13 | var rs = post(e, t); 14 | var agent = e.post.agent; 15 | var userId = e.post.author.user_id; 16 | var admin = ''; 17 | 18 | if (userId && (userId == CONFIG.duoshuo.userId)) { 19 | admin = '' + CONFIG.duoshuo.author + ''; 20 | } 21 | 22 | if (agent && /^Mozilla/.test(agent)) { 23 | rs = rs.replace(/<\/div>

/, admin + getAgentInfo(agent) + '

'); 24 | } 25 | 26 | return rs; 27 | }; 28 | } 29 | 30 | function getAgentInfo(string) { 31 | $.ua.set(string); 32 | 33 | var UNKNOWN = 'Unknown'; 34 | var sua = $.ua; 35 | var separator = isMobile() ? '

' : ''; 36 | var osName = sua.os.name || UNKNOWN; 37 | var osVersion = sua.os.version || UNKNOWN; 38 | var browserName = sua.browser.name || UNKNOWN; 39 | var browserVersion = sua.browser.version || UNKNOWN; 40 | var iconMapping = { 41 | os: { 42 | android : 'android', 43 | linux : 'linux', 44 | windows : 'windows', 45 | ios : 'apple', 46 | 'mac os': 'apple', 47 | unknown : 'desktop' 48 | }, 49 | browser: { 50 | chrome : 'chrome', 51 | chromium : 'chrome', 52 | firefox : 'firefox', 53 | opera : 'opera', 54 | safari : 'safari', 55 | ie : 'internet-explorer', 56 | wechat : 'wechat', 57 | qq : 'qq', 58 | unknown : 'globe' 59 | } 60 | }; 61 | var osIcon = iconMapping.os[osName.toLowerCase()]; 62 | var browserIcon = iconMapping.browser[getBrowserKey()]; 63 | 64 | return separator + 65 | '' + 66 | '' + 67 | osName + ' ' + osVersion + 68 | '' + separator + 69 | '' + 70 | '' + 71 | browserName + ' ' + browserVersion + 72 | ''; 73 | 74 | function getBrowserKey () { 75 | var key = browserName.toLowerCase(); 76 | 77 | if (key.match(/WeChat/i)) { 78 | return 'wechat'; 79 | } 80 | 81 | if (key.match(/QQBrowser/i)) { 82 | return 'qq'; 83 | } 84 | 85 | return key; 86 | } 87 | 88 | function isMobile() { 89 | var userAgent = window.navigator.userAgent; 90 | 91 | var isiPad = userAgent.match(/iPad/i) !== null; 92 | var mobileUA = [ 93 | 'iphone', 'android', 'phone', 'mobile', 94 | 'wap', 'netfront', 'x11', 'java', 'opera mobi', 95 | 'opera mini', 'ucweb', 'windows ce', 'symbian', 96 | 'symbianos', 'series', 'webos', 'sony', 97 | 'blackberry', 'dopod', 'nokia', 'samsung', 98 | 'palmsource', 'xda', 'pieplus', 'meizu', 99 | 'midp' ,'cldc' , 'motorola', 'foma', 100 | 'docomo', 'up.browser', 'up.link', 'blazer', 101 | 'helio', 'hosin', 'huawei', 'novarra', 102 | 'coolpad', 'webos', 'techfaith', 'palmsource', 103 | 'alcatel', 'amoi', 'ktouch', 'nexian', 104 | 'ericsson', 'philips', 'sagem', 'wellcom', 105 | 'bunjalloo', 'maui', 'smartphone', 'iemobile', 106 | 'spice', 'bird', 'zte-', 'longcos', 107 | 'pantech', 'gionee', 'portalmmm', 'jig browser', 108 | 'hiptop', 'benq', 'haier', '^lct', 109 | '320x320', '240x320', '176x220' 110 | ]; 111 | var pattern = new RegExp(mobileUA.join('|'), 'i'); 112 | 113 | return !isiPad && userAgent.match(pattern); 114 | } 115 | } 116 | -------------------------------------------------------------------------------- /js/src/motion.js: -------------------------------------------------------------------------------- 1 | /* global NexT: true */ 2 | 3 | $(document).ready(function () { 4 | NexT.motion = {}; 5 | 6 | var sidebarToggleLines = { 7 | lines: [], 8 | push: function (line) { 9 | this.lines.push(line); 10 | }, 11 | init: function () { 12 | this.lines.forEach(function (line) { 13 | line.init(); 14 | }); 15 | }, 16 | arrow: function () { 17 | this.lines.forEach(function (line) { 18 | line.arrow(); 19 | }); 20 | }, 21 | close: function () { 22 | this.lines.forEach(function (line) { 23 | line.close(); 24 | }); 25 | } 26 | }; 27 | 28 | function SidebarToggleLine(settings) { 29 | this.el = $(settings.el); 30 | this.status = $.extend({}, { 31 | init: { 32 | width: '100%', 33 | opacity: 1, 34 | left: 0, 35 | rotateZ: 0, 36 | top: 0 37 | } 38 | }, settings.status); 39 | } 40 | 41 | SidebarToggleLine.prototype.init = function () { 42 | this.transform('init'); 43 | }; 44 | SidebarToggleLine.prototype.arrow = function () { 45 | this.transform('arrow'); 46 | }; 47 | SidebarToggleLine.prototype.close = function () { 48 | this.transform('close'); 49 | }; 50 | SidebarToggleLine.prototype.transform = function (status) { 51 | this.el.velocity('stop').velocity(this.status[status]); 52 | }; 53 | 54 | var sidebarToggleLine1st = new SidebarToggleLine({ 55 | el: '.sidebar-toggle-line-first', 56 | status: { 57 | arrow: {width: '50%', rotateZ: '-45deg', top: '2px'}, 58 | close: {width: '100%', rotateZ: '-45deg', top: '5px'} 59 | } 60 | }); 61 | var sidebarToggleLine2nd = new SidebarToggleLine({ 62 | el: '.sidebar-toggle-line-middle', 63 | status: { 64 | arrow: {width: '90%'}, 65 | close: {opacity: 0} 66 | } 67 | }); 68 | var sidebarToggleLine3rd = new SidebarToggleLine({ 69 | el: '.sidebar-toggle-line-last', 70 | status: { 71 | arrow: {width: '50%', rotateZ: '45deg', top: '-2px'}, 72 | close: {width: '100%', rotateZ: '45deg', top: '-5px'} 73 | } 74 | }); 75 | 76 | sidebarToggleLines.push(sidebarToggleLine1st); 77 | sidebarToggleLines.push(sidebarToggleLine2nd); 78 | sidebarToggleLines.push(sidebarToggleLine3rd); 79 | 80 | var SIDEBAR_WIDTH = '320px'; 81 | var SIDEBAR_DISPLAY_DURATION = 200; 82 | 83 | var sidebarToggleMotion = { 84 | toggleEl: $('.sidebar-toggle'), 85 | sidebarEl: $('.sidebar'), 86 | isSidebarVisible: false, 87 | init: function () { 88 | this.toggleEl.on('click', this.clickHandler.bind(this)); 89 | this.toggleEl.on('mouseenter', this.mouseEnterHandler.bind(this)); 90 | this.toggleEl.on('mouseleave', this.mouseLeaveHandler.bind(this)); 91 | 92 | $(document) 93 | .on('sidebar.isShowing', function () { 94 | NexT.utils.isDesktop() && $('body').velocity('stop').velocity( 95 | {paddingRight: SIDEBAR_WIDTH}, 96 | SIDEBAR_DISPLAY_DURATION 97 | ); 98 | }) 99 | .on('sidebar.isHiding', function () { 100 | }); 101 | }, 102 | clickHandler: function () { 103 | this.isSidebarVisible ? this.hideSidebar() : this.showSidebar(); 104 | this.isSidebarVisible = !this.isSidebarVisible; 105 | }, 106 | mouseEnterHandler: function () { 107 | if (this.isSidebarVisible) { 108 | return; 109 | } 110 | sidebarToggleLines.arrow(); 111 | }, 112 | mouseLeaveHandler: function () { 113 | if (this.isSidebarVisible) { 114 | return; 115 | } 116 | sidebarToggleLines.init(); 117 | }, 118 | showSidebar: function () { 119 | var self = this; 120 | 121 | sidebarToggleLines.close(); 122 | 123 | this.sidebarEl.velocity('stop').velocity({ 124 | width: SIDEBAR_WIDTH 125 | }, { 126 | display: 'block', 127 | duration: SIDEBAR_DISPLAY_DURATION, 128 | begin: function () { 129 | $('.sidebar .motion-element').velocity( 130 | 'transition.slideRightIn', 131 | { 132 | stagger: 50, 133 | drag: true, 134 | complete: function () { 135 | self.sidebarEl.trigger('sidebar.motion.complete'); 136 | } 137 | } 138 | ); 139 | }, 140 | complete: function () { 141 | self.sidebarEl.addClass('sidebar-active'); 142 | self.sidebarEl.trigger('sidebar.didShow'); 143 | } 144 | } 145 | ); 146 | 147 | this.sidebarEl.trigger('sidebar.isShowing'); 148 | }, 149 | hideSidebar: function () { 150 | NexT.utils.isDesktop() && $('body').velocity('stop').velocity({paddingRight: 0}); 151 | this.sidebarEl.find('.motion-element').velocity('stop').css('display', 'none'); 152 | this.sidebarEl.velocity('stop').velocity({width: 0}, {display: 'none'}); 153 | 154 | sidebarToggleLines.init(); 155 | 156 | this.sidebarEl.removeClass('sidebar-active'); 157 | this.sidebarEl.trigger('sidebar.isHiding'); 158 | 159 | //在 post 页面下按下隐藏 sidebar 时如果当前选中的是“站点概览”,将 toc 去除 motion 效果 160 | //防止再次打开时会出现在“站点概览”下的 bug 161 | if (!!$('.post-toc-wrap')) { 162 | if ($('.site-overview').css('display') === 'block') { 163 | $('.post-toc-wrap').removeClass('motion-element'); 164 | } 165 | } 166 | } 167 | }; 168 | sidebarToggleMotion.init(); 169 | 170 | NexT.motion.integrator = { 171 | queue: [], 172 | cursor: -1, 173 | add: function (fn) { 174 | this.queue.push(fn); 175 | return this; 176 | }, 177 | next: function () { 178 | this.cursor++; 179 | var fn = this.queue[this.cursor]; 180 | $.isFunction(fn) && fn(NexT.motion.integrator); 181 | }, 182 | bootstrap: function () { 183 | this.next(); 184 | } 185 | }; 186 | 187 | NexT.motion.middleWares = { 188 | logo: function (integrator) { 189 | var sequence = []; 190 | var $brand = $('.brand'); 191 | var $title = $('.site-title'); 192 | var $subtitle = $('.site-subtitle'); 193 | var $logoLineTop = $('.logo-line-before i'); 194 | var $logoLineBottom = $('.logo-line-after i'); 195 | 196 | $brand.size() > 0 && sequence.push({ 197 | e: $brand, 198 | p: {opacity: 1}, 199 | o: {duration: 200} 200 | }); 201 | 202 | NexT.utils.isMist() && hasElement([$logoLineTop, $logoLineBottom]) && 203 | sequence.push( 204 | getMistLineSettings($logoLineTop, '100%'), 205 | getMistLineSettings($logoLineBottom, '-100%') 206 | ); 207 | 208 | hasElement($title) && sequence.push({ 209 | e: $title, 210 | p: {opacity: 1, top: 0}, 211 | o: { duration: 200 } 212 | }); 213 | 214 | hasElement($subtitle) && sequence.push({ 215 | e: $subtitle, 216 | p: {opacity: 1, top: 0}, 217 | o: {duration: 200} 218 | }); 219 | 220 | if (sequence.length > 0) { 221 | sequence[sequence.length - 1].o.complete = function () { 222 | integrator.next(); 223 | }; 224 | $.Velocity.RunSequence(sequence); 225 | } else { 226 | integrator.next(); 227 | } 228 | 229 | 230 | function getMistLineSettings (element, translateX) { 231 | return { 232 | e: $(element), 233 | p: {translateX: translateX}, 234 | o: { 235 | duration: 500, 236 | sequenceQueue: false 237 | } 238 | }; 239 | } 240 | 241 | /** 242 | * Check if $elements exist. 243 | * @param {jQuery|Array} $elements 244 | * @returns {boolean} 245 | */ 246 | function hasElement ($elements) { 247 | $elements = Array.isArray($elements) ? $elements : [$elements]; 248 | return $elements.every(function ($element) { 249 | return $.isFunction($element.size) && $element.size() > 0; 250 | }); 251 | } 252 | }, 253 | 254 | menu: function (integrator) { 255 | $('.menu-item').velocity('transition.slideDownIn', { 256 | display: null, 257 | duration: 200, 258 | complete: function () { 259 | integrator.next(); 260 | } 261 | }); 262 | }, 263 | 264 | postList: function (integrator) { 265 | var $post = $('.post'); 266 | var hasPost = $post.size() > 0; 267 | 268 | hasPost ? postMotion() : integrator.next(); 269 | 270 | function postMotion () { 271 | var postMotionOptions = window.postMotionOptions || { 272 | stagger: 100, 273 | drag: true 274 | }; 275 | postMotionOptions.complete = function () { 276 | integrator.next(); 277 | }; 278 | 279 | $post.velocity('transition.slideDownIn', postMotionOptions); 280 | } 281 | }, 282 | 283 | sidebar: function (integrator) { 284 | if (CONFIG.sidebar.display === 'always') { 285 | NexT.utils.displaySidebar(); 286 | } 287 | integrator.next(); 288 | } 289 | }; 290 | 291 | }); 292 | -------------------------------------------------------------------------------- /js/src/post-details.js: -------------------------------------------------------------------------------- 1 | /* global NexT: true */ 2 | 3 | $(document).ready(function () { 4 | 5 | initScrollSpy(); 6 | NexT.utils.needAffix() && initAffix(); 7 | initTOCDimension(); 8 | 9 | function initScrollSpy () { 10 | var tocSelector = '.post-toc'; 11 | var $tocElement = $(tocSelector); 12 | var activeCurrentSelector = '.active-current'; 13 | 14 | $tocElement 15 | .on('activate.bs.scrollspy', function () { 16 | var $currentActiveElement = $(tocSelector + ' .active').last(); 17 | 18 | removeCurrentActiveClass(); 19 | $currentActiveElement.addClass('active-current'); 20 | }) 21 | .on('clear.bs.scrollspy', removeCurrentActiveClass); 22 | 23 | $('body').scrollspy({ target: tocSelector }); 24 | 25 | function removeCurrentActiveClass () { 26 | $(tocSelector + ' ' + activeCurrentSelector) 27 | .removeClass(activeCurrentSelector.substring(1)); 28 | } 29 | } 30 | 31 | function initAffix () { 32 | var headerHeight = $('.header-inner').height(); 33 | var footerOffset = parseInt($('.main').css('padding-bottom'), 10); 34 | var sidebarTop = headerHeight + 10; 35 | 36 | $('.sidebar-inner').affix({ 37 | offset: { 38 | top: sidebarTop, 39 | bottom: footerOffset 40 | } 41 | }); 42 | 43 | $(document) 44 | .on('affixed.bs.affix', function () { 45 | updateTOCHeight(document.body.clientHeight - 100); 46 | }); 47 | } 48 | 49 | function initTOCDimension () { 50 | var updateTOCHeightTimer; 51 | 52 | $(window).on('resize', function () { 53 | updateTOCHeightTimer && clearTimeout(updateTOCHeightTimer); 54 | 55 | updateTOCHeightTimer = setTimeout(function () { 56 | var tocWrapperHeight = document.body.clientHeight - 100; 57 | 58 | updateTOCHeight(tocWrapperHeight); 59 | }, 0); 60 | }); 61 | 62 | // Initialize TOC Height. 63 | updateTOCHeight(document.body.clientHeight - 100); 64 | 65 | // Initialize TOC Width. 66 | var scrollbarWidth = NexT.utils.getScrollbarWidth(); 67 | $('.post-toc').css('width', 'calc(100% + ' + scrollbarWidth + 'px)'); 68 | } 69 | 70 | function updateTOCHeight (height) { 71 | height = height || 'auto'; 72 | $('.post-toc').css('max-height', height); 73 | } 74 | 75 | }); 76 | 77 | $(document).ready(function () { 78 | var html = $('html'); 79 | var TAB_ANIMATE_DURATION = 200; 80 | var hasVelocity = $.isFunction(html.velocity); 81 | 82 | $('.sidebar-nav li').on('click', function () { 83 | var item = $(this); 84 | var activeTabClassName = 'sidebar-nav-active'; 85 | var activePanelClassName = 'sidebar-panel-active'; 86 | if (item.hasClass(activeTabClassName)) { 87 | return; 88 | } 89 | 90 | var currentTarget = $('.' + activePanelClassName); 91 | var target = $('.' + item.data('target')); 92 | 93 | hasVelocity ? 94 | currentTarget.velocity('transition.slideUpOut', TAB_ANIMATE_DURATION, function () { 95 | target 96 | .velocity('stop') 97 | .velocity('transition.slideDownIn', TAB_ANIMATE_DURATION) 98 | .addClass(activePanelClassName); 99 | }) : 100 | currentTarget.animate({ opacity: 0 }, TAB_ANIMATE_DURATION, function () { 101 | currentTarget.hide(); 102 | target 103 | .stop() 104 | .css({'opacity': 0, 'display': 'block'}) 105 | .animate({ opacity: 1 }, TAB_ANIMATE_DURATION, function () { 106 | currentTarget.removeClass(activePanelClassName); 107 | target.addClass(activePanelClassName); 108 | }); 109 | }); 110 | 111 | item.siblings().removeClass(activeTabClassName); 112 | item.addClass(activeTabClassName); 113 | }); 114 | 115 | $('.post-toc a').on('click', function (e) { 116 | e.preventDefault(); 117 | var targetSelector = NexT.utils.escapeSelector(this.getAttribute('href')); 118 | var offset = $(targetSelector).offset().top; 119 | 120 | hasVelocity ? 121 | html.velocity('stop').velocity('scroll', { 122 | offset: offset + 'px', 123 | mobileHA: false 124 | }) : 125 | $('html, body').stop().animate({ 126 | scrollTop: offset 127 | }, 500); 128 | }); 129 | 130 | // Expand sidebar on post detail page by default, when post has a toc. 131 | NexT.motion.middleWares.sidebar = function () { 132 | var $tocContent = $('.post-toc-content'); 133 | 134 | if (CONFIG.sidebar.display === 'post' || CONFIG.sidebar.display === 'always') { 135 | if ($tocContent.length > 0 && $tocContent.html().trim().length > 0) { 136 | NexT.utils.displaySidebar(); 137 | } 138 | } 139 | }; 140 | }); 141 | -------------------------------------------------------------------------------- /js/src/schemes/pisces.js: -------------------------------------------------------------------------------- 1 | $(document).ready(function () { 2 | var sidebarTop = $('.header-inner').height() + 10; 3 | 4 | $('#sidebar').css({ 'margin-top': sidebarTop }).show(); 5 | }); 6 | -------------------------------------------------------------------------------- /js/src/scrollspy.js: -------------------------------------------------------------------------------- 1 | /* ======================================================================== 2 | * Bootstrap: scrollspy.js v3.3.2 3 | * http://getbootstrap.com/javascript/#scrollspy 4 | * ======================================================================== 5 | * Copyright 2011-2015 Twitter, Inc. 6 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 7 | * ======================================================================== */ 8 | 9 | /** 10 | * Custom by iissnan 11 | * 12 | * - Add a `clear.bs.scrollspy` event. 13 | * - Esacpe targets selector. 14 | */ 15 | 16 | 17 | +function ($) { 18 | 'use strict'; 19 | 20 | // SCROLLSPY CLASS DEFINITION 21 | // ========================== 22 | 23 | function ScrollSpy(element, options) { 24 | this.$body = $(document.body) 25 | this.$scrollElement = $(element).is(document.body) ? $(window) : $(element) 26 | this.options = $.extend({}, ScrollSpy.DEFAULTS, options) 27 | this.selector = (this.options.target || '') + ' .nav li > a' 28 | this.offsets = [] 29 | this.targets = [] 30 | this.activeTarget = null 31 | this.scrollHeight = 0 32 | 33 | this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this)) 34 | this.refresh() 35 | this.process() 36 | } 37 | 38 | ScrollSpy.VERSION = '3.3.2' 39 | 40 | ScrollSpy.DEFAULTS = { 41 | offset: 10 42 | } 43 | 44 | ScrollSpy.prototype.getScrollHeight = function () { 45 | return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight) 46 | } 47 | 48 | ScrollSpy.prototype.refresh = function () { 49 | var that = this 50 | var offsetMethod = 'offset' 51 | var offsetBase = 0 52 | 53 | this.offsets = [] 54 | this.targets = [] 55 | this.scrollHeight = this.getScrollHeight() 56 | 57 | if (!$.isWindow(this.$scrollElement[0])) { 58 | offsetMethod = 'position' 59 | offsetBase = this.$scrollElement.scrollTop() 60 | } 61 | 62 | this.$body 63 | .find(this.selector) 64 | .map(function () { 65 | var $el = $(this) 66 | var href = $el.data('target') || $el.attr('href') 67 | var $href = /^#./.test(href) && $(NexT.utils.escapeSelector(href)) // Need to escape selector. 68 | 69 | return ($href 70 | && $href.length 71 | && $href.is(':visible') 72 | && [[$href[offsetMethod]().top + offsetBase, href]]) || null 73 | }) 74 | .sort(function (a, b) { return a[0] - b[0] }) 75 | .each(function () { 76 | that.offsets.push(this[0]) 77 | that.targets.push(this[1]) 78 | }) 79 | 80 | 81 | } 82 | 83 | ScrollSpy.prototype.process = function () { 84 | var scrollTop = this.$scrollElement.scrollTop() + this.options.offset 85 | var scrollHeight = this.getScrollHeight() 86 | var maxScroll = this.options.offset + scrollHeight - this.$scrollElement.height() 87 | var offsets = this.offsets 88 | var targets = this.targets 89 | var activeTarget = this.activeTarget 90 | var i 91 | 92 | if (this.scrollHeight != scrollHeight) { 93 | this.refresh() 94 | } 95 | 96 | if (scrollTop >= maxScroll) { 97 | return activeTarget != (i = targets[targets.length - 1]) && this.activate(i) 98 | } 99 | 100 | if (activeTarget && scrollTop < offsets[0]) { 101 | $(this.selector).trigger('clear.bs.scrollspy') // Add a custom event. 102 | this.activeTarget = null 103 | return this.clear() 104 | } 105 | 106 | for (i = offsets.length; i--;) { 107 | activeTarget != targets[i] 108 | && scrollTop >= offsets[i] 109 | && (!offsets[i + 1] || scrollTop <= offsets[i + 1]) 110 | && this.activate(targets[i]) 111 | } 112 | } 113 | 114 | ScrollSpy.prototype.activate = function (target) { 115 | this.activeTarget = target 116 | 117 | this.clear() 118 | 119 | var selector = this.selector + 120 | '[data-target="' + target + '"],' + 121 | this.selector + '[href="' + target + '"]' 122 | 123 | var active = $(selector) 124 | .parents('li') 125 | .addClass('active') 126 | 127 | if (active.parent('.dropdown-menu').length) { 128 | active = active 129 | .closest('li.dropdown') 130 | .addClass('active') 131 | } 132 | 133 | active.trigger('activate.bs.scrollspy') 134 | } 135 | 136 | ScrollSpy.prototype.clear = function () { 137 | $(this.selector) 138 | .parentsUntil(this.options.target, '.active') 139 | .removeClass('active') 140 | } 141 | 142 | 143 | // SCROLLSPY PLUGIN DEFINITION 144 | // =========================== 145 | 146 | function Plugin(option) { 147 | return this.each(function () { 148 | var $this = $(this) 149 | var data = $this.data('bs.scrollspy') 150 | var options = typeof option == 'object' && option 151 | 152 | if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options))) 153 | if (typeof option == 'string') data[option]() 154 | }) 155 | } 156 | 157 | var old = $.fn.scrollspy 158 | 159 | $.fn.scrollspy = Plugin 160 | $.fn.scrollspy.Constructor = ScrollSpy 161 | 162 | 163 | // SCROLLSPY NO CONFLICT 164 | // ===================== 165 | 166 | $.fn.scrollspy.noConflict = function () { 167 | $.fn.scrollspy = old 168 | return this 169 | } 170 | 171 | 172 | // SCROLLSPY DATA-API 173 | // ================== 174 | 175 | $(window).on('load.bs.scrollspy.data-api', function () { 176 | $('[data-spy="scroll"]').each(function () { 177 | var $spy = $(this) 178 | Plugin.call($spy, $spy.data()) 179 | }) 180 | }) 181 | 182 | }(jQuery); 183 | -------------------------------------------------------------------------------- /js/src/utils.js: -------------------------------------------------------------------------------- 1 | /* global NexT: true */ 2 | 3 | NexT.utils = NexT.$u = { 4 | /** 5 | * Wrap images with fancybox support. 6 | */ 7 | wrapImageWithFancyBox: function () { 8 | $('.content img').not('.group-picture img').each(function () { 9 | 10 | var $image = $(this); 11 | var imageTitle = $image.attr('title'); 12 | var $imageWrapLink = $image.parent('a'); 13 | 14 | if ($imageWrapLink.size() < 1) { 15 | $imageWrapLink = $image.wrap('').parent('a'); 16 | } 17 | 18 | $imageWrapLink.addClass('fancybox'); 19 | $imageWrapLink.attr('rel', 'group'); 20 | 21 | if (imageTitle) { 22 | $imageWrapLink.append('

' + imageTitle + '

'); 23 | $imageWrapLink.attr('title', imageTitle); //make sure img title tag will show correctly in fancybox 24 | } 25 | }); 26 | 27 | $('.fancybox').fancybox({ 28 | helpers: { 29 | overlay: { 30 | locked: false 31 | } 32 | } 33 | }); 34 | }, 35 | 36 | lazyLoadPostsImages: function () { 37 | $('#posts').find('img').lazyload({ 38 | placeholder: '/images/loading.gif', 39 | effect: 'fadeIn' 40 | }); 41 | }, 42 | 43 | registerBackToTop: function () { 44 | var THRESHOLD = 50; 45 | var $top = $('.back-to-top'); 46 | 47 | $(window).on('scroll', function () { 48 | $top.toggleClass('back-to-top-on', window.pageYOffset > THRESHOLD); 49 | }); 50 | 51 | $top.on('click', function () { 52 | $('body').velocity('scroll'); 53 | }); 54 | }, 55 | 56 | /** 57 | * Transform embedded video to support responsive layout. 58 | * @see http://toddmotto.com/fluid-and-responsive-youtube-and-vimeo-videos-with-fluidvids-js/ 59 | */ 60 | embeddedVideoTransformer: function () { 61 | var $iframes = $('iframe'); 62 | 63 | // Supported Players. Extend this if you need more players. 64 | var SUPPORTED_PLAYERS = [ 65 | 'www.youtube.com', 66 | 'player.vimeo.com', 67 | 'player.youku.com', 68 | 'music.163.com', 69 | 'www.tudou.com' 70 | ]; 71 | var pattern = new RegExp( SUPPORTED_PLAYERS.join('|') ); 72 | 73 | $iframes.each(function () { 74 | var iframe = this; 75 | var $iframe = $(this); 76 | var oldDimension = getDimension($iframe); 77 | var newDimension; 78 | 79 | if (this.src.search(pattern) > 0) { 80 | 81 | // Calculate the video ratio based on the iframe's w/h dimensions 82 | var videoRatio = getAspectRadio(oldDimension.width, oldDimension.height); 83 | 84 | // Replace the iframe's dimensions and position the iframe absolute 85 | // This is the trick to emulate the video ratio 86 | $iframe.width('100%').height('100%') 87 | .css({ 88 | position: 'absolute', 89 | top: '0', 90 | left: '0' 91 | }); 92 | 93 | 94 | // Wrap the iframe in a new
which uses a dynamically fetched padding-top property 95 | // based on the video's w/h dimensions 96 | var wrap = document.createElement('div'); 97 | wrap.className = 'fluid-vids'; 98 | wrap.style.position = 'relative'; 99 | wrap.style.marginBottom = '20px'; 100 | wrap.style.width = '100%'; 101 | wrap.style.paddingTop = videoRatio + '%'; 102 | 103 | // Add the iframe inside our newly created
104 | var iframeParent = iframe.parentNode; 105 | iframeParent.insertBefore(wrap, iframe); 106 | wrap.appendChild(iframe); 107 | 108 | // Additional adjustments for 163 Music 109 | if (this.src.search('music.163.com') > 0) { 110 | newDimension = getDimension($iframe); 111 | var shouldRecalculateAspect = newDimension.width > oldDimension.width || 112 | newDimension.height < oldDimension.height; 113 | 114 | // 163 Music Player has a fixed height, so we need to reset the aspect radio 115 | if (shouldRecalculateAspect) { 116 | wrap.style.paddingTop = getAspectRadio(newDimension.width, oldDimension.height) + '%'; 117 | } 118 | } 119 | } 120 | }); 121 | 122 | function getDimension($element) { 123 | return { 124 | width: $element.width(), 125 | height: $element.height() 126 | }; 127 | } 128 | 129 | function getAspectRadio(width, height) { 130 | return height / width * 100; 131 | } 132 | }, 133 | 134 | /** 135 | * Add `menu-item-active` class name to menu item 136 | * via comparing location.path with menu item's href. 137 | */ 138 | addActiveClassToMenuItem: function () { 139 | var path = window.location.pathname; 140 | path = path === '/' ? path : path.substring(0, path.length - 1); 141 | $('.menu-item a[href="' + path + '"]').parent().addClass('menu-item-active'); 142 | }, 143 | 144 | hasMobileUA: function () { 145 | var nav = window.navigator; 146 | var ua = nav.userAgent; 147 | var pa = /iPad|iPhone|Android|Opera Mini|BlackBerry|webOS|UCWEB|Blazer|PSP|IEMobile|Symbian/g; 148 | 149 | return pa.test(ua); 150 | }, 151 | 152 | isTablet: function () { 153 | return window.screen.width < 992 && window.screen.width > 767 && this.hasMobileUA(); 154 | }, 155 | 156 | isMobile: function () { 157 | return window.screen.width < 767 && this.hasMobileUA(); 158 | }, 159 | 160 | isDesktop: function () { 161 | return !this.isTablet() && !this.isMobile(); 162 | }, 163 | 164 | /** 165 | * Escape meta symbols in jQuery selectors. 166 | * 167 | * @param selector 168 | * @returns {string|void|XML|*} 169 | */ 170 | escapeSelector: function (selector) { 171 | return selector.replace(/[!"$%&'()*+,.\/:;<=>?@[\\\]^`{|}~]/g, '\\$&'); 172 | }, 173 | 174 | displaySidebar: function () { 175 | if (!this.isDesktop() || this.isPisces()) { 176 | return; 177 | } 178 | $('.sidebar-toggle').trigger('click'); 179 | }, 180 | 181 | isMist: function () { 182 | return CONFIG.scheme === 'Mist'; 183 | }, 184 | 185 | isPisces: function () { 186 | return CONFIG.scheme === 'Pisces'; 187 | }, 188 | 189 | getScrollbarWidth: function () { 190 | var $div = $('
').addClass('scrollbar-measure').prependTo('body'); 191 | var div = $div[0]; 192 | var scrollbarWidth = div.offsetWidth - div.clientWidth; 193 | 194 | $div.remove(); 195 | 196 | return scrollbarWidth; 197 | }, 198 | 199 | /** 200 | * Affix behaviour for Sidebar. 201 | * 202 | * @returns {Boolean} 203 | */ 204 | needAffix: function () { 205 | return this.isPisces(); 206 | } 207 | }; 208 | -------------------------------------------------------------------------------- /lib/fancybox/source/blank.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lrwinx/lrwinx.github.io/beda2a2a4e83cce586623446e8156138ca63647f/lib/fancybox/source/blank.gif -------------------------------------------------------------------------------- /lib/fancybox/source/fancybox_loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lrwinx/lrwinx.github.io/beda2a2a4e83cce586623446e8156138ca63647f/lib/fancybox/source/fancybox_loading.gif -------------------------------------------------------------------------------- /lib/fancybox/source/fancybox_loading@2x.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lrwinx/lrwinx.github.io/beda2a2a4e83cce586623446e8156138ca63647f/lib/fancybox/source/fancybox_loading@2x.gif -------------------------------------------------------------------------------- /lib/fancybox/source/fancybox_overlay.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lrwinx/lrwinx.github.io/beda2a2a4e83cce586623446e8156138ca63647f/lib/fancybox/source/fancybox_overlay.png -------------------------------------------------------------------------------- /lib/fancybox/source/fancybox_sprite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lrwinx/lrwinx.github.io/beda2a2a4e83cce586623446e8156138ca63647f/lib/fancybox/source/fancybox_sprite.png -------------------------------------------------------------------------------- /lib/fancybox/source/fancybox_sprite@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lrwinx/lrwinx.github.io/beda2a2a4e83cce586623446e8156138ca63647f/lib/fancybox/source/fancybox_sprite@2x.png -------------------------------------------------------------------------------- /lib/fancybox/source/helpers/fancybox_buttons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lrwinx/lrwinx.github.io/beda2a2a4e83cce586623446e8156138ca63647f/lib/fancybox/source/helpers/fancybox_buttons.png -------------------------------------------------------------------------------- /lib/fancybox/source/helpers/jquery.fancybox-buttons.css: -------------------------------------------------------------------------------- 1 | #fancybox-buttons { 2 | position: fixed; 3 | left: 0; 4 | width: 100%; 5 | z-index: 8050; 6 | } 7 | 8 | #fancybox-buttons.top { 9 | top: 10px; 10 | } 11 | 12 | #fancybox-buttons.bottom { 13 | bottom: 10px; 14 | } 15 | 16 | #fancybox-buttons ul { 17 | display: block; 18 | width: 166px; 19 | height: 30px; 20 | margin: 0 auto; 21 | padding: 0; 22 | list-style: none; 23 | border: 1px solid #111; 24 | border-radius: 3px; 25 | -webkit-box-shadow: inset 0 0 0 1px rgba(255,255,255,.05); 26 | -moz-box-shadow: inset 0 0 0 1px rgba(255,255,255,.05); 27 | box-shadow: inset 0 0 0 1px rgba(255,255,255,.05); 28 | background: rgb(50,50,50); 29 | background: -moz-linear-gradient(top, rgb(68,68,68) 0%, rgb(52,52,52) 50%, rgb(41,41,41) 50%, rgb(51,51,51) 100%); 30 | background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgb(68,68,68)), color-stop(50%,rgb(52,52,52)), color-stop(50%,rgb(41,41,41)), color-stop(100%,rgb(51,51,51))); 31 | background: -webkit-linear-gradient(top, rgb(68,68,68) 0%,rgb(52,52,52) 50%,rgb(41,41,41) 50%,rgb(51,51,51) 100%); 32 | background: -o-linear-gradient(top, rgb(68,68,68) 0%,rgb(52,52,52) 50%,rgb(41,41,41) 50%,rgb(51,51,51) 100%); 33 | background: -ms-linear-gradient(top, rgb(68,68,68) 0%,rgb(52,52,52) 50%,rgb(41,41,41) 50%,rgb(51,51,51) 100%); 34 | background: linear-gradient(top, rgb(68,68,68) 0%,rgb(52,52,52) 50%,rgb(41,41,41) 50%,rgb(51,51,51) 100%); 35 | filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#444444', endColorstr='#222222',GradientType=0 ); 36 | } 37 | 38 | #fancybox-buttons ul li { 39 | float: left; 40 | margin: 0; 41 | padding: 0; 42 | } 43 | 44 | #fancybox-buttons a { 45 | display: block; 46 | width: 30px; 47 | height: 30px; 48 | text-indent: -9999px; 49 | background-color: transparent; 50 | background-image: url('fancybox_buttons.png'); 51 | background-repeat: no-repeat; 52 | outline: none; 53 | opacity: 0.8; 54 | } 55 | 56 | #fancybox-buttons a:hover { 57 | opacity: 1; 58 | } 59 | 60 | #fancybox-buttons a.btnPrev { 61 | background-position: 5px 0; 62 | } 63 | 64 | #fancybox-buttons a.btnNext { 65 | background-position: -33px 0; 66 | border-right: 1px solid #3e3e3e; 67 | } 68 | 69 | #fancybox-buttons a.btnPlay { 70 | background-position: 0 -30px; 71 | } 72 | 73 | #fancybox-buttons a.btnPlayOn { 74 | background-position: -30px -30px; 75 | } 76 | 77 | #fancybox-buttons a.btnToggle { 78 | background-position: 3px -60px; 79 | border-left: 1px solid #111; 80 | border-right: 1px solid #3e3e3e; 81 | width: 35px 82 | } 83 | 84 | #fancybox-buttons a.btnToggleOn { 85 | background-position: -27px -60px; 86 | } 87 | 88 | #fancybox-buttons a.btnClose { 89 | border-left: 1px solid #111; 90 | width: 35px; 91 | background-position: -56px 0px; 92 | } 93 | 94 | #fancybox-buttons a.btnDisabled { 95 | opacity : 0.4; 96 | cursor: default; 97 | } -------------------------------------------------------------------------------- /lib/fancybox/source/helpers/jquery.fancybox-buttons.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Buttons helper for fancyBox 3 | * version: 1.0.5 (Mon, 15 Oct 2012) 4 | * @requires fancyBox v2.0 or later 5 | * 6 | * Usage: 7 | * $(".fancybox").fancybox({ 8 | * helpers : { 9 | * buttons: { 10 | * position : 'top' 11 | * } 12 | * } 13 | * }); 14 | * 15 | */ 16 | (function ($) { 17 | //Shortcut for fancyBox object 18 | var F = $.fancybox; 19 | 20 | //Add helper object 21 | F.helpers.buttons = { 22 | defaults : { 23 | skipSingle : false, // disables if gallery contains single image 24 | position : 'top', // 'top' or 'bottom' 25 | tpl : '
' 26 | }, 27 | 28 | list : null, 29 | buttons: null, 30 | 31 | beforeLoad: function (opts, obj) { 32 | //Remove self if gallery do not have at least two items 33 | 34 | if (opts.skipSingle && obj.group.length < 2) { 35 | obj.helpers.buttons = false; 36 | obj.closeBtn = true; 37 | 38 | return; 39 | } 40 | 41 | //Increase top margin to give space for buttons 42 | obj.margin[ opts.position === 'bottom' ? 2 : 0 ] += 30; 43 | }, 44 | 45 | onPlayStart: function () { 46 | if (this.buttons) { 47 | this.buttons.play.attr('title', 'Pause slideshow').addClass('btnPlayOn'); 48 | } 49 | }, 50 | 51 | onPlayEnd: function () { 52 | if (this.buttons) { 53 | this.buttons.play.attr('title', 'Start slideshow').removeClass('btnPlayOn'); 54 | } 55 | }, 56 | 57 | afterShow: function (opts, obj) { 58 | var buttons = this.buttons; 59 | 60 | if (!buttons) { 61 | this.list = $(opts.tpl).addClass(opts.position).appendTo('body'); 62 | 63 | buttons = { 64 | prev : this.list.find('.btnPrev').click( F.prev ), 65 | next : this.list.find('.btnNext').click( F.next ), 66 | play : this.list.find('.btnPlay').click( F.play ), 67 | toggle : this.list.find('.btnToggle').click( F.toggle ), 68 | close : this.list.find('.btnClose').click( F.close ) 69 | } 70 | } 71 | 72 | //Prev 73 | if (obj.index > 0 || obj.loop) { 74 | buttons.prev.removeClass('btnDisabled'); 75 | } else { 76 | buttons.prev.addClass('btnDisabled'); 77 | } 78 | 79 | //Next / Play 80 | if (obj.loop || obj.index < obj.group.length - 1) { 81 | buttons.next.removeClass('btnDisabled'); 82 | buttons.play.removeClass('btnDisabled'); 83 | 84 | } else { 85 | buttons.next.addClass('btnDisabled'); 86 | buttons.play.addClass('btnDisabled'); 87 | } 88 | 89 | this.buttons = buttons; 90 | 91 | this.onUpdate(opts, obj); 92 | }, 93 | 94 | onUpdate: function (opts, obj) { 95 | var toggle; 96 | 97 | if (!this.buttons) { 98 | return; 99 | } 100 | 101 | toggle = this.buttons.toggle.removeClass('btnDisabled btnToggleOn'); 102 | 103 | //Size toggle button 104 | if (obj.canShrink) { 105 | toggle.addClass('btnToggleOn'); 106 | 107 | } else if (!obj.canExpand) { 108 | toggle.addClass('btnDisabled'); 109 | } 110 | }, 111 | 112 | beforeClose: function () { 113 | if (this.list) { 114 | this.list.remove(); 115 | } 116 | 117 | this.list = null; 118 | this.buttons = null; 119 | } 120 | }; 121 | 122 | }(jQuery)); 123 | -------------------------------------------------------------------------------- /lib/fancybox/source/helpers/jquery.fancybox-media.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Media helper for fancyBox 3 | * version: 1.0.6 (Fri, 14 Jun 2013) 4 | * @requires fancyBox v2.0 or later 5 | * 6 | * Usage: 7 | * $(".fancybox").fancybox({ 8 | * helpers : { 9 | * media: true 10 | * } 11 | * }); 12 | * 13 | * Set custom URL parameters: 14 | * $(".fancybox").fancybox({ 15 | * helpers : { 16 | * media: { 17 | * youtube : { 18 | * params : { 19 | * autoplay : 0 20 | * } 21 | * } 22 | * } 23 | * } 24 | * }); 25 | * 26 | * Or: 27 | * $(".fancybox").fancybox({, 28 | * helpers : { 29 | * media: true 30 | * }, 31 | * youtube : { 32 | * autoplay: 0 33 | * } 34 | * }); 35 | * 36 | * Supports: 37 | * 38 | * Youtube 39 | * http://www.youtube.com/watch?v=opj24KnzrWo 40 | * http://www.youtube.com/embed/opj24KnzrWo 41 | * http://youtu.be/opj24KnzrWo 42 | * http://www.youtube-nocookie.com/embed/opj24KnzrWo 43 | * Vimeo 44 | * http://vimeo.com/40648169 45 | * http://vimeo.com/channels/staffpicks/38843628 46 | * http://vimeo.com/groups/surrealism/videos/36516384 47 | * http://player.vimeo.com/video/45074303 48 | * Metacafe 49 | * http://www.metacafe.com/watch/7635964/dr_seuss_the_lorax_movie_trailer/ 50 | * http://www.metacafe.com/watch/7635964/ 51 | * Dailymotion 52 | * http://www.dailymotion.com/video/xoytqh_dr-seuss-the-lorax-premiere_people 53 | * Twitvid 54 | * http://twitvid.com/QY7MD 55 | * Twitpic 56 | * http://twitpic.com/7p93st 57 | * Instagram 58 | * http://instagr.am/p/IejkuUGxQn/ 59 | * http://instagram.com/p/IejkuUGxQn/ 60 | * Google maps 61 | * http://maps.google.com/maps?q=Eiffel+Tower,+Avenue+Gustave+Eiffel,+Paris,+France&t=h&z=17 62 | * http://maps.google.com/?ll=48.857995,2.294297&spn=0.007666,0.021136&t=m&z=16 63 | * http://maps.google.com/?ll=48.859463,2.292626&spn=0.000965,0.002642&t=m&z=19&layer=c&cbll=48.859524,2.292532&panoid=YJ0lq28OOy3VT2IqIuVY0g&cbp=12,151.58,,0,-15.56 64 | */ 65 | (function ($) { 66 | "use strict"; 67 | 68 | //Shortcut for fancyBox object 69 | var F = $.fancybox, 70 | format = function( url, rez, params ) { 71 | params = params || ''; 72 | 73 | if ( $.type( params ) === "object" ) { 74 | params = $.param(params, true); 75 | } 76 | 77 | $.each(rez, function(key, value) { 78 | url = url.replace( '$' + key, value || '' ); 79 | }); 80 | 81 | if (params.length) { 82 | url += ( url.indexOf('?') > 0 ? '&' : '?' ) + params; 83 | } 84 | 85 | return url; 86 | }; 87 | 88 | //Add helper object 89 | F.helpers.media = { 90 | defaults : { 91 | youtube : { 92 | matcher : /(youtube\.com|youtu\.be|youtube-nocookie\.com)\/(watch\?v=|v\/|u\/|embed\/?)?(videoseries\?list=(.*)|[\w-]{11}|\?listType=(.*)&list=(.*)).*/i, 93 | params : { 94 | autoplay : 1, 95 | autohide : 1, 96 | fs : 1, 97 | rel : 0, 98 | hd : 1, 99 | wmode : 'opaque', 100 | enablejsapi : 1 101 | }, 102 | type : 'iframe', 103 | url : '//www.youtube.com/embed/$3' 104 | }, 105 | vimeo : { 106 | matcher : /(?:vimeo(?:pro)?.com)\/(?:[^\d]+)?(\d+)(?:.*)/, 107 | params : { 108 | autoplay : 1, 109 | hd : 1, 110 | show_title : 1, 111 | show_byline : 1, 112 | show_portrait : 0, 113 | fullscreen : 1 114 | }, 115 | type : 'iframe', 116 | url : '//player.vimeo.com/video/$1' 117 | }, 118 | metacafe : { 119 | matcher : /metacafe.com\/(?:watch|fplayer)\/([\w\-]{1,10})/, 120 | params : { 121 | autoPlay : 'yes' 122 | }, 123 | type : 'swf', 124 | url : function( rez, params, obj ) { 125 | obj.swf.flashVars = 'playerVars=' + $.param( params, true ); 126 | 127 | return '//www.metacafe.com/fplayer/' + rez[1] + '/.swf'; 128 | } 129 | }, 130 | dailymotion : { 131 | matcher : /dailymotion.com\/video\/(.*)\/?(.*)/, 132 | params : { 133 | additionalInfos : 0, 134 | autoStart : 1 135 | }, 136 | type : 'swf', 137 | url : '//www.dailymotion.com/swf/video/$1' 138 | }, 139 | twitvid : { 140 | matcher : /twitvid\.com\/([a-zA-Z0-9_\-\?\=]+)/i, 141 | params : { 142 | autoplay : 0 143 | }, 144 | type : 'iframe', 145 | url : '//www.twitvid.com/embed.php?guid=$1' 146 | }, 147 | twitpic : { 148 | matcher : /twitpic\.com\/(?!(?:place|photos|events)\/)([a-zA-Z0-9\?\=\-]+)/i, 149 | type : 'image', 150 | url : '//twitpic.com/show/full/$1/' 151 | }, 152 | instagram : { 153 | matcher : /(instagr\.am|instagram\.com)\/p\/([a-zA-Z0-9_\-]+)\/?/i, 154 | type : 'image', 155 | url : '//$1/p/$2/media/?size=l' 156 | }, 157 | google_maps : { 158 | matcher : /maps\.google\.([a-z]{2,3}(\.[a-z]{2})?)\/(\?ll=|maps\?)(.*)/i, 159 | type : 'iframe', 160 | url : function( rez ) { 161 | return '//maps.google.' + rez[1] + '/' + rez[3] + '' + rez[4] + '&output=' + (rez[4].indexOf('layer=c') > 0 ? 'svembed' : 'embed'); 162 | } 163 | } 164 | }, 165 | 166 | beforeLoad : function(opts, obj) { 167 | var url = obj.href || '', 168 | type = false, 169 | what, 170 | item, 171 | rez, 172 | params; 173 | 174 | for (what in opts) { 175 | if (opts.hasOwnProperty(what)) { 176 | item = opts[ what ]; 177 | rez = url.match( item.matcher ); 178 | 179 | if (rez) { 180 | type = item.type; 181 | params = $.extend(true, {}, item.params, obj[ what ] || ($.isPlainObject(opts[ what ]) ? opts[ what ].params : null)); 182 | 183 | url = $.type( item.url ) === "function" ? item.url.call( this, rez, params, obj ) : format( item.url, rez, params ); 184 | 185 | break; 186 | } 187 | } 188 | } 189 | 190 | if (type) { 191 | obj.href = url; 192 | obj.type = type; 193 | 194 | obj.autoHeight = false; 195 | } 196 | } 197 | }; 198 | 199 | }(jQuery)); -------------------------------------------------------------------------------- /lib/fancybox/source/helpers/jquery.fancybox-thumbs.css: -------------------------------------------------------------------------------- 1 | #fancybox-thumbs { 2 | position: fixed; 3 | left: 0; 4 | width: 100%; 5 | overflow: hidden; 6 | z-index: 8050; 7 | } 8 | 9 | #fancybox-thumbs.bottom { 10 | bottom: 2px; 11 | } 12 | 13 | #fancybox-thumbs.top { 14 | top: 2px; 15 | } 16 | 17 | #fancybox-thumbs ul { 18 | position: relative; 19 | list-style: none; 20 | margin: 0; 21 | padding: 0; 22 | } 23 | 24 | #fancybox-thumbs ul li { 25 | float: left; 26 | padding: 1px; 27 | opacity: 0.5; 28 | } 29 | 30 | #fancybox-thumbs ul li.active { 31 | opacity: 0.75; 32 | padding: 0; 33 | border: 1px solid #fff; 34 | } 35 | 36 | #fancybox-thumbs ul li:hover { 37 | opacity: 1; 38 | } 39 | 40 | #fancybox-thumbs ul li a { 41 | display: block; 42 | position: relative; 43 | overflow: hidden; 44 | border: 1px solid #222; 45 | background: #111; 46 | outline: none; 47 | } 48 | 49 | #fancybox-thumbs ul li img { 50 | display: block; 51 | position: relative; 52 | border: 0; 53 | padding: 0; 54 | max-width: none; 55 | } -------------------------------------------------------------------------------- /lib/fancybox/source/helpers/jquery.fancybox-thumbs.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Thumbnail helper for fancyBox 3 | * version: 1.0.7 (Mon, 01 Oct 2012) 4 | * @requires fancyBox v2.0 or later 5 | * 6 | * Usage: 7 | * $(".fancybox").fancybox({ 8 | * helpers : { 9 | * thumbs: { 10 | * width : 50, 11 | * height : 50 12 | * } 13 | * } 14 | * }); 15 | * 16 | */ 17 | (function ($) { 18 | //Shortcut for fancyBox object 19 | var F = $.fancybox; 20 | 21 | //Add helper object 22 | F.helpers.thumbs = { 23 | defaults : { 24 | width : 50, // thumbnail width 25 | height : 50, // thumbnail height 26 | position : 'bottom', // 'top' or 'bottom' 27 | source : function ( item ) { // function to obtain the URL of the thumbnail image 28 | var href; 29 | 30 | if (item.element) { 31 | href = $(item.element).find('img').attr('src'); 32 | } 33 | 34 | if (!href && item.type === 'image' && item.href) { 35 | href = item.href; 36 | } 37 | 38 | return href; 39 | } 40 | }, 41 | 42 | wrap : null, 43 | list : null, 44 | width : 0, 45 | 46 | init: function (opts, obj) { 47 | var that = this, 48 | list, 49 | thumbWidth = opts.width, 50 | thumbHeight = opts.height, 51 | thumbSource = opts.source; 52 | 53 | //Build list structure 54 | list = ''; 55 | 56 | for (var n = 0; n < obj.group.length; n++) { 57 | list += '
  • '; 58 | } 59 | 60 | this.wrap = $('
    ').addClass(opts.position).appendTo('body'); 61 | this.list = $('
      ' + list + '
    ').appendTo(this.wrap); 62 | 63 | //Load each thumbnail 64 | $.each(obj.group, function (i) { 65 | var href = thumbSource( obj.group[ i ] ); 66 | 67 | if (!href) { 68 | return; 69 | } 70 | 71 | $("").load(function () { 72 | var width = this.width, 73 | height = this.height, 74 | widthRatio, heightRatio, parent; 75 | 76 | if (!that.list || !width || !height) { 77 | return; 78 | } 79 | 80 | //Calculate thumbnail width/height and center it 81 | widthRatio = width / thumbWidth; 82 | heightRatio = height / thumbHeight; 83 | 84 | parent = that.list.children().eq(i).find('a'); 85 | 86 | if (widthRatio >= 1 && heightRatio >= 1) { 87 | if (widthRatio > heightRatio) { 88 | width = Math.floor(width / heightRatio); 89 | height = thumbHeight; 90 | 91 | } else { 92 | width = thumbWidth; 93 | height = Math.floor(height / widthRatio); 94 | } 95 | } 96 | 97 | $(this).css({ 98 | width : width, 99 | height : height, 100 | top : Math.floor(thumbHeight / 2 - height / 2), 101 | left : Math.floor(thumbWidth / 2 - width / 2) 102 | }); 103 | 104 | parent.width(thumbWidth).height(thumbHeight); 105 | 106 | $(this).hide().appendTo(parent).fadeIn(300); 107 | 108 | }).attr('src', href); 109 | }); 110 | 111 | //Set initial width 112 | this.width = this.list.children().eq(0).outerWidth(true); 113 | 114 | this.list.width(this.width * (obj.group.length + 1)).css('left', Math.floor($(window).width() * 0.5 - (obj.index * this.width + this.width * 0.5))); 115 | }, 116 | 117 | beforeLoad: function (opts, obj) { 118 | //Remove self if gallery do not have at least two items 119 | if (obj.group.length < 2) { 120 | obj.helpers.thumbs = false; 121 | 122 | return; 123 | } 124 | 125 | //Increase bottom margin to give space for thumbs 126 | obj.margin[ opts.position === 'top' ? 0 : 2 ] += ((opts.height) + 15); 127 | }, 128 | 129 | afterShow: function (opts, obj) { 130 | //Check if exists and create or update list 131 | if (this.list) { 132 | this.onUpdate(opts, obj); 133 | 134 | } else { 135 | this.init(opts, obj); 136 | } 137 | 138 | //Set active element 139 | this.list.children().removeClass('active').eq(obj.index).addClass('active'); 140 | }, 141 | 142 | //Center list 143 | onUpdate: function (opts, obj) { 144 | if (this.list) { 145 | this.list.stop(true).animate({ 146 | 'left': Math.floor($(window).width() * 0.5 - (obj.index * this.width + this.width * 0.5)) 147 | }, 150); 148 | } 149 | }, 150 | 151 | beforeClose: function () { 152 | if (this.wrap) { 153 | this.wrap.remove(); 154 | } 155 | 156 | this.wrap = null; 157 | this.list = null; 158 | this.width = 0; 159 | } 160 | } 161 | 162 | }(jQuery)); -------------------------------------------------------------------------------- /lib/fancybox/source/jquery.fancybox.css: -------------------------------------------------------------------------------- 1 | /*! fancyBox v2.1.5 fancyapps.com | fancyapps.com/fancybox/#license */ 2 | .fancybox-wrap, 3 | .fancybox-skin, 4 | .fancybox-outer, 5 | .fancybox-inner, 6 | .fancybox-image, 7 | .fancybox-wrap iframe, 8 | .fancybox-wrap object, 9 | .fancybox-nav, 10 | .fancybox-nav span, 11 | .fancybox-tmp 12 | { 13 | padding: 0; 14 | margin: 0; 15 | border: 0; 16 | outline: none; 17 | vertical-align: top; 18 | } 19 | 20 | .fancybox-wrap { 21 | position: absolute; 22 | top: 0; 23 | left: 0; 24 | z-index: 8020; 25 | } 26 | 27 | .fancybox-skin { 28 | position: relative; 29 | background: #f9f9f9; 30 | color: #444; 31 | text-shadow: none; 32 | -webkit-border-radius: 4px; 33 | -moz-border-radius: 4px; 34 | border-radius: 4px; 35 | } 36 | 37 | .fancybox-opened { 38 | z-index: 8030; 39 | } 40 | 41 | .fancybox-opened .fancybox-skin { 42 | -webkit-box-shadow: 0 10px 25px rgba(0, 0, 0, 0.5); 43 | -moz-box-shadow: 0 10px 25px rgba(0, 0, 0, 0.5); 44 | box-shadow: 0 10px 25px rgba(0, 0, 0, 0.5); 45 | } 46 | 47 | .fancybox-outer, .fancybox-inner { 48 | position: relative; 49 | } 50 | 51 | .fancybox-inner { 52 | overflow: hidden; 53 | } 54 | 55 | .fancybox-type-iframe .fancybox-inner { 56 | -webkit-overflow-scrolling: touch; 57 | } 58 | 59 | .fancybox-error { 60 | color: #444; 61 | font: 14px/20px "Helvetica Neue",Helvetica,Arial,sans-serif; 62 | margin: 0; 63 | padding: 15px; 64 | white-space: nowrap; 65 | } 66 | 67 | .fancybox-image, .fancybox-iframe { 68 | display: block; 69 | width: 100%; 70 | height: 100%; 71 | } 72 | 73 | .fancybox-image { 74 | max-width: 100%; 75 | max-height: 100%; 76 | } 77 | 78 | #fancybox-loading, .fancybox-close, .fancybox-prev span, .fancybox-next span { 79 | background-image: url('fancybox_sprite.png'); 80 | } 81 | 82 | #fancybox-loading { 83 | position: fixed; 84 | top: 50%; 85 | left: 50%; 86 | margin-top: -22px; 87 | margin-left: -22px; 88 | background-position: 0 -108px; 89 | opacity: 0.8; 90 | cursor: pointer; 91 | z-index: 8060; 92 | } 93 | 94 | #fancybox-loading div { 95 | width: 44px; 96 | height: 44px; 97 | background: url('fancybox_loading.gif') center center no-repeat; 98 | } 99 | 100 | .fancybox-close { 101 | position: absolute; 102 | top: -18px; 103 | right: -18px; 104 | width: 36px; 105 | height: 36px; 106 | cursor: pointer; 107 | z-index: 8040; 108 | } 109 | 110 | .fancybox-nav { 111 | position: absolute; 112 | top: 0; 113 | width: 40%; 114 | height: 100%; 115 | cursor: pointer; 116 | text-decoration: none; 117 | background: transparent url('blank.gif'); /* helps IE */ 118 | -webkit-tap-highlight-color: rgba(0,0,0,0); 119 | z-index: 8040; 120 | } 121 | 122 | .fancybox-prev { 123 | left: 0; 124 | } 125 | 126 | .fancybox-next { 127 | right: 0; 128 | } 129 | 130 | .fancybox-nav span { 131 | position: absolute; 132 | top: 50%; 133 | width: 36px; 134 | height: 34px; 135 | margin-top: -18px; 136 | cursor: pointer; 137 | z-index: 8040; 138 | visibility: hidden; 139 | } 140 | 141 | .fancybox-prev span { 142 | left: 10px; 143 | background-position: 0 -36px; 144 | } 145 | 146 | .fancybox-next span { 147 | right: 10px; 148 | background-position: 0 -72px; 149 | } 150 | 151 | .fancybox-nav:hover span { 152 | visibility: visible; 153 | } 154 | 155 | .fancybox-tmp { 156 | position: absolute; 157 | top: -99999px; 158 | left: -99999px; 159 | visibility: hidden; 160 | max-width: 99999px; 161 | max-height: 99999px; 162 | overflow: visible !important; 163 | } 164 | 165 | /* Overlay helper */ 166 | 167 | .fancybox-lock { 168 | overflow: hidden !important; 169 | width: auto; 170 | } 171 | 172 | .fancybox-lock body { 173 | overflow: hidden !important; 174 | } 175 | 176 | .fancybox-lock-test { 177 | overflow-y: hidden !important; 178 | } 179 | 180 | .fancybox-overlay { 181 | position: absolute; 182 | top: 0; 183 | left: 0; 184 | overflow: hidden; 185 | display: none; 186 | z-index: 8010; 187 | background: url('fancybox_overlay.png'); 188 | } 189 | 190 | .fancybox-overlay-fixed { 191 | position: fixed; 192 | bottom: 0; 193 | right: 0; 194 | } 195 | 196 | .fancybox-lock .fancybox-overlay { 197 | overflow: auto; 198 | overflow-y: scroll; 199 | } 200 | 201 | /* Title helper */ 202 | 203 | .fancybox-title { 204 | visibility: hidden; 205 | font: normal 13px/20px "Helvetica Neue",Helvetica,Arial,sans-serif; 206 | position: relative; 207 | text-shadow: none; 208 | z-index: 8050; 209 | } 210 | 211 | .fancybox-opened .fancybox-title { 212 | visibility: visible; 213 | } 214 | 215 | .fancybox-title-float-wrap { 216 | position: absolute; 217 | bottom: 0; 218 | right: 50%; 219 | margin-bottom: -35px; 220 | z-index: 8050; 221 | text-align: center; 222 | } 223 | 224 | .fancybox-title-float-wrap .child { 225 | display: inline-block; 226 | margin-right: -100%; 227 | padding: 2px 20px; 228 | background: transparent; /* Fallback for web browsers that doesn't support RGBa */ 229 | background: rgba(0, 0, 0, 0.8); 230 | -webkit-border-radius: 15px; 231 | -moz-border-radius: 15px; 232 | border-radius: 15px; 233 | text-shadow: 0 1px 2px #222; 234 | color: #FFF; 235 | font-weight: bold; 236 | line-height: 24px; 237 | white-space: nowrap; 238 | } 239 | 240 | .fancybox-title-outside-wrap { 241 | position: relative; 242 | margin-top: 10px; 243 | color: #fff; 244 | } 245 | 246 | .fancybox-title-inside-wrap { 247 | padding-top: 10px; 248 | } 249 | 250 | .fancybox-title-over-wrap { 251 | position: absolute; 252 | bottom: 0; 253 | left: 0; 254 | color: #fff; 255 | padding: 10px; 256 | background: #000; 257 | background: rgba(0, 0, 0, .8); 258 | } 259 | 260 | /*Retina graphics!*/ 261 | @media only screen and (-webkit-min-device-pixel-ratio: 1.5), 262 | only screen and (min--moz-device-pixel-ratio: 1.5), 263 | only screen and (min-device-pixel-ratio: 1.5){ 264 | 265 | #fancybox-loading, .fancybox-close, .fancybox-prev span, .fancybox-next span { 266 | background-image: url('fancybox_sprite@2x.png'); 267 | background-size: 44px 152px; /*The size of the normal image, half the size of the hi-res image*/ 268 | } 269 | 270 | #fancybox-loading div { 271 | background-image: url('fancybox_loading@2x.gif'); 272 | background-size: 24px 24px; /*The size of the normal image, half the size of the hi-res image*/ 273 | } 274 | } -------------------------------------------------------------------------------- /lib/fastclick/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2014 The Financial Times Ltd. 2 | 3 | Permission is hereby granted, free of charge, to any person 4 | obtaining a copy of this software and associated documentation 5 | files (the "Software"), to deal in the Software without 6 | restriction, including without limitation the rights to use, 7 | copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | copies of the Software, and to permit persons to whom the 9 | Software is furnished to do so, subject to the following 10 | conditions: 11 | 12 | The above copyright notice and this permission notice shall be 13 | included in all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 17 | OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 19 | HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 20 | WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 | OTHER DEALINGS IN THE SOFTWARE. 23 | -------------------------------------------------------------------------------- /lib/fastclick/README.html: -------------------------------------------------------------------------------- 1 |

    FastClick

    FastClick is a simple, easy-to-use library for eliminating the 300ms delay between a physical tap and the firing of a click event on mobile browsers. The aim is to make your application feel less laggy and more responsive while avoiding any interference with your current logic.

    2 |

    FastClick is developed by FT Labs, part of the Financial Times.

    3 |

    Explication en français.

    4 |

    日本語で説明

    5 |

    Why does the delay exist?

    According to Google:

    6 |
    7 |

    …mobile browsers will wait approximately 300ms from the time that you tap the button to fire the click event. The reason for this is that the browser is waiting to see if you are actually performing a double tap.

    8 |
    9 |

    Compatibility

    The library has been deployed as part of the FT Web App and is tried and tested on the following mobile browsers:

    10 |
      11 |
    • Mobile Safari on iOS 3 and upwards
    • 12 |
    • Chrome on iOS 5 and upwards
    • 13 |
    • Chrome on Android (ICS)
    • 14 |
    • Opera Mobile 11.5 and upwards
    • 15 |
    • Android Browser since Android 2
    • 16 |
    • PlayBook OS 1 and upwards
    • 17 |
    18 |

    When it isn’t needed

    FastClick doesn’t attach any listeners on desktop browsers.

    19 |

    Chrome 32+ on Android with width=device-width in the viewport meta tag doesn’t have a 300ms delay, therefore listeners aren’t attached.

    20 |
    <meta name="viewport" content="width=device-width, initial-scale=1">
    21 | 
    22 |

    Same goes for Chrome on Android (all versions) with user-scalable=no in the viewport meta tag. But be aware that user-scalable=no also disables pinch zooming, which may be an accessibility concern.

    23 |

    For IE11+, you can use touch-action: manipulation; to disable double-tap-to-zoom on certain elements (like links and buttons). For IE10 use -ms-touch-action: manipulation.

    24 |

    Usage

    Include fastclick.js in your JavaScript bundle or add it to your HTML page like this:

    25 |
    <script type='application/javascript' src='/path/to/fastclick.js'></script>
    26 | 
    27 |

    The script must be loaded prior to instantiating FastClick on any element of the page.

    28 |

    To instantiate FastClick on the body, which is the recommended method of use:

    29 |
    if ('addEventListener' in document) {
    30 |     document.addEventListener('DOMContentLoaded', function() {
    31 |         FastClick.attach(document.body);
    32 |     }, false);
    33 | }
    34 | 
    35 |

    Or, if you’re using jQuery:

    36 |
    $(function() {
    37 |     FastClick.attach(document.body);
    38 | });
    39 | 
    40 |

    If you’re using Browserify or another CommonJS-style module system, the FastClick.attach function will be returned when you call require('fastclick'). As a result, the easiest way to use FastClick with these loaders is as follows:

    41 |
    var attachFastClick = require('fastclick');
    42 | attachFastClick(document.body);
    43 | 
    44 |

    Minified

    Run make to build a minified version of FastClick using the Closure Compiler REST API. The minified file is saved to build/fastclick.min.js or you can download a pre-minified version.

    45 |

    Note: the pre-minified version is built using our build service which exposes the FastClick object through Origami.fastclick and will have the Browserify/CommonJS API (see above).

    46 |
    var attachFastClick = Origami.fastclick;
    47 | attachFastClick(document.body);
    48 | 
    49 |

    AMD

    FastClick has AMD (Asynchronous Module Definition) support. This allows it to be lazy-loaded with an AMD loader, such as RequireJS. Note that when using the AMD style require, the full FastClick object will be returned, not FastClick.attach

    50 |
    var FastClick = require('fastclick');
    51 | FastClick.attach(document.body, options);
    52 | 
    53 |

    Package managers

    You can install FastClick using Component, npm or Bower.

    54 |

    For Ruby, there’s a third-party gem called fastclick-rails. For .NET there’s a NuGet package.

    55 |

    Advanced

    Ignore certain elements with needsclick

    Sometimes you need FastClick to ignore certain elements. You can do this easily by adding the needsclick class.

    56 |
    <a class="needsclick">Ignored by FastClick</a>
    57 | 
    58 |

    Use case 1: non-synthetic click required

    Internally, FastClick uses document.createEvent to fire a synthetic click event as soon as touchend is fired by the browser. It then suppresses the additional click event created by the browser after that. In some cases, the non-synthetic click event created by the browser is required, as described in the triggering focus example.

    59 |

    This is where the needsclick class comes in. Add the class to any element that requires a non-synthetic click.

    60 |

    Use case 2: Twitter Bootstrap 2.2.2 dropdowns

    Another example of when to use the needsclick class is with dropdowns in Twitter Bootstrap 2.2.2. Bootstrap add its own touchstart listener for dropdowns, so you want to tell FastClick to ignore those. If you don’t, touch devices will automatically close the dropdown as soon as it is clicked, because both FastClick and Bootstrap execute the synthetic click, one opens the dropdown, the second closes it immediately after.

    61 |
    <a class="dropdown-toggle needsclick" data-toggle="dropdown">Dropdown</a>
    62 | 
    63 |

    Examples

    FastClick is designed to cope with many different browser oddities. Here are some examples to illustrate this:

    64 |
      65 |
    • basic use showing the increase in perceived responsiveness
    • 66 |
    • triggering focus on an input element from a click handler
    • 67 |
    • input element which never receives clicks but gets fast focus
    • 68 |
    69 |

    Tests

    There are no automated tests. The files in tests/ are manual reduced test cases. We’ve had a think about how best to test these cases, but they tend to be very browser/device specific and sometimes subjective which means it’s not so trivial to test.

    70 |

    Credits and collaboration

    FastClick is maintained by Rowan Beentje, Matthew Caruana Galizia and Matthew Andrews at FT Labs. All open source code released by FT Labs is licenced under the MIT licence. We welcome comments, feedback and suggestions. Please feel free to raise an issue or pull request.

    71 | -------------------------------------------------------------------------------- /lib/fastclick/bower.json: -------------------------------------------------------------------------------- 1 | {"name":"fastclick","main":"lib/fastclick.js","ignore":["**/.*","component.json","package.json","Makefile","tests","examples"]} -------------------------------------------------------------------------------- /lib/fastclick/lib/fastclick.min.js: -------------------------------------------------------------------------------- 1 | !function(){"use strict";function t(e,o){function i(t,e){return function(){return t.apply(e,arguments)}}var r;if(o=o||{},this.trackingClick=!1,this.trackingClickStart=0,this.targetElement=null,this.touchStartX=0,this.touchStartY=0,this.lastTouchIdentifier=0,this.touchBoundary=o.touchBoundary||10,this.layer=e,this.tapDelay=o.tapDelay||200,this.tapTimeout=o.tapTimeout||700,!t.notNeeded(e)){for(var a=["onMouse","onClick","onTouchStart","onTouchMove","onTouchEnd","onTouchCancel"],c=this,s=0,u=a.length;u>s;s++)c[a[s]]=i(c[a[s]],c);n&&(e.addEventListener("mouseover",this.onMouse,!0),e.addEventListener("mousedown",this.onMouse,!0),e.addEventListener("mouseup",this.onMouse,!0)),e.addEventListener("click",this.onClick,!0),e.addEventListener("touchstart",this.onTouchStart,!1),e.addEventListener("touchmove",this.onTouchMove,!1),e.addEventListener("touchend",this.onTouchEnd,!1),e.addEventListener("touchcancel",this.onTouchCancel,!1),Event.prototype.stopImmediatePropagation||(e.removeEventListener=function(t,n,o){var i=Node.prototype.removeEventListener;"click"===t?i.call(e,t,n.hijacked||n,o):i.call(e,t,n,o)},e.addEventListener=function(t,n,o){var i=Node.prototype.addEventListener;"click"===t?i.call(e,t,n.hijacked||(n.hijacked=function(t){t.propagationStopped||n(t)}),o):i.call(e,t,n,o)}),"function"==typeof e.onclick&&(r=e.onclick,e.addEventListener("click",function(t){r(t)},!1),e.onclick=null)}}var e=navigator.userAgent.indexOf("Windows Phone")>=0,n=navigator.userAgent.indexOf("Android")>0&&!e,o=/iP(ad|hone|od)/.test(navigator.userAgent)&&!e,i=o&&/OS 4_\d(_\d)?/.test(navigator.userAgent),r=o&&/OS [6-7]_\d/.test(navigator.userAgent),a=navigator.userAgent.indexOf("BB10")>0;t.prototype.needsClick=function(t){switch(t.nodeName.toLowerCase()){case"button":case"select":case"textarea":if(t.disabled)return!0;break;case"input":if(o&&"file"===t.type||t.disabled)return!0;break;case"label":case"iframe":case"video":return!0}return/\bneedsclick\b/.test(t.className)},t.prototype.needsFocus=function(t){switch(t.nodeName.toLowerCase()){case"textarea":return!0;case"select":return!n;case"input":switch(t.type){case"button":case"checkbox":case"file":case"image":case"radio":case"submit":return!1}return!t.disabled&&!t.readOnly;default:return/\bneedsfocus\b/.test(t.className)}},t.prototype.sendClick=function(t,e){var n,o;document.activeElement&&document.activeElement!==t&&document.activeElement.blur(),o=e.changedTouches[0],n=document.createEvent("MouseEvents"),n.initMouseEvent(this.determineEventType(t),!0,!0,window,1,o.screenX,o.screenY,o.clientX,o.clientY,!1,!1,!1,!1,0,null),n.forwardedTouchEvent=!0,t.dispatchEvent(n)},t.prototype.determineEventType=function(t){return n&&"select"===t.tagName.toLowerCase()?"mousedown":"click"},t.prototype.focus=function(t){var e;o&&t.setSelectionRange&&0!==t.type.indexOf("date")&&"time"!==t.type&&"month"!==t.type?(e=t.value.length,t.setSelectionRange(e,e)):t.focus()},t.prototype.updateScrollParent=function(t){var e,n;if(e=t.fastClickScrollParent,!e||!e.contains(t)){n=t;do{if(n.scrollHeight>n.offsetHeight){e=n,t.fastClickScrollParent=n;break}n=n.parentElement}while(n)}e&&(e.fastClickLastScrollTop=e.scrollTop)},t.prototype.getTargetElementFromEventTarget=function(t){return t.nodeType===Node.TEXT_NODE?t.parentNode:t},t.prototype.onTouchStart=function(t){var e,n,r;if(t.targetTouches.length>1)return!0;if(e=this.getTargetElementFromEventTarget(t.target),n=t.targetTouches[0],o){if(r=window.getSelection(),r.rangeCount&&!r.isCollapsed)return!0;if(!i){if(n.identifier&&n.identifier===this.lastTouchIdentifier)return t.preventDefault(),!1;this.lastTouchIdentifier=n.identifier,this.updateScrollParent(e)}}return this.trackingClick=!0,this.trackingClickStart=t.timeStamp,this.targetElement=e,this.touchStartX=n.pageX,this.touchStartY=n.pageY,t.timeStamp-this.lastClickTimen||Math.abs(e.pageY-this.touchStartY)>n?!0:!1},t.prototype.onTouchMove=function(t){return this.trackingClick?((this.targetElement!==this.getTargetElementFromEventTarget(t.target)||this.touchHasMoved(t))&&(this.trackingClick=!1,this.targetElement=null),!0):!0},t.prototype.findControl=function(t){return void 0!==t.control?t.control:t.htmlFor?document.getElementById(t.htmlFor):t.querySelector("button, input:not([type=hidden]), keygen, meter, output, progress, select, textarea")},t.prototype.onTouchEnd=function(t){var e,a,c,s,u,l=this.targetElement;if(!this.trackingClick)return!0;if(t.timeStamp-this.lastClickTimethis.tapTimeout)return!0;if(this.cancelNextClick=!1,this.lastClickTime=t.timeStamp,a=this.trackingClickStart,this.trackingClick=!1,this.trackingClickStart=0,r&&(u=t.changedTouches[0],l=document.elementFromPoint(u.pageX-window.pageXOffset,u.pageY-window.pageYOffset)||l,l.fastClickScrollParent=this.targetElement.fastClickScrollParent),c=l.tagName.toLowerCase(),"label"===c){if(e=this.findControl(l)){if(this.focus(l),n)return!1;l=e}}else if(this.needsFocus(l))return t.timeStamp-a>100||o&&window.top!==window&&"input"===c?(this.targetElement=null,!1):(this.focus(l),this.sendClick(l,t),o&&"select"===c||(this.targetElement=null,t.preventDefault()),!1);return o&&!i&&(s=l.fastClickScrollParent,s&&s.fastClickLastScrollTop!==s.scrollTop)?!0:(this.needsClick(l)||(t.preventDefault(),this.sendClick(l,t)),!1)},t.prototype.onTouchCancel=function(){this.trackingClick=!1,this.targetElement=null},t.prototype.onMouse=function(t){return this.targetElement?t.forwardedTouchEvent?!0:t.cancelable&&(!this.needsClick(this.targetElement)||this.cancelNextClick)?(t.stopImmediatePropagation?t.stopImmediatePropagation():t.propagationStopped=!0,t.stopPropagation(),t.preventDefault(),!1):!0:!0},t.prototype.onClick=function(t){var e;return this.trackingClick?(this.targetElement=null,this.trackingClick=!1,!0):"submit"===t.target.type&&0===t.detail?!0:(e=this.onMouse(t),e||(this.targetElement=null),e)},t.prototype.destroy=function(){var t=this.layer;n&&(t.removeEventListener("mouseover",this.onMouse,!0),t.removeEventListener("mousedown",this.onMouse,!0),t.removeEventListener("mouseup",this.onMouse,!0)),t.removeEventListener("click",this.onClick,!0),t.removeEventListener("touchstart",this.onTouchStart,!1),t.removeEventListener("touchmove",this.onTouchMove,!1),t.removeEventListener("touchend",this.onTouchEnd,!1),t.removeEventListener("touchcancel",this.onTouchCancel,!1)},t.notNeeded=function(t){var e,o,i,r;if("undefined"==typeof window.ontouchstart)return!0;if(o=+(/Chrome\/([0-9]+)/.exec(navigator.userAgent)||[,0])[1]){if(!n)return!0;if(e=document.querySelector("meta[name=viewport]")){if(-1!==e.content.indexOf("user-scalable=no"))return!0;if(o>31&&document.documentElement.scrollWidth<=window.outerWidth)return!0}}if(a&&(i=navigator.userAgent.match(/Version\/([0-9]*)\.([0-9]*)/),i[1]>=10&&i[2]>=3&&(e=document.querySelector("meta[name=viewport]")))){if(-1!==e.content.indexOf("user-scalable=no"))return!0;if(document.documentElement.scrollWidth<=window.outerWidth)return!0}return"none"===t.style.msTouchAction||"manipulation"===t.style.touchAction?!0:(r=+(/Firefox\/([0-9]+)/.exec(navigator.userAgent)||[,0])[1],r>=27&&(e=document.querySelector("meta[name=viewport]"),e&&(-1!==e.content.indexOf("user-scalable=no")||document.documentElement.scrollWidth<=window.outerWidth))?!0:"none"===t.style.touchAction||"manipulation"===t.style.touchAction?!0:!1)},t.attach=function(e,n){return new t(e,n)},"function"==typeof define&&"object"==typeof define.amd&&define.amd?define(function(){return t}):"undefined"!=typeof module&&module.exports?(module.exports=t.attach,module.exports.FastClick=t):window.FastClick=t}(); -------------------------------------------------------------------------------- /lib/font-awesome/HELP-US-OUT.txt: -------------------------------------------------------------------------------- 1 | I hope you love Font Awesome. If you've found it useful, please do me a favor and check out my latest project, 2 | Fonticons (https://fonticons.com). It makes it easy to put the perfect icons on your website. Choose from our awesome, 3 | comprehensive icon sets or copy and paste your own. 4 | 5 | Please. Check it out. 6 | 7 | -Dave Gandy 8 | -------------------------------------------------------------------------------- /lib/font-awesome/bower.json: -------------------------------------------------------------------------------- 1 | {"name":"font-awesome","description":"Font Awesome","keywords":[],"homepage":"http://fontawesome.io","dependencies":{},"devDependencies":{},"license":["OFL-1.1","MIT","CC-BY-3.0"],"main":["less/font-awesome.less","scss/font-awesome.scss"],"ignore":["*/.*","*.json","src","*.yml","Gemfile","Gemfile.lock","*.md"]} -------------------------------------------------------------------------------- /lib/font-awesome/fonts/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lrwinx/lrwinx.github.io/beda2a2a4e83cce586623446e8156138ca63647f/lib/font-awesome/fonts/FontAwesome.otf -------------------------------------------------------------------------------- /lib/font-awesome/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lrwinx/lrwinx.github.io/beda2a2a4e83cce586623446e8156138ca63647f/lib/font-awesome/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /lib/font-awesome/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lrwinx/lrwinx.github.io/beda2a2a4e83cce586623446e8156138ca63647f/lib/font-awesome/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /lib/font-awesome/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lrwinx/lrwinx.github.io/beda2a2a4e83cce586623446e8156138ca63647f/lib/font-awesome/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /lib/font-awesome/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lrwinx/lrwinx.github.io/beda2a2a4e83cce586623446e8156138ca63647f/lib/font-awesome/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /lib/jquery_lazyload/CONTRIBUTING.html: -------------------------------------------------------------------------------- 1 |

    Contributing to Lazy Load

    Only one feature or change per pull request

    Make pull requests only one feature or change at the time. For example you have fixed a bug. You also have optimized some code. Optimization is not related to a bug. These should be submitted as separate pull requests. This way I can easily choose what to include. It is also easier to understand the code changes. Commit messages should be descriptive and full sentences.

    2 |

    Do not commit minified versions. Do not touch the version number. Make the pull requests against 1.9.x branch.

    3 |

    Write meaningful commit messages

    Proper commit message is full sentence. It starts with capital letter but does not end with period. Headlines do not end with period. The GitHub default Update filename.js is not enough. When needed include also longer explanation what the commit does.

    4 |
    Capitalized, short (50 chars or less) summary
     5 | 
     6 | More detailed explanatory text, if necessary.  Wrap it to about 72
     7 | characters or so.  In some contexts, the first line is treated as the
     8 | subject of an email and the rest of the text as the body.  The blank
     9 | line separating the summary from the body is critical (unless you omit
    10 | the body entirely); tools like rebase can get confused if you run the
    11 | two together.
    12 | 

    When in doubt see Tim Pope’s blogpost A Note About Git Commit Messages

    13 |

    Follow the existing coding standards

    When contributing to open source project it is polite to follow the original authors coding standars. They might be different than yours. It is not a holy war. Just follow then original.

    14 |
    var snake_case = "something";
    15 | 
    16 | function camelCase(options) {
    17 | }
    18 | 
    19 | if (true !== false) {
    20 |     console.log("here be dragons");
    21 | }
    22 | 
    23 | -------------------------------------------------------------------------------- /lib/jquery_lazyload/README.html: -------------------------------------------------------------------------------- 1 |

    Lazy Load Plugin for jQuery

    Lazy Load delays loading of images in long web pages. Images outside of viewport wont be loaded before user scrolls to them. This is opposite of image preloading.

    2 |

    Using Lazy Load on long web pages containing many large images makes the page load faster. Browser will be in ready state after loading visible images. In some cases it can also help to reduce server load.

    3 |

    Lazy Load is inspired by YUI ImageLoader Utility by Matt Mlinac.

    4 |

    How to Use?

    Lazy Load depends on jQuery. Include them both in end of your HTML code:

    5 |
    <script src="jquery.js" type="text/javascript"></script>
     6 | <script src="jquery.lazyload.js" type="text/javascript"></script>
     7 | 
    8 |

    You must alter your HTML code. URL of the real image must be put into data-original attribute. It is good idea to give Lazy Loaded image a specific class. This way you can easily control which images plugin is binded to. Note that you should have width and height attributes in your image tag.

    9 |
    <img class="lazy" data-original="img/example.jpg" width="640" height="480">
    10 | 
    11 |

    then in your code do:

    12 |
    $("img.lazy").lazyload();
    13 | 
    14 |

    This causes all images of class lazy to be lazy loaded.

    15 |

    More information on Lazy Load project page.

    16 |

    Install

    You can install with bower or npm.

    17 |
    $ bower install jquery.lazyload
    18 | $ npm install jquery-lazyload
    19 | 
    20 |

    License

    All code licensed under the MIT License. All images licensed under Creative Commons Attribution 3.0 Unported License. In other words you are basically free to do whatever you want. Just don’t remove my name from the source.

    21 | -------------------------------------------------------------------------------- /lib/jquery_lazyload/bower.json: -------------------------------------------------------------------------------- 1 | {"name":"jquery_lazyload","version":"1.9.4","homepage":"http://www.appelsiini.net/projects/lazyload","authors":["Mika Tuupola "],"description":"jQuery plugin for lazy loading images","main":["jquery.lazyload.js","jquery.scrollstop.js"],"license":"MIT","ignore":["**/.*","**/*.min.js","**/*.html","**/*.textile","Gruntfile.js","lazyload.jquery.json","package.json","node_modules","bower_components","test","img"]} -------------------------------------------------------------------------------- /lib/jquery_lazyload/jquery.lazyload.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Lazy Load - jQuery plugin for lazy loading images 3 | * 4 | * Copyright (c) 2007-2015 Mika Tuupola 5 | * 6 | * Licensed under the MIT license: 7 | * http://www.opensource.org/licenses/mit-license.php 8 | * 9 | * Project home: 10 | * http://www.appelsiini.net/projects/lazyload 11 | * 12 | * Version: 1.9.7 13 | * 14 | */ 15 | 16 | (function($, window, document, undefined) { 17 | var $window = $(window); 18 | 19 | $.fn.lazyload = function(options) { 20 | var elements = this; 21 | var $container; 22 | var settings = { 23 | threshold : 0, 24 | failure_limit : 0, 25 | event : "scroll", 26 | effect : "show", 27 | container : window, 28 | data_attribute : "original", 29 | skip_invisible : false, 30 | appear : null, 31 | load : null, 32 | placeholder : "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" 33 | }; 34 | 35 | function update() { 36 | var counter = 0; 37 | 38 | elements.each(function() { 39 | var $this = $(this); 40 | if (settings.skip_invisible && !$this.is(":visible")) { 41 | return; 42 | } 43 | if ($.abovethetop(this, settings) || 44 | $.leftofbegin(this, settings)) { 45 | /* Nothing. */ 46 | } else if (!$.belowthefold(this, settings) && 47 | !$.rightoffold(this, settings)) { 48 | $this.trigger("appear"); 49 | /* if we found an image we'll load, reset the counter */ 50 | counter = 0; 51 | } else { 52 | if (++counter > settings.failure_limit) { 53 | return false; 54 | } 55 | } 56 | }); 57 | 58 | } 59 | 60 | if(options) { 61 | /* Maintain BC for a couple of versions. */ 62 | if (undefined !== options.failurelimit) { 63 | options.failure_limit = options.failurelimit; 64 | delete options.failurelimit; 65 | } 66 | if (undefined !== options.effectspeed) { 67 | options.effect_speed = options.effectspeed; 68 | delete options.effectspeed; 69 | } 70 | 71 | $.extend(settings, options); 72 | } 73 | 74 | /* Cache container as jQuery as object. */ 75 | $container = (settings.container === undefined || 76 | settings.container === window) ? $window : $(settings.container); 77 | 78 | /* Fire one scroll event per scroll. Not one scroll event per image. */ 79 | if (0 === settings.event.indexOf("scroll")) { 80 | $container.bind(settings.event, function() { 81 | return update(); 82 | }); 83 | } 84 | 85 | this.each(function() { 86 | var self = this; 87 | var $self = $(self); 88 | 89 | self.loaded = false; 90 | 91 | /* If no src attribute given use data:uri. */ 92 | if ($self.attr("src") === undefined || $self.attr("src") === false) { 93 | if ($self.is("img")) { 94 | $self.attr("src", settings.placeholder); 95 | } 96 | } 97 | 98 | /* When appear is triggered load original image. */ 99 | $self.one("appear", function() { 100 | if (!this.loaded) { 101 | if (settings.appear) { 102 | var elements_left = elements.length; 103 | settings.appear.call(self, elements_left, settings); 104 | } 105 | $("") 106 | .bind("load", function() { 107 | 108 | var original = $self.attr("data-" + settings.data_attribute); 109 | $self.hide(); 110 | if ($self.is("img")) { 111 | $self.attr("src", original); 112 | } else { 113 | $self.css("background-image", "url('" + original + "')"); 114 | } 115 | $self[settings.effect](settings.effect_speed); 116 | 117 | self.loaded = true; 118 | 119 | /* Remove image from array so it is not looped next time. */ 120 | var temp = $.grep(elements, function(element) { 121 | return !element.loaded; 122 | }); 123 | elements = $(temp); 124 | 125 | if (settings.load) { 126 | var elements_left = elements.length; 127 | settings.load.call(self, elements_left, settings); 128 | } 129 | }) 130 | .attr("src", $self.attr("data-" + settings.data_attribute)); 131 | } 132 | }); 133 | 134 | /* When wanted event is triggered load original image */ 135 | /* by triggering appear. */ 136 | if (0 !== settings.event.indexOf("scroll")) { 137 | $self.bind(settings.event, function() { 138 | if (!self.loaded) { 139 | $self.trigger("appear"); 140 | } 141 | }); 142 | } 143 | }); 144 | 145 | /* Check if something appears when window is resized. */ 146 | $window.bind("resize", function() { 147 | update(); 148 | }); 149 | 150 | /* With IOS5 force loading images when navigating with back button. */ 151 | /* Non optimal workaround. */ 152 | if ((/(?:iphone|ipod|ipad).*os 5/gi).test(navigator.appVersion)) { 153 | $window.bind("pageshow", function(event) { 154 | if (event.originalEvent && event.originalEvent.persisted) { 155 | elements.each(function() { 156 | $(this).trigger("appear"); 157 | }); 158 | } 159 | }); 160 | } 161 | 162 | /* Force initial check if images should appear. */ 163 | $(document).ready(function() { 164 | update(); 165 | }); 166 | 167 | return this; 168 | }; 169 | 170 | /* Convenience methods in jQuery namespace. */ 171 | /* Use as $.belowthefold(element, {threshold : 100, container : window}) */ 172 | 173 | $.belowthefold = function(element, settings) { 174 | var fold; 175 | 176 | if (settings.container === undefined || settings.container === window) { 177 | fold = (window.innerHeight ? window.innerHeight : $window.height()) + $window.scrollTop(); 178 | } else { 179 | fold = $(settings.container).offset().top + $(settings.container).height(); 180 | } 181 | 182 | return fold <= $(element).offset().top - settings.threshold; 183 | }; 184 | 185 | $.rightoffold = function(element, settings) { 186 | var fold; 187 | 188 | if (settings.container === undefined || settings.container === window) { 189 | fold = $window.width() + $window.scrollLeft(); 190 | } else { 191 | fold = $(settings.container).offset().left + $(settings.container).width(); 192 | } 193 | 194 | return fold <= $(element).offset().left - settings.threshold; 195 | }; 196 | 197 | $.abovethetop = function(element, settings) { 198 | var fold; 199 | 200 | if (settings.container === undefined || settings.container === window) { 201 | fold = $window.scrollTop(); 202 | } else { 203 | fold = $(settings.container).offset().top; 204 | } 205 | 206 | return fold >= $(element).offset().top + settings.threshold + $(element).height(); 207 | }; 208 | 209 | $.leftofbegin = function(element, settings) { 210 | var fold; 211 | 212 | if (settings.container === undefined || settings.container === window) { 213 | fold = $window.scrollLeft(); 214 | } else { 215 | fold = $(settings.container).offset().left; 216 | } 217 | 218 | return fold >= $(element).offset().left + settings.threshold + $(element).width(); 219 | }; 220 | 221 | $.inviewport = function(element, settings) { 222 | return !$.rightoffold(element, settings) && !$.leftofbegin(element, settings) && 223 | !$.belowthefold(element, settings) && !$.abovethetop(element, settings); 224 | }; 225 | 226 | /* Custom selectors for your convenience. */ 227 | /* Use as $("img:below-the-fold").something() or */ 228 | /* $("img").filter(":below-the-fold").something() which is faster */ 229 | 230 | $.extend($.expr[":"], { 231 | "below-the-fold" : function(a) { return $.belowthefold(a, {threshold : 0}); }, 232 | "above-the-top" : function(a) { return !$.belowthefold(a, {threshold : 0}); }, 233 | "right-of-screen": function(a) { return $.rightoffold(a, {threshold : 0}); }, 234 | "left-of-screen" : function(a) { return !$.rightoffold(a, {threshold : 0}); }, 235 | "in-viewport" : function(a) { return $.inviewport(a, {threshold : 0}); }, 236 | /* Maintain BC for couple of versions. */ 237 | "above-the-fold" : function(a) { return !$.belowthefold(a, {threshold : 0}); }, 238 | "right-of-fold" : function(a) { return $.rightoffold(a, {threshold : 0}); }, 239 | "left-of-fold" : function(a) { return !$.rightoffold(a, {threshold : 0}); } 240 | }); 241 | 242 | })(jQuery, window, document); 243 | -------------------------------------------------------------------------------- /lib/jquery_lazyload/jquery.scrollstop.js: -------------------------------------------------------------------------------- 1 | /* http://james.padolsey.com/javascript/special-scroll-events-for-jquery/ */ 2 | 3 | (function(){ 4 | 5 | var special = jQuery.event.special, 6 | uid1 = "D" + (+new Date()), 7 | uid2 = "D" + (+new Date() + 1); 8 | 9 | special.scrollstart = { 10 | setup: function() { 11 | 12 | var timer, 13 | handler = function(evt) { 14 | 15 | var _self = this, 16 | _args = arguments; 17 | 18 | if (timer) { 19 | clearTimeout(timer); 20 | } else { 21 | evt.type = "scrollstart"; 22 | jQuery.event.dispatch.apply(_self, _args); 23 | } 24 | 25 | timer = setTimeout( function(){ 26 | timer = null; 27 | }, special.scrollstop.latency); 28 | 29 | }; 30 | 31 | jQuery(this).bind("scroll", handler).data(uid1, handler); 32 | 33 | }, 34 | teardown: function(){ 35 | jQuery(this).unbind( "scroll", jQuery(this).data(uid1) ); 36 | } 37 | }; 38 | 39 | special.scrollstop = { 40 | latency: 300, 41 | setup: function() { 42 | 43 | var timer, 44 | handler = function(evt) { 45 | 46 | var _self = this, 47 | _args = arguments; 48 | 49 | if (timer) { 50 | clearTimeout(timer); 51 | } 52 | 53 | timer = setTimeout( function(){ 54 | 55 | timer = null; 56 | evt.type = "scrollstop"; 57 | jQuery.event.dispatch.apply(_self, _args); 58 | 59 | 60 | }, special.scrollstop.latency); 61 | 62 | }; 63 | 64 | jQuery(this).bind("scroll", handler).data(uid2, handler); 65 | 66 | }, 67 | teardown: function() { 68 | jQuery(this).unbind( "scroll", jQuery(this).data(uid2) ); 69 | } 70 | }; 71 | 72 | })(); -------------------------------------------------------------------------------- /lib/ua-parser-js/dist/ua-parser.pack.js: -------------------------------------------------------------------------------- 1 | /** 2 | * UAParser.js v0.7.9 3 | * Lightweight JavaScript-based User-Agent string parser 4 | * https://github.com/faisalman/ua-parser-js 5 | * 6 | * Copyright © 2012-2015 Faisal Salman 7 | * Dual licensed under GPLv2 & MIT 8 | */ 9 | !function(i,e){"use strict";var s="0.7.9",o="",r="?",n="function",a="undefined",t="object",w="string",l="major",d="model",p="name",c="type",u="vendor",m="version",f="architecture",g="console",b="mobile",h="tablet",v="smarttv",x="wearable",k="embedded",y={extend:function(i,e){for(var s in e)-1!=="browser cpu device engine os".indexOf(s)&&e[s].length%2===0&&(i[s]=e[s].concat(i[s]));return i},has:function(i,e){return"string"==typeof i?-1!==e.toLowerCase().indexOf(i.toLowerCase()):!1},lowerize:function(i){return i.toLowerCase()},major:function(i){return typeof i===w?i.split(".")[0]:e}},A={rgx:function(){for(var i,s,o,r,w,l,d,p=0,c=arguments;p0?2==w.length?i[w[0]]=typeof w[1]==n?w[1].call(this,d):w[1]:3==w.length?i[w[0]]=typeof w[1]!==n||w[1].exec&&w[1].test?d?d.replace(w[1],w[2]):e:d?w[1].call(this,d,w[2]):e:4==w.length&&(i[w[0]]=d?w[3].call(this,d.replace(w[1],w[2])):e):i[w]=d?d:e;p+=2}return i},str:function(i,s){for(var o in s)if(typeof s[o]===t&&s[o].length>0){for(var n=0;n 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 标签: logback | 西格玛的博客 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 372 | 373 | 374 | 375 | 380 | 381 | 382 | 383 | 384 | 385 | 386 | 387 | 388 | 389 | 390 | 391 | 392 | 393 | 394 | 395 | 396 | 397 | 398 | 399 | 400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 419 | 420 | 421 | 422 | 423 | 424 | 425 | 426 | 427 | 428 | 429 | 430 | 431 | 432 | 433 | 434 | 435 | 436 | 437 | 438 | 439 | 440 | 441 | 442 | 443 | 450 | 451 | 452 | 453 | 454 | 455 | 456 | 457 | 458 | 459 | 460 | 461 | 462 | 463 | 464 | 465 | 466 | 467 | 468 | 469 | -------------------------------------------------------------------------------- /tags/redis/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 标签: redis | 西格玛的博客 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 372 | 373 | 374 | 375 | 380 | 381 | 382 | 383 | 384 | 385 | 386 | 387 | 388 | 389 | 390 | 391 | 392 | 393 | 394 | 395 | 396 | 397 | 398 | 399 | 400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 419 | 420 | 421 | 422 | 423 | 424 | 425 | 426 | 427 | 428 | 429 | 430 | 431 | 432 | 433 | 434 | 435 | 436 | 437 | 438 | 439 | 440 | 441 | 442 | 443 | 450 | 451 | 452 | 453 | 454 | 455 | 456 | 457 | 458 | 459 | 460 | 461 | 462 | 463 | 464 | 465 | 466 | 467 | 468 | 469 | -------------------------------------------------------------------------------- /tags/日志/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 标签: 日志 | 西格玛的博客 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 372 | 373 | 374 | 375 | 380 | 381 | 382 | 383 | 384 | 385 | 386 | 387 | 388 | 389 | 390 | 391 | 392 | 393 | 394 | 395 | 396 | 397 | 398 | 399 | 400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 419 | 420 | 421 | 422 | 423 | 424 | 425 | 426 | 427 | 428 | 429 | 430 | 431 | 432 | 433 | 434 | 435 | 436 | 437 | 438 | 439 | 440 | 441 | 442 | 443 | 450 | 451 | 452 | 453 | 454 | 455 | 456 | 457 | 458 | 459 | 460 | 461 | 462 | 463 | 464 | 465 | 466 | 467 | 468 | 469 | -------------------------------------------------------------------------------- /tags/面试/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 标签: 面试 | 西格玛的博客 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 372 | 373 | 374 | 375 | 380 | 381 | 382 | 383 | 384 | 385 | 386 | 387 | 388 | 389 | 390 | 391 | 392 | 393 | 394 | 395 | 396 | 397 | 398 | 399 | 400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 419 | 420 | 421 | 422 | 423 | 424 | 425 | 426 | 427 | 428 | 429 | 430 | 431 | 432 | 433 | 434 | 435 | 436 | 437 | 438 | 439 | 440 | 441 | 442 | 443 | 450 | 451 | 452 | 453 | 454 | 455 | 456 | 457 | 458 | 459 | 460 | 461 | 462 | 463 | 464 | 465 | 466 | 467 | 468 | 469 | --------------------------------------------------------------------------------