[{"data":1,"prerenderedAt":672},["ShallowReactive",2],{"page:\u002Fru\u002Fposts\u002Fcode_n_shit\u002Fshortener":3,"translations:\u002Fru\u002Fposts\u002Fcode_n_shit\u002Fshortener":671},{"id":4,"title":5,"author":6,"body":7,"date":657,"description":658,"draft":659,"extension":660,"image":661,"listed":623,"meta":662,"navigation":623,"path":663,"seo":664,"stem":665,"tags":666,"theme":669,"toc":623,"__hash__":670},"content_ru\u002Fru\u002Fposts\u002Fcode_n_shit\u002Fshortener.md","Ук(о)ротитель ссылок под hugo","slnt_opp",{"type":8,"value":9,"toc":646},"minimark",[10,15,35,39,62,65,281,285,305,309,313,316,362,366,369,384,390,394,397,435,438,497,500,558,561,599,602,639,642],[11,12,14],"h2",{"id":13},"в-чем-проблема","В чем проблема",[16,17,18,19,26,27,30,31,34],"p",{},"Как известно ссылки часто бывают слишком длинными, например меня на идею автоматизировать линкшортингх\n(врядли есть такое слово, но теперь - да) пока я смотрел стрим одно известного ",[20,21,25],"a",{"href":22,"rel":23},"https:\u002F\u002Fwww.youtube.com\u002Fchannel\u002FUCJLorkdDK41pOQyoVQbFqJQ",[24],"nofollow","вертолета"," будучи модером в чате, и было зареквестировано скинуть ссылку на другой канал в чат, однако ютуб тупо обрезает ссылки в чате, почему сслыка вида ",[28,29,22],"code",{}," была бы отправлена примерно как ",[28,32,33],{},"https:\u002F\u002Fwww.youtube.com\u002Fchannel\u002FUCJLor..."," и была бы бесполезна. Тогда(пару часов назад) я просто сгенерил пост со ссылкой внутри, но сейчас хотелось бы более автоматизированное решение.",[11,36,38],{"id":37},"_1-создаем-шаблонархетип-hugo","1. Создаем шаблон(архетип) hugo",[16,40,41,42,45,46,49,50,53,54,57,58,61],{},"В hugo встроены такие штуки как архитипы(",[28,43,44],{},"archetypes","), которые используются как шаблон при создании нового контента с помощью ",[28,47,48],{},"hugo new",", например ",[28,51,52],{},"hugo new posts\u002Fpost_name.md"," заюзает ",[28,55,56],{},"archetypes\u002Fposts.md"," если он есть, или ",[28,59,60],{},"default.md"," если его нет.",[16,63,64],{},"Я создал такой архетип:",[66,67,72],"pre",{"className":68,"code":69,"language":70,"meta":71,"style":71},"language-html shiki shiki-themes monokai","\u003Chtml>\n    \u003Chead>\n        \u003Ctitle>Redirect\u003C\u002Ftitle>\n        \u003Cmeta http-equiv = \"refresh\" content = \"2; url = {% url %}\" \u002F>\n    \u003C\u002Fhead>\n    \u003Cbody>\n        \u003Ch1>Thanks for trusting slnt-opp shortener!\u003C\u002Fh1>\n        \u003Ch2>Redirecting to \u003C\u002Fh2>\n        \u003Ch3> * точка . dot \u003Ch3>\n        \u003Ch5> это типа спиннер(не тот кторый для аутистов, а который показывает загрузку) \u003C\u002Fh5>\n    \u003C\u002Fbody>\n    \u003Cscript>\n        console.log(\"всякая гугол онолитека\")\n    \u003C\u002Fscript>\n\u003C\u002Fhtml>\n","html","",[28,73,74,89,100,116,146,156,166,181,195,210,225,234,244,262,271],{"__ignoreMap":71},[75,76,79,83,86],"span",{"class":77,"line":78},"line",1,[75,80,82],{"class":81},"sCdxs","\u003C",[75,84,70],{"class":85},"s8I7P",[75,87,88],{"class":81},">\n",[75,90,92,95,98],{"class":77,"line":91},2,[75,93,94],{"class":81},"    \u003C",[75,96,97],{"class":85},"head",[75,99,88],{"class":81},[75,101,103,106,109,112,114],{"class":77,"line":102},3,[75,104,105],{"class":81},"        \u003C",[75,107,108],{"class":85},"title",[75,110,111],{"class":81},">Redirect\u003C\u002F",[75,113,108],{"class":85},[75,115,88],{"class":81},[75,117,119,121,124,128,131,135,138,140,143],{"class":77,"line":118},4,[75,120,105],{"class":81},[75,122,123],{"class":85},"meta",[75,125,127],{"class":126},"sHkqI"," http-equiv",[75,129,130],{"class":81}," = ",[75,132,134],{"class":133},"s_Ekj","\"refresh\"",[75,136,137],{"class":126}," content",[75,139,130],{"class":81},[75,141,142],{"class":133},"\"2; url = {% url %}\"",[75,144,145],{"class":81}," \u002F>\n",[75,147,149,152,154],{"class":77,"line":148},5,[75,150,151],{"class":81},"    \u003C\u002F",[75,153,97],{"class":85},[75,155,88],{"class":81},[75,157,159,161,164],{"class":77,"line":158},6,[75,160,94],{"class":81},[75,162,163],{"class":85},"body",[75,165,88],{"class":81},[75,167,169,171,174,177,179],{"class":77,"line":168},7,[75,170,105],{"class":81},[75,172,173],{"class":85},"h1",[75,175,176],{"class":81},">Thanks for trusting slnt-opp shortener!\u003C\u002F",[75,178,173],{"class":85},[75,180,88],{"class":81},[75,182,184,186,188,191,193],{"class":77,"line":183},8,[75,185,105],{"class":81},[75,187,11],{"class":85},[75,189,190],{"class":81},">Redirecting to \u003C\u002F",[75,192,11],{"class":85},[75,194,88],{"class":81},[75,196,198,200,203,206,208],{"class":77,"line":197},9,[75,199,105],{"class":81},[75,201,202],{"class":85},"h3",[75,204,205],{"class":81},"> * точка . dot \u003C",[75,207,202],{"class":85},[75,209,88],{"class":81},[75,211,213,215,218,221,223],{"class":77,"line":212},10,[75,214,105],{"class":81},[75,216,217],{"class":85},"h5",[75,219,220],{"class":81},"> это типа спиннер(не тот кторый для аутистов, а который показывает загрузку) \u003C\u002F",[75,222,217],{"class":85},[75,224,88],{"class":81},[75,226,228,230,232],{"class":77,"line":227},11,[75,229,151],{"class":81},[75,231,163],{"class":85},[75,233,88],{"class":81},[75,235,237,239,242],{"class":77,"line":236},12,[75,238,94],{"class":81},[75,240,241],{"class":85},"script",[75,243,88],{"class":81},[75,245,247,250,253,256,259],{"class":77,"line":246},13,[75,248,249],{"class":81},"        console.",[75,251,252],{"class":126},"log",[75,254,255],{"class":81},"(",[75,257,258],{"class":133},"\"всякая гугол онолитека\"",[75,260,261],{"class":81},")\n",[75,263,265,267,269],{"class":77,"line":264},14,[75,266,151],{"class":81},[75,268,241],{"class":85},[75,270,88],{"class":81},[75,272,274,277,279],{"class":77,"line":273},15,[75,275,276],{"class":81},"\u003C\u002F",[75,278,70],{"class":85},[75,280,88],{"class":81},[202,282,284],{"id":283},"из-чего-же-он-состоит","Из чего же он состоит",[286,287,288,296,299,302],"ul",{},[289,290,291,292,295],"li",{},"Самое главное: редирект на ",[28,293,294],{},"url"," урл прописан как рельсовый шаблон, но не обманывайтесь, здесь ничего это не будет, ибо зачем. Редиректит через 2 секунды после загрузки страницы",[289,297,298],{},"Какое-то вранье",[289,300,301],{},"Куда редиректит",[289,303,304],{},"там написано",[11,306,308],{"id":307},"_2-пишем-скрит-обработчик","2. Пишем скрит обработчик",[202,310,312],{"id":311},"_21-что-делает-сокращатели-уникальными","2.1 Что делает сокращатели уникальными?",[16,314,315],{},"ID конечно, благо все уже придумано, поэтому я генерирую названия для ссылки из данного пользователем(мной) названия и uuid",[66,317,321],{"className":318,"code":319,"language":320,"meta":71,"style":71},"language-ruby shiki shiki-themes monokai","require \"securerandom\"\nuuid = SecureRandom.hex(3)\n=> eb0cd2\n","ruby",[28,322,323,331,357],{"__ignoreMap":71},[75,324,325,328],{"class":77,"line":78},[75,326,327],{"class":85},"require",[75,329,330],{"class":133}," \"securerandom\"\n",[75,332,333,336,339,343,346,349,351,355],{"class":77,"line":91},[75,334,335],{"class":81},"uuid ",[75,337,338],{"class":85},"=",[75,340,342],{"class":341},"sOx1s"," SecureRandom",[75,344,345],{"class":81},".",[75,347,348],{"class":126},"hex",[75,350,255],{"class":81},[75,352,354],{"class":353},"s7s5_","3",[75,356,261],{"class":81},[75,358,359],{"class":77,"line":102},[75,360,361],{"class":81},"=> eb0cd2\n",[202,363,365],{"id":364},"_22-какие-еще-данные","2.2 Какие еще данные?",[16,367,368],{},"Имя для ссылки и урл берем из аргументов:",[66,370,372],{"className":318,"code":371,"language":320,"meta":71,"style":71},"name, url = ARGV\n",[28,373,374],{"__ignoreMap":71},[75,375,376,379,381],{"class":77,"line":78},[75,377,378],{"class":81},"name, url ",[75,380,338],{"class":85},[75,382,383],{"class":81}," ARGV\n",[16,385,386,387],{},"То есть вызовываться это будет ",[28,388,389],{},".\u002Fshortcut heli https:\u002F\u002Fwww.youtube.com\u002Fchannel\u002FUCJLorkdDK41pOQyoVQbFqJQ",[202,391,393],{"id":392},"_23-генерируем-ссылку","2.3 Генерируем ссылку",[16,395,396],{},"В первую очередь создаем страницу из архитипа с названием созданным из имени и uuid:",[66,398,400],{"className":318,"code":399,"language":320,"meta":71,"style":71},"filename = name + uuid\n`hugo new s\u002F#{filename}.html`\n",[28,401,402,418],{"__ignoreMap":71},[75,403,404,407,409,412,415],{"class":77,"line":78},[75,405,406],{"class":81},"filename ",[75,408,338],{"class":85},[75,410,411],{"class":81}," name ",[75,413,414],{"class":85},"+",[75,416,417],{"class":81}," uuid\n",[75,419,420,423,426,429,432],{"class":77,"line":91},[75,421,422],{"class":133},"`hugo new s\u002F",[75,424,425],{"class":85},"#{",[75,427,428],{"class":81},"filename",[75,430,431],{"class":85},"}",[75,433,434],{"class":133},".html`\n",[16,436,437],{},"Вписываем данные:",[66,439,441],{"className":318,"code":440,"language":320,"meta":71,"style":71},"template = File.read(\"content\u002Fs\u002F#{filename}.html\").gsub('{% name %}', name).gsub('{% url %}', url)\n",[28,442,443],{"__ignoreMap":71},[75,444,445,448,450,453,455,458,460,463,465,467,469,472,475,479,481,484,487,489,491,494],{"class":77,"line":78},[75,446,447],{"class":81},"template ",[75,449,338],{"class":85},[75,451,452],{"class":341}," File",[75,454,345],{"class":81},[75,456,457],{"class":126},"read",[75,459,255],{"class":81},[75,461,462],{"class":133},"\"content\u002Fs\u002F",[75,464,425],{"class":85},[75,466,428],{"class":81},[75,468,431],{"class":85},[75,470,471],{"class":133},".html\"",[75,473,474],{"class":81},").",[75,476,478],{"class":477},"sYf5A","gsub",[75,480,255],{"class":81},[75,482,483],{"class":133},"'{% name %}'",[75,485,486],{"class":81},", name).",[75,488,478],{"class":477},[75,490,255],{"class":81},[75,492,493],{"class":133},"'{% url %}'",[75,495,496],{"class":81},", url)\n",[16,498,499],{},"И записываем файл назад:",[66,501,503],{"className":318,"code":502,"language":320,"meta":71,"style":71},"File.open(\"content\u002Fs\u002F#{filename}.html\", 'w') do |f|\n    f.write template\nend\n",[28,504,505,542,553],{"__ignoreMap":71},[75,506,507,510,512,515,517,519,521,523,525,527,530,533,536,539],{"class":77,"line":78},[75,508,509],{"class":341},"File",[75,511,345],{"class":81},[75,513,514],{"class":477},"open",[75,516,255],{"class":81},[75,518,462],{"class":133},[75,520,425],{"class":85},[75,522,428],{"class":81},[75,524,431],{"class":85},[75,526,471],{"class":133},[75,528,529],{"class":81},", ",[75,531,532],{"class":133},"'w'",[75,534,535],{"class":81},") ",[75,537,538],{"class":85},"do",[75,540,541],{"class":81}," |f|\n",[75,543,544,547,550],{"class":77,"line":91},[75,545,546],{"class":81},"    f.",[75,548,549],{"class":126},"write",[75,551,552],{"class":81}," template\n",[75,554,555],{"class":77,"line":102},[75,556,557],{"class":85},"end\n",[16,559,560],{},"Дальше уже дело ваше, но лично я запускаю мой скрипт deploy, который заливает новую версию сайта на сервер, а после красивенько вывожу ссылку:",[66,562,564],{"className":318,"code":563,"language":320,"meta":71,"style":71},"puts \"New link generated:\"\nputs \"\\n\\thttps:\u002F\u002Fslnt-opp.xyz\u002Fs\u002F#{filename}\\t\\n\\n\"\n",[28,565,566,574],{"__ignoreMap":71},[75,567,568,571],{"class":77,"line":78},[75,569,570],{"class":477},"puts",[75,572,573],{"class":133}," \"New link generated:\"\n",[75,575,576,578,581,584,587,589,591,593,596],{"class":77,"line":91},[75,577,570],{"class":477},[75,579,580],{"class":133}," \"",[75,582,583],{"class":353},"\\n\\t",[75,585,586],{"class":133},"https:\u002F\u002Fslnt-opp.xyz\u002Fs\u002F",[75,588,425],{"class":85},[75,590,428],{"class":81},[75,592,431],{"class":85},[75,594,595],{"class":353},"\\t\\n\\n",[75,597,598],{"class":133},"\"\n",[16,600,601],{},"По итогу весь процесс занимает пару секунд и выглядит так от начала до конца:",[66,603,607],{"className":604,"code":605,"language":606,"meta":71,"style":71},"language-sh shiki shiki-themes monokai","slnt_opp@slnt-opp-mbp slnt-opp.xyz % .\u002Fshortcut heli https:\u002F\u002Fwww.youtube.com\u002Fchannel\u002FUCJLorkdDK41pOQyoVQbFqJQ\nNew link generated:\n\n        https:\u002F\u002Fslnt-opp.xyz\u002Fs\u002Fhelib9947b\n\nslnt_opp@slnt-opp-mbp slnt-opp.xyz %\n","sh",[28,608,609,614,619,625,630,634],{"__ignoreMap":71},[75,610,611],{"class":77,"line":78},[75,612,613],{},"slnt_opp@slnt-opp-mbp slnt-opp.xyz % .\u002Fshortcut heli https:\u002F\u002Fwww.youtube.com\u002Fchannel\u002FUCJLorkdDK41pOQyoVQbFqJQ\n",[75,615,616],{"class":77,"line":91},[75,617,618],{},"New link generated:\n",[75,620,621],{"class":77,"line":102},[75,622,624],{"emptyLinePlaceholder":623},true,"\n",[75,626,627],{"class":77,"line":118},[75,628,629],{},"        https:\u002F\u002Fslnt-opp.xyz\u002Fs\u002Fhelib9947b\n",[75,631,632],{"class":77,"line":148},[75,633,624],{"emptyLinePlaceholder":623},[75,635,636],{"class":77,"line":158},[75,637,638],{},"slnt_opp@slnt-opp-mbp slnt-opp.xyz %\n",[16,640,641],{},"Спасибо за внимание, обращайся если нужны короткие ссылки, хех",[643,644,645],"style",{},"html pre.shiki code .sCdxs, html code.shiki .sCdxs{--shiki-default:#F8F8F2}html pre.shiki code .s8I7P, html code.shiki .s8I7P{--shiki-default:#F92672}html pre.shiki code .sHkqI, html code.shiki .sHkqI{--shiki-default:#A6E22E}html pre.shiki code .s_Ekj, html code.shiki .s_Ekj{--shiki-default:#E6DB74}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sOx1s, html code.shiki .sOx1s{--shiki-default:#66D9EF;--shiki-default-font-style:italic}html pre.shiki code .s7s5_, html code.shiki .s7s5_{--shiki-default:#AE81FF}html pre.shiki code .sYf5A, html code.shiki .sYf5A{--shiki-default:#66D9EF}",{"title":71,"searchDepth":91,"depth":91,"links":647},[648,649,652],{"id":13,"depth":91,"text":14},{"id":37,"depth":91,"text":38,"children":650},[651],{"id":283,"depth":102,"text":284},{"id":307,"depth":91,"text":308,"children":653},[654,655,656],{"id":311,"depth":102,"text":312},{"id":364,"depth":102,"text":365},{"id":392,"depth":102,"text":393},"2019-12-22","В чем проблема Как известно ссылки часто бывают слишком длинными, например меня на идею автоматизировать линкшортингх",false,"md","\u002Fimages\u002Fshortener.png",{},"\u002Fru\u002Fposts\u002Fcode_n_shit\u002Fshortener",{"title":5,"description":658},"ru\u002Fposts\u002Fcode_n_shit\u002Fshortener",[667,28,668],"blog","hugo",null,"nyV3WgTHoKraWmVCHN60ZnFeJrrmQtrEksfE_o3d0BE",[],1790369235096]