{"componentChunkName":"component---src-templates-single-template-tsx","path":"/fazendo-sistema-de-busca-no-jekyll-com-angularjs","result":{"data":{"site":{"siteMetadata":{"siteUrl":"https://blog.nandomoreira.dev","author":{"name":"Fernando Moreira","site":"https://nandomoreira.dev","social":{"disqus":"fernandomoreira"}}}},"markdownRemark":{"html":"<p>Por alguns meses eu usei o plugin <a href=\"https://github.com/christian-fei/Simple-Jekyll-Search\">Simple Jekyll Search</a> que funcionou muito bem no meu blog, mas agora ele foi totalmente feito em angular e ficou uma maravilha.</p>\n<p>Hoje vou mostrar aqui como foi eu criei essa façanha, é bem simples e sem segredo nenhum, vem comigo.</p>\n<h2>Primeiro obstáculo: Liquid x Angular</h2>\n<p>Você deve ter notado que o Jekyll, assim como o Angular, usa 2 chaves em sua sintaxe, causando assim um conflito na hora de compilar o jekyll.</p>\n<p>É bem simples resolver esse pequeno probleminha, o próprio Angular tem a solução, o <a href=\"https://docs.angularjs.org/api/ng/provider/$interpolateProvider\">$interpolateProvider</a> é usado para configurar a interpolação da linguagem.</p>\n<p>Com ele vamos setar no <code class=\"language-text\">config</code> para o angular reconhecer apenas <code class=\"language-text\">{( var )}</code>, mais ou menos assim:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-javascript line-numbers\"><code class=\"language-javascript\"><span class=\"token keyword\">var</span> app <span class=\"token operator\">=</span> angular<span class=\"token punctuation\">.</span><span class=\"token function\">module</span><span class=\"token punctuation\">(</span><span class=\"token string\">'searchApp'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\napp<span class=\"token punctuation\">.</span><span class=\"token function\">config</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span>\n  <span class=\"token string\">'$interpolateProvider'</span><span class=\"token punctuation\">,</span>\n  <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">$interpolateProvider</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> $interpolateProvider<span class=\"token punctuation\">.</span><span class=\"token function\">startSymbol</span><span class=\"token punctuation\">(</span><span class=\"token string\">'{('</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">endSymbol</span><span class=\"token punctuation\">(</span><span class=\"token string\">')}'</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<h2>O arquivo json</h2>\n<p>Precisamos pegar todos os artigos do blog para alimentar nosso Javascript, criaremos um template para o Jekyll montando um <code class=\"language-text\">.json</code>.</p>\n<h4>search.json</h4>\n<div class=\"gatsby-highlight\" data-language=\"liquid\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-liquid line-numbers\"><code class=\"language-liquid\"><span class=\"token operator\">--</span><span class=\"token operator\">-</span>layout<span class=\"token operator\">:</span> null\n<span class=\"token operator\">--</span><span class=\"token operator\">-</span>[\n  {<span class=\"token operator\">%</span> <span class=\"token keyword\">for</span> post <span class=\"token keyword\">in</span> site.posts <span class=\"token operator\">%</span>}\n    {\n      \"title\" <span class=\"token operator\">:</span> \"{{ post.title <span class=\"token operator\">|</span> <span class=\"token function\">escape</span> }}\",\n      \"category\" <span class=\"token operator\">:</span> \"{{ post.categories <span class=\"token operator\">|</span> array_to_sentence_string }}\",\n      \"tags\" <span class=\"token operator\">:</span> \"{{ post.tags <span class=\"token operator\">|</span> array_to_sentence_string }}\",\n      \"url\" <span class=\"token operator\">:</span> \"{{ site.baseurl }}{{ post.url }}\",\n      \"date\" <span class=\"token operator\">:</span> \"{{ post.date <span class=\"token operator\">|</span> <span class=\"token function\">date</span><span class=\"token operator\">:</span> \"<span class=\"token operator\">%</span><span class=\"token operator\">-</span>d<span class=\"token operator\">/</span><span class=\"token operator\">%</span><span class=\"token operator\">-</span>m<span class=\"token operator\">/</span><span class=\"token operator\">%</span>Y\" }}\"\n    }{<span class=\"token operator\">%</span> <span class=\"token keyword\">unless</span> forloop.last <span class=\"token operator\">%</span>},{<span class=\"token operator\">%</span> <span class=\"token keyword\">endunless</span> <span class=\"token operator\">%</span>}\n  {<span class=\"token operator\">%</span> <span class=\"token keyword\">endfor</span> <span class=\"token operator\">%</span>}\n]</code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>O código acima irá montar uma estrutura mais ou menos assim.</p>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-json line-numbers\"><code class=\"language-json\"><span class=\"token punctuation\">[</span>\n  <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">\"title\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Fazendo um sistema de busca simples no Jekyll usando AngularJS\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"category\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"jekyll\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"tags\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"jekyll, angular, and angularjs\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"url\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"/busca-no-jekyll-com-angularjs\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"date\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"27/12/2015\"</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">\"title\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"dotX - mais um tema para Jekyll\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"category\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"temas-jekyll\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"tags\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"temas, jekyll, and download\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"url\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"/dotX-mais-um-tema-para-jekyll\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"date\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"21/12/2015\"</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">]</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>Se você quiser dar uma olhada no arquivo final pode entrar [nesse link aqui]({{ \"/search.json\" | prepend: site.baseurl }}).</p>\n<h2>searchController</h2>\n<p>Logo acima, no primeiro código angular, nós iniciamos o módulo <code class=\"language-text\">searchApp</code> e setamos o <code class=\"language-text\">config</code> para corrigir a interpolação da linguagem, agora vamos terminar nosso script criando o controller.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-javascript line-numbers\"><code class=\"language-javascript\"><span class=\"token comment\">// criando o ng-controller=\"searchController\"</span>\napp<span class=\"token punctuation\">.</span><span class=\"token function\">controller</span><span class=\"token punctuation\">(</span><span class=\"token string\">'searchController'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span>\n  <span class=\"token string\">'$scope'</span><span class=\"token punctuation\">,</span>\n  <span class=\"token string\">'$http'</span><span class=\"token punctuation\">,</span>\n  <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">$scope<span class=\"token punctuation\">,</span> $http</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// criando a funcao \"pesquiser(q)\" que logo será usada em ng-keyup=\"pesquisar(search)\"</span>\n    $scope<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">pesquisar</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">q</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      $scope<span class=\"token punctuation\">.</span>posts <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n      <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>q <span class=\"token operator\">!=</span> <span class=\"token string\">''</span> <span class=\"token operator\">&amp;&amp;</span> q <span class=\"token operator\">!=</span> <span class=\"token keyword\">undefined</span> <span class=\"token operator\">&amp;&amp;</span> q<span class=\"token punctuation\">.</span>length <span class=\"token operator\">>=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token comment\">// no $http.get() que toda a mágica acontece...</span>\n        $http\n          <span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token string\">'/search.json'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> data<span class=\"token operator\">:</span> q <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n          <span class=\"token punctuation\">.</span><span class=\"token function\">success</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">data</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token comment\">// atribuindo os objetos em uma variável \"posts\"</span>\n            $scope<span class=\"token punctuation\">.</span>posts <span class=\"token operator\">=</span> data\n          <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n          <span class=\"token punctuation\">.</span><span class=\"token function\">error</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">data</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            console<span class=\"token punctuation\">.</span><span class=\"token function\">error</span><span class=\"token punctuation\">(</span><span class=\"token string\">'error...'</span><span class=\"token punctuation\">)</span>\n          <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<h2>O HTML</h2>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-html line-numbers\"><code class=\"language-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">ng-app</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>searchApp<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">ng-controller</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>searchController<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>input</span>\n      <span class=\"token attr-name\">type</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>text<span class=\"token punctuation\">\"</span></span>\n      <span class=\"token attr-name\">ng-model</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>search<span class=\"token punctuation\">\"</span></span>\n      <span class=\"token attr-name\">ng-keyup</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>pesquisar(search)<span class=\"token punctuation\">\"</span></span>\n      <span class=\"token attr-name\">placeholder</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>Digite: sass, javascript, ruby, gulp, php...<span class=\"token punctuation\">\"</span></span>\n      <span class=\"token attr-name\">autofocus</span>\n      <span class=\"token attr-name\">autocomplete</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>off<span class=\"token punctuation\">\"</span></span>\n    <span class=\"token punctuation\">/></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>hr</span> <span class=\"token punctuation\">/></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>ul</span> <span class=\"token attr-name\">ng-show</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>posts.length > 0<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>li</span> <span class=\"token attr-name\">ng-repeat</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>post in posts | filter:search<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>a</span> <span class=\"token attr-name\">href</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>{( post.url )}<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n          <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>span</span><span class=\"token punctuation\">></span></span>{( post.title )}<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>span</span><span class=\"token punctuation\">></span></span> <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>small</span><span class=\"token punctuation\">></span></span>{( post.category )}<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>small</span><span class=\"token punctuation\">></span></span>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>a</span><span class=\"token punctuation\">></span></span>\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>li</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>ul</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>Bem, esse HTML ai em cima dispeça explicações né, se você sabe pelo menos o básico de AngularJS você já vai \"matar todas as charadas\" dele, mas vou dar uma explicação rápida.</p>\n<ul>\n<li><strong><code class=\"language-text\">ng-app=&quot;searchApp&quot;</code></strong>: iniciamos o app do Angular;</li>\n<li><strong><code class=\"language-text\">ng-controller=&quot;searchController&quot;</code></strong>: iniciamos o controller searchController;</li>\n<li><strong><code class=\"language-text\">ng-model=&quot;search&quot;</code></strong>: iniciamos o model search;</li>\n<li><strong><code class=\"language-text\">ng-keyup=&quot;pesquisar(search)&quot;</code></strong>: a funcao pesquisar() recebe como parâmetro o model search;</li>\n<li><strong><code class=\"language-text\">ng-show=&quot;posts.length &gt; 0&quot;</code></strong>: a <code class=\"language-text\">ul</code> só vai existir se a variável <code class=\"language-text\">posts</code> existir;</li>\n<li><strong><code class=\"language-text\">ng-repeat=&quot;post in posts | filter:search&quot;</code></strong>: caso haja objetos na variável <code class=\"language-text\">posts</code> criamos a lista com <code class=\"language-text\">ng-repeat</code>;</li>\n</ul>\n<h2>O filtro</h2>\n<p>Você deve ter notado que o nosso <code class=\"language-text\">searchController</code> e nossa função <code class=\"language-text\">pesquisar</code> retorna todos os objetos do arquivo <code class=\"language-text\">search.json</code> por isso passamos um filtro mágico do AngularJS chamado <code class=\"language-text\">filter:</code> que recebe o model <code class=\"language-text\">search</code> (que é basicamente as letras digitadas no input).</p>\n<p><a href=\"https://nando-experiments.github.io/busca-no-jekyll-com-angularjs/\">Demonstração</a> <a href=\"https://github.com/nando-experiments/busca-no-jekyll-com-angularjs\">Download</a></p>\n<p>Com isso fechamos nosso sisteminha de busca simples no Jekyll usando AngularJS ;)</p>\n<p>Gostou, comenta ai \\o/</p>\n<p>\\end</p>","excerpt":"Por alguns meses eu usei o plugin Simple Jekyll Search que funcionou muito bem no meu blog, mas agora ele foi totalmente feito em angular e ficou uma…","timeToRead":3,"frontmatter":{"category":["jekyll"],"date":"há 11 anos","datePublished":"2015-12-27T22:28:33.000Z","description":"Por alguns meses eu usei o plugin Simple Jekyll Search que funcionou muito bem no meu blog","path":"/fazendo-sistema-de-busca-no-jekyll-com-angularjs","tags":["jekyll","angular","angularjs"],"title":"Fazendo um sistema de busca simples no Jekyll usando AngularJS","image":{"publicURL":"/static/angularjs-ac143796d23ba9bf2a8fb95d6d3783b5.png","name":"angularjs"}},"fields":{"readingTime":{"words":618}}}},"pageContext":{}}}