diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..20efa43 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.token diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 3852f23..dc5cff3 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -3,7 +3,7 @@ image: alpine:latest pages: stage: deploy script: - - echo 'Nothing to do...' + - echo 'Deploying...' artifacts: paths: - public diff --git a/public/css/styles.css b/public/css/styles.css new file mode 100644 index 0000000..dcfa164 --- /dev/null +++ b/public/css/styles.css @@ -0,0 +1,264 @@ +/**************************************************/ +/******************* RESETEADOR *******************/ +/**************************************************/ + +/* http://meyerweb.com/eric/tools/css/reset/ v2.0 */ + +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, embed, +figure, figcaption, footer, header, hgroup, +menu, nav, output, ruby, section, summary, +time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; +} + +/* Old browsers / Para viejos exploradores */ + +article, aside, details, figcaption, figure, +footer, header, hgroup, menu, nav, section { + display: block; +} + +body { + line-height: 1.5; +} + +ol, ul { + list-style: none; +} + +blockquote, q { + quotes: none; +} + +blockquote:before, blockquote:after, +q:before, q:after { + content: ''; + content: none; +} + +table { + border-collapse: collapse; + border-spacing: 0; +} + +/**************************************************/ + +body * { + font-family: AlegreyaSansRegular, sans-serif; + line-height: 1.15; + font-weight: normal; + font-style: normal; +} + +body b { + font-family: "AlegreyaSansBold", sans-serif; + font-weight: bold; + font-style: normal; +} + +body i { + font-family: "AlegreyaSansItalic", sans-serif; + font-weight: normal; + font-style: italic; +} + +body a { + text-decoration: none; +} + +body span.icon { + padding-right: .25rem; +} + +header { + width: 100%; + height: 20rem; + background-image: url('../img/banner_color.jpg'); + background-position: bottom; + background-repeat: no-repeat; + background-size: cover; + display: flex; + align-items: center; + justify-content: center; +} + +header > img { + display: block; + height: 200px; + width: auto; + margin: auto; +} + +nav, footer { + position: -webkit-sticky; /* Safari */ + position: sticky; + top: 0; + background-color: #e5582d; + color: white; + padding: 1rem; +} + +nav { + margin-bottom: 2rem; + font-size: 1.25rem; +} + +nav a, footer a { + color: white; +} + +nav li { + display: inline; +} + +nav li:not(:first-of-type) { + margin-left: 1rem; +} + +nav input#search-bar { + display: inline-block; + border-radius: 1rem; + padding: .15rem .5rem; + border: none; + width: 200px; + box-sizing: border-box; + color: #2e2e2e; +} + +nav input#search-bar:focus { + outline: none; +} + +section { + max-width: 40rem; + margin: auto; + padding: 0 1rem; + font-size: 1.15rem; +} + +section > h1 { + font-size: 2rem; + margin-top: 2rem; +} + +section > h1 + p { + margin-top: 1rem; +} + +li.link { + scroll-margin-top: 5rem; + padding-top: 1rem; +} + +li.link:not(:first-of-type) { + margin-top: 1rem; +} + +li.link + li.link { + border-top: 1px dashed black; +} + +li.link h1 { + font-size: 1.5rem; +} + +li.link a.anchor { + font-size: 1rem; + padding-right: .5rem; +} + +li.link summary { + color: #e5582d; + margin-left: -1rem; +} + +li.link p.description, +li.link p.tags, +li.link p.dates { + color: gray; +} + +li.link p.description:before, +li.link p.tags:before, +li.link p.dates:before, +li.link summary:before { + padding-right: .5rem; +} + +li.link p.description:before { + content: "📝"; +} + +li.link p.tags:before { + content: "🏷️"; +} + +li.link p.dates:before { + content: "📅"; +} + +li.link span.created:before { + content: "Creado: "; +} + +li.link span.updated:before { + content: "Actualizado: "; + padding-left: 1rem; +} + +li.link div.info { + margin-top: 1rem; +} + +li.link a.link { + display: table-cell; + padding-right: .5em; +} + +details { + padding-left: 1rem; +} + +details h1, details h2 { + margin: 1rem auto; +} + +details h1:before, details h2:before { + color: #e5582d; +} + +details h1:before { + content: "# "; +} + +details h2:before { + content: "## "; +} + +details h3:before { + content: "### "; +} + +details p + p { + text-indent: 1rem; +} + +footer { + margin-top: 2rem; + padding: 1em 25%; + text-align: center; +} diff --git a/public/img/banner_color.jpg b/public/img/banner_color.jpg new file mode 100644 index 0000000..c8d686b Binary files /dev/null and b/public/img/banner_color.jpg differ diff --git a/public/img/favicon.png b/public/img/favicon.png new file mode 100644 index 0000000..6f7a6b6 Binary files /dev/null and b/public/img/favicon.png differ diff --git a/public/img/logo.png b/public/img/logo.png new file mode 100644 index 0000000..7630f47 Binary files /dev/null and b/public/img/logo.png differ diff --git a/public/index.html b/public/index.html new file mode 100644 index 0000000..cfa3b6c --- /dev/null +++ b/public/index.html @@ -0,0 +1,76 @@ + + + + Blog del perro + + + + + + + + + + + +
+ Logotipo de perro tuerto +
+ + +
+

Acerca

+Hola, soy perro tuerto. Mi formación académica es en Filosofía, mi profesión es la edición de publicaciones (libros, fanzines, revistas, etc.) y mi programación se enfoca en el desarrollo de metodologías libres para la publicación. Soy fan de las humanidades, la paleoantropología y las ciencias de la computación, así como soy voluntario en organizaciones sobre edición, software y cultura libres, como Miau, Cuates o Wikipedia. Doy soporte técnico a la Academia Mexicana de la Lengua y puedo ayudarte en tus proyectos. En este espacio comparto enlaces que me parecen chéveres. +
+ + + + + diff --git a/public/js/list.min.js b/public/js/list.min.js new file mode 100644 index 0000000..8131881 --- /dev/null +++ b/public/js/list.min.js @@ -0,0 +1,2 @@ +var List;List=function(){var t={"./src/add-async.js":function(t){t.exports=function(t){return function e(r,n,s){var i=r.splice(0,50);s=(s=s||[]).concat(t.add(i)),r.length>0?setTimeout((function(){e(r,n,s)}),1):(t.update(),n(s))}}},"./src/filter.js":function(t){t.exports=function(t){return t.handlers.filterStart=t.handlers.filterStart||[],t.handlers.filterComplete=t.handlers.filterComplete||[],function(e){if(t.trigger("filterStart"),t.i=1,t.reset.filter(),void 0===e)t.filtered=!1;else{t.filtered=!0;for(var r=t.items,n=0,s=r.length;nv.page,a=new g(t[s],void 0,n),v.items.push(a),r.push(a)}return v.update(),r}m(t.slice(0),e)}},this.show=function(t,e){return this.i=t,this.page=e,v.update(),v},this.remove=function(t,e,r){for(var n=0,s=0,i=v.items.length;s-1&&r.splice(n,1),v},this.trigger=function(t){for(var e=v.handlers[t].length;e--;)v.handlers[t][e](v);return v},this.reset={filter:function(){for(var t=v.items,e=t.length;e--;)t[e].filtered=!1;return v},search:function(){for(var t=v.items,e=t.length;e--;)t[e].found=!1;return v}},this.update=function(){var t=v.items,e=t.length;v.visibleItems=[],v.matchingItems=[],v.templater.clear();for(var r=0;r=v.i&&v.visibleItems.lengthe},innerWindow:function(t,e,r){return t>=e-r&&t<=e+r},dotted:function(t,e,r,n,s,i,a){return this.dottedLeft(t,e,r,n,s,i)||this.dottedRight(t,e,r,n,s,i,a)},dottedLeft:function(t,e,r,n,s,i){return e==r+1&&!this.innerWindow(e,s,i)&&!this.right(e,n)},dottedRight:function(t,e,r,n,s,i,a){return!t.items[a-1].values().dotted&&(e==n&&!this.innerWindow(e,s,i)&&!this.right(e,n))}};return function(e){var n=new i(t.listContainer.id,{listClass:e.paginationClass||"pagination",item:e.item||"
  • ",valueNames:["page","dotted"],searchClass:"pagination-search-that-is-not-supposed-to-exist",sortClass:"pagination-sort-that-is-not-supposed-to-exist"});s.bind(n.listContainer,"click",(function(e){var r=e.target||e.srcElement,n=t.utils.getAttribute(r,"data-page"),s=t.utils.getAttribute(r,"data-i");s&&t.show((s-1)*n+1,n)})),t.on("updated",(function(){r(n,e)})),r(n,e)}}},"./src/parse.js":function(t,e,r){t.exports=function(t){var e=r("./src/item.js")(t),n=function(r,n){for(var s=0,i=r.length;s0?setTimeout((function(){e(r,s)}),1):(t.update(),t.trigger("parseComplete"))};return t.handlers.parseComplete=t.handlers.parseComplete||[],function(){var e=function(t){for(var e=t.childNodes,r=[],n=0,s=e.length;n]/g.exec(t)){var e=document.createElement("tbody");return e.innerHTML=t,e.firstElementChild}if(-1!==t.indexOf("<")){var r=document.createElement("div");return r.innerHTML=t,r.firstElementChild}}},a=function(e,r,n){var s=void 0,i=function(e){for(var r=0,n=t.valueNames.length;r=1;)t.list.removeChild(t.list.firstChild)},function(){var r;if("function"!=typeof t.item){if(!(r="string"==typeof t.item?-1===t.item.indexOf("<")?document.getElementById(t.item):i(t.item):s()))throw new Error("The list needs to have at least one item on init otherwise you'll have to add a template.");r=n(r,t.valueNames),e=function(){return r.cloneNode(!0)}}else e=function(e){var r=t.item(e);return i(r)}}()};t.exports=function(t){return new e(t)}},"./src/utils/classes.js":function(t,e,r){var n=r("./src/utils/index-of.js"),s=/\s+/;Object.prototype.toString;function i(t){if(!t||!t.nodeType)throw new Error("A DOM element reference is required");this.el=t,this.list=t.classList}t.exports=function(t){return new i(t)},i.prototype.add=function(t){if(this.list)return this.list.add(t),this;var e=this.array();return~n(e,t)||e.push(t),this.el.className=e.join(" "),this},i.prototype.remove=function(t){if(this.list)return this.list.remove(t),this;var e=this.array(),r=n(e,t);return~r&&e.splice(r,1),this.el.className=e.join(" "),this},i.prototype.toggle=function(t,e){return this.list?(void 0!==e?e!==this.list.toggle(t,e)&&this.list.toggle(t):this.list.toggle(t),this):(void 0!==e?e?this.add(t):this.remove(t):this.has(t)?this.remove(t):this.add(t),this)},i.prototype.array=function(){var t=(this.el.getAttribute("class")||"").replace(/^\s+|\s+$/g,"").split(s);return""===t[0]&&t.shift(),t},i.prototype.has=i.prototype.contains=function(t){return this.list?this.list.contains(t):!!~n(this.array(),t)}},"./src/utils/events.js":function(t,e,r){var n=window.addEventListener?"addEventListener":"attachEvent",s=window.removeEventListener?"removeEventListener":"detachEvent",i="addEventListener"!==n?"on":"",a=r("./src/utils/to-array.js");e.bind=function(t,e,r,s){for(var o=0,l=(t=a(t)).length;o32)return!1;var a=n,o=function(){var t,r={};for(t=0;t=p;b--){var j=o[t.charAt(b-1)];if(C[b]=0===m?(C[b+1]<<1|1)&j:(C[b+1]<<1|1)&j|(v[b+1]|v[b])<<1|1|v[b+1],C[b]&d){var x=l(m,b-1);if(x<=u){if(u=x,!((c=b-1)>a))break;p=Math.max(1,2*a-c)}}}if(l(m+1,a)>u)break;v=C}return!(c<0)}},"./src/utils/get-attribute.js":function(t){t.exports=function(t,e){var r=t.getAttribute&&t.getAttribute(e)||null;if(!r)for(var n=t.attributes,s=n.length,i=0;i=48&&t<=57}function i(t,e){for(var i=(t+="").length,a=(e+="").length,o=0,l=0;o=i&&l=a?-1:l>=a&&o=i?1:i-a}i.caseInsensitive=i.i=function(t,e){return i((""+t).toLowerCase(),(""+e).toLowerCase())},Object.defineProperties(i,{alphabet:{get:function(){return e},set:function(t){r=[];var s=0;if(e=t)for(;s \r\n Obras\r\n ›\r\n Libros electrónicos","website_description":"","is_archived":false,"unread":false,"shared":true,"tag_names":["esteticas","historia","ideas","blog"],"date_added":"2023-06-24T23:31:04.671856Z","date_modified":"2023-06-25T21:59:05.406668Z"}]} \ No newline at end of file diff --git a/scripts/make.py b/scripts/make.py new file mode 100644 index 0000000..c995de5 --- /dev/null +++ b/scripts/make.py @@ -0,0 +1,85 @@ +import re +import sys +import json +from datetime import datetime +from pathlib import Path + +root = Path(__file__).parent.parent +about = re.sub(r'\s+', ' ', """ + Hola, soy perro tuerto. Mi formación académica es en Filosofía, mi + profesión es la edición de publicaciones (libros, fanzines, revistas, etc.) + y mi programación se enfoca en el desarrollo de metodologías libres para la + publicación. Soy fan de las humanidades, la paleoantropología y las + ciencias de la computación, así como soy voluntario en organizaciones sobre + edición, software y cultura libres, como Miau, Cuates o Wikipedia. + Doy soporte técnico a la Academia Mexicana de la Lengua y puedo ayudarte + en tus proyectos. En este espacio comparto enlaces que me parecen + chéveres. +""").strip() +contact = { + "site": "https://perrotuerto.blog", + "gitlab": "https://gitlab.com/perrotuerto", + "cuates": "https://git.cuates.net/perro", + "wikipedia": "https://es.wikipedia.org/wiki/Usuario:Perrotuerto", + "github": "https://github.com/perrotuerto", + "email": "hi@perrotuerto.blog", +} +links = json.loads(Path(sys.argv[1]).read_text()) +data = {"acerca": about, "contacto": contact, "links": links["results"]} +index = root / "public" / "index.html" +template = (root / "src" / "template.html").read_text() +body = "" + +for key, val in data.items(): + if key == "contacto": + for name, url in val.items(): + template = re.sub(f'#{name.upper()}#', url, template) + continue + body += f'\n
    ' + body += f'\n

    {key.capitalize()}

    ' + if isinstance(val, str): + body += f'\n{val}' + else: + body += '
      ' + for link in val: + date = "%d/%m/%Y" + url = link["url"] + created = link["date_added"] + updated = link["date_modified"] + created = datetime.fromisoformat(created).strftime(date) + updated = datetime.fromisoformat(updated).strftime(date) + tags = filter(lambda x: x != "blog", link["tag_names"]) + tags = map(lambda x: f'#{x}', tags) + tags = map(lambda x: f'{x}', tags) + body += f'\n' + body += "
    " + body += '\n
    ' + +index.write_text(re.sub('#LINKS#', body, template)) diff --git a/scripts/update.sh b/scripts/update.sh new file mode 100644 index 0000000..85e8d7a --- /dev/null +++ b/scripts/update.sh @@ -0,0 +1,26 @@ +JSON=public/perro.json + +# Va a la raíz del repo +cd $(dirname $0)/.. + +# Limpia sitio +rm -rf public +mkdir public +cp -r src/* public +rm public/*.* + +# Descarga info de GitLab +curl --request GET \ + -s -o $JSON \ + -H "Authorization: Token $(<.token)" \ + "https://linkding.cuates.net/api/bookmarks/?q=%23blog" + +# Rehace sitio y JSON +python3 ./scripts/make.py $JSON + +# Hace commit al repo si hubo cambios +if [ -n "$(git status --porcelain)" ]; then + git add . + git commit -m "Actualización" + git push +fi diff --git a/src/css/styles.css b/src/css/styles.css new file mode 100644 index 0000000..dcfa164 --- /dev/null +++ b/src/css/styles.css @@ -0,0 +1,264 @@ +/**************************************************/ +/******************* RESETEADOR *******************/ +/**************************************************/ + +/* http://meyerweb.com/eric/tools/css/reset/ v2.0 */ + +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, embed, +figure, figcaption, footer, header, hgroup, +menu, nav, output, ruby, section, summary, +time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; +} + +/* Old browsers / Para viejos exploradores */ + +article, aside, details, figcaption, figure, +footer, header, hgroup, menu, nav, section { + display: block; +} + +body { + line-height: 1.5; +} + +ol, ul { + list-style: none; +} + +blockquote, q { + quotes: none; +} + +blockquote:before, blockquote:after, +q:before, q:after { + content: ''; + content: none; +} + +table { + border-collapse: collapse; + border-spacing: 0; +} + +/**************************************************/ + +body * { + font-family: AlegreyaSansRegular, sans-serif; + line-height: 1.15; + font-weight: normal; + font-style: normal; +} + +body b { + font-family: "AlegreyaSansBold", sans-serif; + font-weight: bold; + font-style: normal; +} + +body i { + font-family: "AlegreyaSansItalic", sans-serif; + font-weight: normal; + font-style: italic; +} + +body a { + text-decoration: none; +} + +body span.icon { + padding-right: .25rem; +} + +header { + width: 100%; + height: 20rem; + background-image: url('../img/banner_color.jpg'); + background-position: bottom; + background-repeat: no-repeat; + background-size: cover; + display: flex; + align-items: center; + justify-content: center; +} + +header > img { + display: block; + height: 200px; + width: auto; + margin: auto; +} + +nav, footer { + position: -webkit-sticky; /* Safari */ + position: sticky; + top: 0; + background-color: #e5582d; + color: white; + padding: 1rem; +} + +nav { + margin-bottom: 2rem; + font-size: 1.25rem; +} + +nav a, footer a { + color: white; +} + +nav li { + display: inline; +} + +nav li:not(:first-of-type) { + margin-left: 1rem; +} + +nav input#search-bar { + display: inline-block; + border-radius: 1rem; + padding: .15rem .5rem; + border: none; + width: 200px; + box-sizing: border-box; + color: #2e2e2e; +} + +nav input#search-bar:focus { + outline: none; +} + +section { + max-width: 40rem; + margin: auto; + padding: 0 1rem; + font-size: 1.15rem; +} + +section > h1 { + font-size: 2rem; + margin-top: 2rem; +} + +section > h1 + p { + margin-top: 1rem; +} + +li.link { + scroll-margin-top: 5rem; + padding-top: 1rem; +} + +li.link:not(:first-of-type) { + margin-top: 1rem; +} + +li.link + li.link { + border-top: 1px dashed black; +} + +li.link h1 { + font-size: 1.5rem; +} + +li.link a.anchor { + font-size: 1rem; + padding-right: .5rem; +} + +li.link summary { + color: #e5582d; + margin-left: -1rem; +} + +li.link p.description, +li.link p.tags, +li.link p.dates { + color: gray; +} + +li.link p.description:before, +li.link p.tags:before, +li.link p.dates:before, +li.link summary:before { + padding-right: .5rem; +} + +li.link p.description:before { + content: "📝"; +} + +li.link p.tags:before { + content: "🏷️"; +} + +li.link p.dates:before { + content: "📅"; +} + +li.link span.created:before { + content: "Creado: "; +} + +li.link span.updated:before { + content: "Actualizado: "; + padding-left: 1rem; +} + +li.link div.info { + margin-top: 1rem; +} + +li.link a.link { + display: table-cell; + padding-right: .5em; +} + +details { + padding-left: 1rem; +} + +details h1, details h2 { + margin: 1rem auto; +} + +details h1:before, details h2:before { + color: #e5582d; +} + +details h1:before { + content: "# "; +} + +details h2:before { + content: "## "; +} + +details h3:before { + content: "### "; +} + +details p + p { + text-indent: 1rem; +} + +footer { + margin-top: 2rem; + padding: 1em 25%; + text-align: center; +} diff --git a/src/img/banner_color.jpg b/src/img/banner_color.jpg new file mode 100644 index 0000000..c8d686b Binary files /dev/null and b/src/img/banner_color.jpg differ diff --git a/src/img/favicon.png b/src/img/favicon.png new file mode 100644 index 0000000..6f7a6b6 Binary files /dev/null and b/src/img/favicon.png differ diff --git a/src/img/logo.png b/src/img/logo.png new file mode 100644 index 0000000..7630f47 Binary files /dev/null and b/src/img/logo.png differ diff --git a/src/js/list.min.js b/src/js/list.min.js new file mode 100644 index 0000000..8131881 --- /dev/null +++ b/src/js/list.min.js @@ -0,0 +1,2 @@ +var List;List=function(){var t={"./src/add-async.js":function(t){t.exports=function(t){return function e(r,n,s){var i=r.splice(0,50);s=(s=s||[]).concat(t.add(i)),r.length>0?setTimeout((function(){e(r,n,s)}),1):(t.update(),n(s))}}},"./src/filter.js":function(t){t.exports=function(t){return t.handlers.filterStart=t.handlers.filterStart||[],t.handlers.filterComplete=t.handlers.filterComplete||[],function(e){if(t.trigger("filterStart"),t.i=1,t.reset.filter(),void 0===e)t.filtered=!1;else{t.filtered=!0;for(var r=t.items,n=0,s=r.length;nv.page,a=new g(t[s],void 0,n),v.items.push(a),r.push(a)}return v.update(),r}m(t.slice(0),e)}},this.show=function(t,e){return this.i=t,this.page=e,v.update(),v},this.remove=function(t,e,r){for(var n=0,s=0,i=v.items.length;s-1&&r.splice(n,1),v},this.trigger=function(t){for(var e=v.handlers[t].length;e--;)v.handlers[t][e](v);return v},this.reset={filter:function(){for(var t=v.items,e=t.length;e--;)t[e].filtered=!1;return v},search:function(){for(var t=v.items,e=t.length;e--;)t[e].found=!1;return v}},this.update=function(){var t=v.items,e=t.length;v.visibleItems=[],v.matchingItems=[],v.templater.clear();for(var r=0;r=v.i&&v.visibleItems.lengthe},innerWindow:function(t,e,r){return t>=e-r&&t<=e+r},dotted:function(t,e,r,n,s,i,a){return this.dottedLeft(t,e,r,n,s,i)||this.dottedRight(t,e,r,n,s,i,a)},dottedLeft:function(t,e,r,n,s,i){return e==r+1&&!this.innerWindow(e,s,i)&&!this.right(e,n)},dottedRight:function(t,e,r,n,s,i,a){return!t.items[a-1].values().dotted&&(e==n&&!this.innerWindow(e,s,i)&&!this.right(e,n))}};return function(e){var n=new i(t.listContainer.id,{listClass:e.paginationClass||"pagination",item:e.item||"
  • ",valueNames:["page","dotted"],searchClass:"pagination-search-that-is-not-supposed-to-exist",sortClass:"pagination-sort-that-is-not-supposed-to-exist"});s.bind(n.listContainer,"click",(function(e){var r=e.target||e.srcElement,n=t.utils.getAttribute(r,"data-page"),s=t.utils.getAttribute(r,"data-i");s&&t.show((s-1)*n+1,n)})),t.on("updated",(function(){r(n,e)})),r(n,e)}}},"./src/parse.js":function(t,e,r){t.exports=function(t){var e=r("./src/item.js")(t),n=function(r,n){for(var s=0,i=r.length;s0?setTimeout((function(){e(r,s)}),1):(t.update(),t.trigger("parseComplete"))};return t.handlers.parseComplete=t.handlers.parseComplete||[],function(){var e=function(t){for(var e=t.childNodes,r=[],n=0,s=e.length;n]/g.exec(t)){var e=document.createElement("tbody");return e.innerHTML=t,e.firstElementChild}if(-1!==t.indexOf("<")){var r=document.createElement("div");return r.innerHTML=t,r.firstElementChild}}},a=function(e,r,n){var s=void 0,i=function(e){for(var r=0,n=t.valueNames.length;r=1;)t.list.removeChild(t.list.firstChild)},function(){var r;if("function"!=typeof t.item){if(!(r="string"==typeof t.item?-1===t.item.indexOf("<")?document.getElementById(t.item):i(t.item):s()))throw new Error("The list needs to have at least one item on init otherwise you'll have to add a template.");r=n(r,t.valueNames),e=function(){return r.cloneNode(!0)}}else e=function(e){var r=t.item(e);return i(r)}}()};t.exports=function(t){return new e(t)}},"./src/utils/classes.js":function(t,e,r){var n=r("./src/utils/index-of.js"),s=/\s+/;Object.prototype.toString;function i(t){if(!t||!t.nodeType)throw new Error("A DOM element reference is required");this.el=t,this.list=t.classList}t.exports=function(t){return new i(t)},i.prototype.add=function(t){if(this.list)return this.list.add(t),this;var e=this.array();return~n(e,t)||e.push(t),this.el.className=e.join(" "),this},i.prototype.remove=function(t){if(this.list)return this.list.remove(t),this;var e=this.array(),r=n(e,t);return~r&&e.splice(r,1),this.el.className=e.join(" "),this},i.prototype.toggle=function(t,e){return this.list?(void 0!==e?e!==this.list.toggle(t,e)&&this.list.toggle(t):this.list.toggle(t),this):(void 0!==e?e?this.add(t):this.remove(t):this.has(t)?this.remove(t):this.add(t),this)},i.prototype.array=function(){var t=(this.el.getAttribute("class")||"").replace(/^\s+|\s+$/g,"").split(s);return""===t[0]&&t.shift(),t},i.prototype.has=i.prototype.contains=function(t){return this.list?this.list.contains(t):!!~n(this.array(),t)}},"./src/utils/events.js":function(t,e,r){var n=window.addEventListener?"addEventListener":"attachEvent",s=window.removeEventListener?"removeEventListener":"detachEvent",i="addEventListener"!==n?"on":"",a=r("./src/utils/to-array.js");e.bind=function(t,e,r,s){for(var o=0,l=(t=a(t)).length;o32)return!1;var a=n,o=function(){var t,r={};for(t=0;t=p;b--){var j=o[t.charAt(b-1)];if(C[b]=0===m?(C[b+1]<<1|1)&j:(C[b+1]<<1|1)&j|(v[b+1]|v[b])<<1|1|v[b+1],C[b]&d){var x=l(m,b-1);if(x<=u){if(u=x,!((c=b-1)>a))break;p=Math.max(1,2*a-c)}}}if(l(m+1,a)>u)break;v=C}return!(c<0)}},"./src/utils/get-attribute.js":function(t){t.exports=function(t,e){var r=t.getAttribute&&t.getAttribute(e)||null;if(!r)for(var n=t.attributes,s=n.length,i=0;i=48&&t<=57}function i(t,e){for(var i=(t+="").length,a=(e+="").length,o=0,l=0;o=i&&l=a?-1:l>=a&&o=i?1:i-a}i.caseInsensitive=i.i=function(t,e){return i((""+t).toLowerCase(),(""+e).toLowerCase())},Object.defineProperties(i,{alphabet:{get:function(){return e},set:function(t){r=[];var s=0;if(e=t)for(;s + + + Blog del perro + + + + + + + + + + + +
    + Logotipo de perro tuerto +
    + + #LINKS# +
    +

    perro tuerto

    +

    Del Pacífico para el mundo: edición, software y culturas libres.

    +

    🤖 JSON

    +
    + + +