Ir al contenido principal

Ralsina.Me — El sitio web de Roberto Alsina

Standalone Search in Nikola

This has been in the mas­ter bran­ch of Niko­la for a whi­le but on­ly now ha­ve I tried to fu­lly in­te­gra­te it, and po­lish all (mos­t) of the rou­gh edges.

By de­faul­t, Niko­la co­mes wi­th su­pport for sear­ch for­ms using Google and Du­ck­du­ck­go. So­me peo­ple di­sappro­ve of them for di­ffe­rent rea­sons [1] so the­re was a re­quest about su­ppor­ting a stan­da­lo­ne sear­ch en­gi­ne.

The best of breed of tho­se things see­ms to be Ti­pue so tha­t's what I su­pporte­d.

To use this, you need to ena­ble a plu­gi­n, and do so­me con­fi­gu­ra­tion chan­ges.

The plugin is called task_localsearch and you can find it in the Nikola source tree

Suppose your site is in a folder called mysite then to enable this plugin you need to create mysite/plugins and then copy task_localsearch.plugin and task_localsearch in there.

Then, in your site's conf.py find these options and change them accordingly:

SEARCH_FORM = """
<span class="navbar-form pull-left">
<input type="text" id="tipue_search_input">
</span>"""

ANALYTICS = """
<script type="text/javascript" src="/assets/js/tipuesearch_set.js"></script>
<script type="text/javascript" src="/assets/js/tipuesearch.js"></script>
<script type="text/javascript">
$(document).ready(function() {
    $('#tipue_search_input').tipuesearch({
        'mode': 'json',
        'contentLocation': '/assets/js/tipuesearch_content.json',
        'showUrl': false
    });
});
</script>
"""

EXTRA_HEAD_DATA = """
<link rel="stylesheet" type="text/css" href="/assets/css/tipuesearch.css">
<div id="tipue_search_content" style="margin-left: auto; margin-right: auto; padding: 20px;"></div>
"""

How does it wo­rk? He­re's a de­mo si­te for you to tr­y!

I would not re­co­m­mend doing this for a big si­te, sin­ce it may load a mul­ti-­me­ga­b­y­te ja­vas­cript fi­le when you sear­ch, but for sma­ll to me­dium si­tes, it may be ok.

Frases desafortunadas de gente famosa

Co­mo es­ta:

Cuan­do la pa­tria es­tá en pe­li­gro, to­do es­tá per­mi­ti­do, ex­cep­to no de­fen­der­la.

—Jo­sé de San Mar­tín

Esa fra­se es ma­la, ma­la, ma­la, des­afor­tu­na­da y ho­rri­ble.

Es así de ma­la por­que si bien es un lin­do slo­gan pa­ra con­ven­cer a gran­je­ros de que se unan al ejérci­to de esa pa­tria que es­tá co­men­zan­do a exis­ti­r, es un con­se­jo ho­rren­do pa­ra gen­te que vi­ve en una na­ción de ver­da­d, con le­yes de ver­da­d, un ejérci­to, y gen­te que le da pe­lo­ta a cual­quier pa­va­da que San Mar­tín di­jo.

Em­pie­za con la pre­mi­sa dé­bil de "cuan­do la pa­tria es­tá en pe­li­gro" que es de­ma­sia­do po­co o de­ma­sia­do, de­pen­de de cuan­ta ex­cu­sa ne­ce­si­tes pa­ra ha­cer al­go ho­rri­ble.

Si real­men­te que­rés ser mal ti­po, se­gu­ro que te po­dés con­ven­cer que los ga­ys, in­mi­gran­tes, ex­tran­je­ro­s, mu­sul­ma­nes, ju­díos o jó­ve­nes son to­dos un pe­li­gro pa­ra tu pa­tria de al­gu­na ma­ne­ra. Ca­paz que te­nés que es­ti­rar un po­co lo de "pe­li­gro" o agran­dar un po­co el sig­ni­fi­ca­do de "pa­tria" pe­ro le vas a en­con­trar la vuel­ta.

Y una vez que za­fas­te de eso, cuan­do es­tás con­ven­ci­do de que tu "pa­tria" es­tá "en pe­li­gro­", bue­no, po­dés ha­cer cual­quier co­sa. No es sor­pren­den­te que es­ta fra­se es una vie­ja fa­vo­ri­ta de mi­li­ta­res en sus dis­cur­so­s.

Me cae bas­tan­te bien Jo­sé de San Mar­tí­n. Es­ta fra­se, sin em­bar­go, es des­afor­tu­na­da.

Te hago la tarea, pero con estilo

Pa­sa siem­pre, co­mo en to­das las lis­tas de pro­gra­ma­ció­n, que de vez en cuan­do al­guien pos­tea en la lis­ta de Py­thon Ar­gen­ti­na al­go que es ob­via­men­te su ta­rea pa­ra el ho­ga­r. Pa­ra ma­ne­jar­lo hay dos es­cue­las de pen­sa­mien­to:

  1. Mo­s­­tra­r­­le co­­­mo se ha­­ce es de­­ci­r­­le co­­­mo ha­­cer tra­m­­pa.

  2. Mo­s­­tra­r­­le co­­­mo se ha­­ce es en­se­­ña­r­­le.

Yo me in­clino más por 1) pe­ro creo ha­ber en­contra­do un ca­mino in­ter­me­dio:

1.5) Dar­le una so­lu­ción más com­pli­ca­da que el pro­ble­ma.

De esa ma­ne­ra, si en­tien­de la so­lu­ció­n, ya hi­zo el tra­ba­jo. Y si no la en­tien­de, va a ser tan ob­vio que no la en­tien­de, que el pro­fe­sor nun­ca le va a acep­tar la res­pues­ta.

Co­mo ejem­plo, es­te es el pro­ble­ma que pre­sen­ta­ron en PyA­r:

La lis­ta vie­ne de­sor­de­na­da y con dos ca­rac­te­res (uno en mi­nús­cu­la y otro en ma­yús­cu­la), por ejem­plo:

['eD', 'fC', 'hC', 'iC', 'jD', 'bD', 'fH', 'mS', 'aS', 'mD']

Pa­ra or­de­nar­la de­bo se­guir es­tas pau­ta­s:

  1. Ar­mar su­b­con­jun­tos de acuer­do a la ma­yús­cu­la y lue­go or­de­nar esos su­b­con­jun­tos por la canti­dad de miem­bros (en or­den as­cen­den­te), la lis­ta que­da de la si­guien­te for­ma:

    ['fH', 'mS', 'aS', 'fC', 'hC', 'iC', 'jD', 'bD', 'eD', 'mD']
  2. Aho­ra ca­da su­b­con­jun­to de­be es­tar or­de­na­do de ma­ne­ra as­cen­den­te y de acuer­do a la mi­nús­cu­la, con lo que la lis­ta que­da or­de­na­da así:

    ['fH', 'aS', 'mS', 'fC', 'hC', 'iC', 'bD', 'eD', 'jD', 'mD']

Ig­no­ran­do que el plan­teo es am­bi­guo (hay por lo me­nos dos ma­ne­ras de leer­lo, ca­paz que má­s), yo pro­pu­se es­ta so­lu­ció­n, que re­quie­re py­thon 3:

from collections import defaultdict
d1 = defaultdict(list)
[d1[i[1]].append(i) for i in  ['eD', 'fC', 'hC', 'iC', 'jD', 'bD', 'fH', 'mS', 'aS', 'mD']]
{i: d1[i].sort() for i in d1}
d2 = {len(d1[i]): d1[i] for i in d1}
print([item for sublist in [d2[i] for i in sorted(d2.keys())] for item in sublist])

Produce el resultado deseado: ['fH', 'aS', 'mS', 'fC', 'hC', 'iC', 'bD', 'eD', 'jD', 'mD'] pero de una manera que para entenderlo, el alumno necesita saber mas de lo que requiere el problema original, incluyendo tres o cuatro cosas que no creo que le hayan enseñado.


Contents © 2000-2023 Roberto Alsina