• R/O
  • SSH
  • HTTPS

zostportal: Commit


Commit MetaInfo

Revision75 (tree)
Time2020-07-12 08:54:58
Authorderekwildstar

Log Message

Zost.bsdesign e assets/_/css/styles.css
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯

Mais estilos personalizados

assets/_/js/scripts.js -> assets/_/js/helpers.js
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯

Alteração do nome do script

assets/_/php/helpers.php
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯

Criada uma função para detectar se um acesso foi realizado por um usuário real ou um bot/crawler
Ajustado o atributo async do script de adição de banners do AdSense
Corrigido o método addFootNotesFragment para que os links gerados contenham o url completo da página, permitindo assim os FootNotes funcionem em artigos divididos em páginas
Aplicado htmlentities na descrição que preenchia o tag meta description
Adicionado o código para inicializar os plugins sociais do facebook
styles.css foi mudando de local no cabeçalho
Concluída a chamada a tela de aviso de idioma e cookies

assets/prism/css/prism.css e assets/prism/js/prism.js
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯

Adicionado o plugin command line

html/com_content/article/default.php
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯

Corrigido o problema que removia os caracteres < e > de visualizações prism
Código dos plugins sociais do facebook adicionados

html/modules.php
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯

Incluída a possibilidade de se usar um sufixo de classe

index.php
¯¯¯¯¯¯¯¯¯

Dentro do div de overlay foi incluído um div para um texto opcional

Change Summary

Incremental Difference

--- trunk/Backup/Leia-me.txt (revision 74)
+++ trunk/Backup/Leia-me.txt (revision 75)
@@ -7,4 +7,5 @@
77 7. Baixe os arquivos de backup do site e do banco de dados (Pós), e execute um teste de integridade
88 7. Execute um commit no repositório do SVN
99 8. Execute o monitor do Mega para que ele sincronize os fontes
10-9. Quando a sincronização do Mega terminar, faça um revert no SVN a fim de verificar se algum arquivo foi substituído pelo Mega incorretmente
\ No newline at end of file
10+9. Quando a sincronização do Mega terminar, faça um revert no SVN a fim de verificar se algum arquivo foi substituído pelo Mega incorretmente
11+10. No Joomla, deixe o site online
\ No newline at end of file
--- trunk/Projetos/Templates/zost_basicblack/assets/_/css/styles.css (revision 74)
+++ trunk/Projetos/Templates/zost_basicblack/assets/_/css/styles.css (revision 75)
@@ -315,18 +315,35 @@
315315 box-shadow: var(--box-shadow);
316316 }
317317
318+/* left = -5px porque o div encontra-se dentro do body, que tem margens = 5px. Width = 100% + 10px porque ao mover o overlay em 5px para a esquerda ainda faltarão 5px+5px do lado direito para completar toda a largura da janela do browser. O mesmo acontece para os atributos top e height */
319+
318320 div.overlay {
319- position: absolute;
321+ position: fixed;
322+ display: none;
323+ width: 100%;
324+ height: 100%;
320325 top: 0;
321326 left: 0;
322- width: 100%;
323- height: 100%;
324- background-color: black;
325- opacity: 0.75;
327+ bottom: 0;
328+ right: 0;
329+ background-color: rgba(0,0,0,0.75);
326330 z-index: 1;
331+ font-family: 'Abel';
332+}
333+
334+div.overlaytext {
327335 display: none;
328336 }
329337
338+div.overlaytext.language {
339+ font-size: 1.5rem;
340+ text-align: center;
341+}
342+
343+div.overlaytext.language button {
344+ font-size: 1.5rem;
345+}
346+
330347 footer {
331348 border: 1px solid var(--line-color);
332349 background-color: var(--tab-background-color);
@@ -369,6 +386,10 @@
369386 color: var(--heading-color-5-6);
370387 }
371388
389+div.article > h2, div.article > h3, div.article > h4, div.article > h5, div.article > h6 {
390+ text-align: center;
391+}
392+
372393 div.links > h2 {
373394 text-align: center;
374395 }
@@ -509,8 +530,13 @@
509530
510531 table {
511532 width: 100%;
533+ margin-bottom: 1rem;
512534 }
513535
536+div.autooverflowx > table {
537+ width: 816px;
538+}
539+
514540 .list-group {
515541 width: 75%;
516542 margin: 0 auto 1rem auto;
@@ -527,6 +553,11 @@
527553 background: var(--toc-item-active);
528554 }
529555
556+div.autooverflowx {
557+ overflow-x: auto;
558+ width: 100%;
559+}
560+
530561 /* ==== Fim: Personalização específica do site (II) ==== */
531562
532563 /* ==== Início: Personalização da janela modal ==== */
@@ -904,6 +935,7 @@
904935 table.article-info td {
905936 border: none;
906937 background-color: inherit;
938+ padding: 0;
907939 }
908940
909941 table.article-info td:first-child {
@@ -1068,10 +1100,6 @@
10681100 float: right;
10691101 }
10701102
1071-div.attachmentsList > table {
1072- margin-bottom: 1rem;
1073-}
1074-
10751103 div.attachmentsList tbody > tr {
10761104 font-size: 0.80rem;
10771105 }
@@ -1096,6 +1124,13 @@
10961124 width: 55px;
10971125 }
10981126
1127+table > caption {
1128+ color: var(--text-color);
1129+ font-size: 0.80rem;
1130+ text-align: justify;
1131+ padding: 0;
1132+}
1133+
10991134 div.attachmentsList > table > caption {
11001135 caption-side: top;
11011136 padding: initial;
@@ -1123,4 +1158,9 @@
11231158 top: -2px;
11241159 }
11251160
1161+pre[class*="language-"] {
1162+ margin-bottom: 1rem;
1163+}
1164+
11261165 /* ==== Fim: Configurações de itens adicionados pelo Joomla ==== */
1166+
--- trunk/Projetos/Templates/zost_basicblack/assets/_/js/scripts.js (revision 74)
+++ trunk/Projetos/Templates/zost_basicblack/assets/_/js/scripts.js (nonexistent)
@@ -1,47 +0,0 @@
1-function setCookie(aName, aValue, aDays) {
2- var d = new Date();
3- d.setTime(d.getTime() + (aDays*24*60*60*1000));
4- var expires = "expires="+ d.toUTCString();
5- document.cookie = aName + "=" + aValue + ";" + expires + ";path=/";
6-}
7-
8-function getCookie(aName) {
9- var name = aName + "=";
10- var decodedCookie = decodeURIComponent(document.cookie);
11- var ca = decodedCookie.split(';');
12-
13- for(var i = 0; i < ca.length; i++) {
14- var c = ca[i];
15-
16- while (c.charAt(0) == ' ') {
17- c = c.substring(1);
18- }
19-
20- if (c.indexOf(name) == 0) {
21- return c.substring(name.length, c.length);
22- }
23- }
24-
25- return "";
26-}
27-
28-function deleteCookie(aName) {
29- setCookie(aName,"",0);
30-}
31-
32-function dispensarMensagemIdioma() {
33- jQuery("div.highlightoverlay").css("display","none");
34- jQuery("div.highlightoverlayinfo").css("display","none");
35- jQuery("body").css("overflow","scroll");
36- setCookie("CienteDaTraducaoAutomatica","sim",366);
37-}
38-
39-function mostrarMensagemIdioma() {
40- var languageCode = navigator.language || navigator.userLanguage;
41-
42- if (languageCode != "pt-BR" && getCookie("CienteDaTraducaoAutomatica") == "") {
43- jQuery("div.highlightoverlay").css("display","block");
44- jQuery("div.highlightoverlayinfo").css("display","block");
45- jQuery("body").css("overflow","hidden");
46- }
47-}
\ No newline at end of file
--- trunk/Projetos/Templates/zost_basicblack/assets/_/js/helpers.js (nonexistent)
+++ trunk/Projetos/Templates/zost_basicblack/assets/_/js/helpers.js (revision 75)
@@ -0,0 +1,244 @@
1+/*******************************************************************************
2+Zetta-Ømnis Helpers
3+
4+Este arquivo foi documentado com a notação JSDoc. Mais informações em
5+https://jsdoc.app/
6+*******************************************************************************/
7+class ZOSTHelpersException {
8+ constructor (aCode, aMessage) {
9+ this.code = aCode;
10+ this.message = aMessage;
11+ }
12+
13+ toString() {
14+ return this.code + " - " + this.message;
15+ }
16+}
17+
18+class ZOSTHelpers {
19+ ////////////////////////////////////////////////////////////////////////////
20+ // Campos privados //
21+ ////////////////////////////////////////////////////////////////////////////
22+ #overlayElement = null;
23+ #overlayTextElement = null;
24+ #additionalElements = null;
25+ #highlightedElement = null;
26+ ////////////////////////////////////////////////////////////////////////////
27+ // Construtor da clase //
28+ ////////////////////////////////////////////////////////////////////////////
29+ /**
30+ * @classdesc Zetta-Ømnis Helpers
31+ * @constructor
32+ * @description Construtor da classe
33+ * @param {jQuery Object} aOverlayElement Elemento usado como overlay
34+ */
35+ constructor (aOverlayElement = null) {
36+ if (aOverlayElement != null) {
37+ if (aOverlayElement instanceof jQuery) {
38+ this.#overlayElement = aOverlayElement;
39+ this.#overlayTextElement = this.#overlayElement.children(1);
40+ } else {
41+ throw new ZOSTHelpersException(1,"O parâmetro aOverlayElement não é um objeto jQuery válido");
42+ }
43+ }
44+ }
45+ ////////////////////////////////////////////////////////////////////////////
46+ // Métodos privados //
47+ ////////////////////////////////////////////////////////////////////////////
48+ /**
49+ * @description Exibe ou oculta o overlay, configurando outros aspectos para que seja possível destacar componentes
50+ * @param {boolean} aShow Informe true neste parâmetro para exibir o overlay e false para ocultá-lo
51+ */
52+ #showOverlay = function (aShow) {
53+ if (this.#overlayElement == null) {
54+ return;
55+ }
56+
57+ if (aShow) {
58+ this.#overlayElement.css("display","block");
59+ jQuery("body").css("overflow","hidden");
60+ } else {
61+ this.#overlayElement.css("display","none");
62+ jQuery("body").css("overflow","auto");
63+ }
64+ }
65+ ////////////////////////////////////////////////////////////////////////////
66+ // Métodos públicos //
67+ ////////////////////////////////////////////////////////////////////////////
68+ /**
69+ * @description Adiciona/configura um cookie
70+ * @param {string} aName Nome do cookie a adicionar/configurar
71+ * @param {string} aValue Valor do cookie a ser configurado
72+ * @param {integer} aDays Validade do cookie em dias
73+ */
74+ setCookie (aName, aValue, aDays) {
75+ let d = new Date();
76+ d.setTime(d.getTime() + (aDays*24*60*60*1000));
77+
78+ let expires = "expires="+ d.toUTCString();
79+ document.cookie = aName + "=" + aValue + ";" + expires + ";path=/";
80+ }
81+ /**
82+ * @description Obtém o valor de um cookie
83+ * @param {string} aName Nome do cookie cujo valor se quer obter
84+ * @returns {string} Valor do cookie ou uma string vazia caso o cookie não exista
85+ */
86+ getCookie (aName) {
87+ let name = aName + "=";
88+ let decodedCookie = decodeURIComponent(document.cookie);
89+ let ca = decodedCookie.split(';');
90+
91+ for(let i = 0; i < ca.length; i++) {
92+ let c = ca[i];
93+
94+ while (c.charAt(0) == ' ') {
95+ c = c.substring(1);
96+ }
97+
98+ if (c.indexOf(name) == 0) {
99+ return c.substring(name.length, c.length);
100+ }
101+ }
102+
103+ return "";
104+ }
105+ /**
106+ * @description Exclui um cookie
107+ * @param {string} aName Nome do cookie a excluir
108+ */
109+ deleteCookie (aName) {
110+ setCookie(aName,"",0);
111+ }
112+ /**
113+ * @description Destaca um elemento da página
114+ * @param {jQuery Object} aElement Elemento a ser destacado
115+ * @param {string} aContents Conteúdo a ser colocado dentro do div overlay. Pode conter html
116+ * @param {string} aContentsPosition Posição do div de conteúdo. [T]op, [L]eft, [B]ottom e [R]ight são os valores possíveis
117+ * @param {string} aClassName Nome de uma classe CSS a ser adicionada ao div de conteúdo
118+ * @param {object} aContentsOffset Objeto que define um ajuste fino para o posicionamento conteúdo
119+ * @param {array} aElementsToRemoveZIndex Array de objetos jQuery cujo z-index precisa ser removido
120+ */
121+ highlightElement(aElement,aContents = "",aContentsPosition = "B", aContentsOffset = {top: 0, left: 0}, aClassName = "", aElementsToRemoveZIndex = null) {
122+ if (aElement == null || !(aElement instanceof jQuery)) {
123+ throw new ZOSTHelpersException(1,"Parâmetro aElement não informado ou não é um objeto jQuery válido");
124+ }
125+ // Por padrão o texto do overlay é oculto e sem classes adicioais
126+ // associadas
127+ this.#overlayTextElement.css("display","none");
128+ this.#overlayTextElement.removeClass();
129+ this.#overlayTextElement.addClass("overlaytext");
130+
131+ if (aContents != "") {
132+ this.#overlayTextElement.css("display","block");
133+ this.#overlayTextElement.addClass(aClassName);
134+ this.#overlayTextElement.append(jQuery("<div>" + aContents + "</div>"));
135+
136+ let positions = new Set(["T","L","B","R"]);
137+ let position = !positions.has(aContentsPosition) ? "B" : aContentsPosition;
138+
139+ // offset obtém o posicionamento relativo ao documento como um todo
140+ // position faz o mesmo, só que relativo ao elemento pai.
141+ // https://api.jquery.com/offset/
142+ // Provavelmente devido as margens os valores de offset podem estar
143+ // dafasados para algum lado, por isso existe o parâmetro
144+ // aContentsOffset. Também foi necessário usar trunc porque um dos
145+ // valores (em pixels) retornado vinha com casasa decimais
146+
147+ // Muda a propriedade display, para que os métodos que retornam
148+ // dimensões, funcionem corretamente
149+ this.#overlayElement.css("display","block");
150+ switch(position) {
151+ case "T":
152+ this.#overlayTextElement.width(aElement.outerWidth());
153+ this.#overlayTextElement.offset({ top: aElement.offset().top - parseInt(this.#overlayTextElement.outerHeight()) + aContentsOffset.top, left: Math.trunc(aElement.offset().left) + aContentsOffset.left});
154+ break;
155+ case "L":
156+ break;
157+ case "B":
158+ this.#overlayTextElement.width(aElement.outerWidth());
159+ this.#overlayTextElement.offset({ top: aElement.offset().top + parseInt(aElement.outerHeight()) + aContentsOffset.top, left: Math.trunc(aElement.offset().left) + aContentsOffset.left});
160+ break;
161+ case "R":
162+ break;
163+ }
164+ // Oculta o overlay imediatamente, visto que ele só será exibido pra
165+ // valer mais adiante
166+ this.#overlayElement.css("display","none");
167+ }
168+
169+ this.#additionalElements = new Array();
170+ // Coloca os elementos informados em aElementsToRemoveZIndex num array
171+ // interno que contém a referência de cada elemento e seu z-index
172+ // original. Ao adicionar a referência na lista, o atributo z-index é
173+ // removido (unset)
174+ if (aElementsToRemoveZIndex != null) {
175+ let helper_this = this;
176+
177+ jQuery.each(aElementsToRemoveZIndex,function (aIndex, aValue) {
178+ helper_this.#additionalElements.push({"element":aValue,"zindex":aValue.css("z-index")});
179+ aValue.css("z-index","unset");
180+ });
181+ }
182+
183+ this.#highlightedElement = {"element":aElement,"position":aElement.css("position"),"zindex":aElement.css("z-index")};
184+ aElement.css("position","relative")
185+ aElement.css("z-index",parseInt(this.#overlayElement.css("z-index")) + 1);
186+
187+ this.#showOverlay(true);
188+ }
189+ /**
190+ * @description Remove qualquer efeito de destaque atualmente em execução
191+ */
192+ resetHighLighting() {
193+ if (this.#highlightedElement == null) {
194+ return;
195+ }
196+ // Recupera os atributos position e z-index originais do elemento que
197+ // estava destacado
198+ this.#highlightedElement.element.css("position",this.#highlightedElement.position);
199+ this.#highlightedElement.element.css("z-index",this.#highlightedElement.zindex);
200+ this.#highlightedElement = null;
201+ // Recupera o atributo z-index de todos os elementos adicionais
202+ if (this.#additionalElements != null) {
203+ jQuery.each(this.#additionalElements,function (aIndex, aValue) {
204+ aValue.element.css("z-index",aValue.zindex);
205+ });
206+ }
207+ this.#additionalElements = null;
208+ // Remove todos os elementos filhos do overlay
209+ this.#overlayTextElement.empty();
210+ this.#overlayTextElement.css("display","none");
211+ this.#overlayTextElement.removeClass();
212+ this.#overlayTextElement.addClass("overlaytext");
213+ // Desativa o overlay
214+ this.#showOverlay(false);
215+ }
216+
217+ /**
218+ * @description Destaca o módulo de tradução do do site, informando como traduzir seu conteúdo
219+ * @param {jQuery Object} aLanguageElement Elemento que contém o módulo de tradução que se deseja destacar
220+ */
221+ showLanguageWarning(aLanguageElement, aElementsToRemoveZIndex = null) {
222+ let languageCode = navigator.language || navigator.userLanguage;
223+
224+ if (languageCode != "pt-BR" && languageCode != "pt" && this.getCookie("CienteDaTraducaoAutomatica") == "") {
225+
226+ if (this.#overlayElement == null) {
227+ throw new ZOSTHelpersException(2,"Não foi informado o elemento de overlay no construtor da classe atual");
228+ }
229+
230+ if (aLanguageElement == null || !(aLanguageElement instanceof jQuery)) {
231+ throw new ZOSTHelpersException(1,"O parâmetro aLanguageElement não foi informado ou não é um objeto jQuery válido");
232+ }
233+
234+ let contents = "This is the first time that you visit my website and I would like to thank you in advance! :) Before proceeding, I would like to say that, at any time, you can change the language by choosing the flag of a country. Ohh and before I forget, this site uses cookies ;)<br><button onclick=\"zostHelpers.dismissLanguageWarning()\" class=\"btn btn-primary\">I am aware. Click here to show me the content!</button>";
235+ this.highlightElement(aLanguageElement,contents,"B",{top: 0, left: 8},"language",aElementsToRemoveZIndex);
236+ }
237+ }
238+
239+ dismissLanguageWarning() {
240+ this.setCookie("CienteDaTraducaoAutomatica","sim",366);
241+
242+ this.resetHighLighting();
243+ }
244+}
\ No newline at end of file
--- trunk/Projetos/Templates/zost_basicblack/assets/_/php/helpers.php (revision 74)
+++ trunk/Projetos/Templates/zost_basicblack/assets/_/php/helpers.php (revision 75)
@@ -196,6 +196,10 @@
196196 }
197197
198198 private function addQRCodeFragment($aDOMDocument,&$aNodeToReplace) {
199+ if (!$this->isRealUser()) {
200+ return;
201+ }
202+
199203 $urlEncoded = urlencode($this->doc->base);
200204 // !!!ATENÇÃO!!! Leia o comentário existente em addAdSenseFragment
201205 $html = <<<EOH
@@ -208,6 +212,19 @@
208212
209213 $this->replaceNodeXML($aDOMDocument,$aNodeToReplace,$html);
210214 }
215+
216+ private function isRealUser() {
217+ // Considero que um usuário de verdade acessa o site com algum navegador
218+ // que possui um "user agent", logo, se o resultado ali for zero,
219+ // significa que há um user agent e ele não é um bot. Se por acaso o
220+ // acesso for feito por algum dispositivo que não inclui um user agent
221+ // então a preg_match retorna false o que fará a função retornar false,
222+ // indicando que não se trata de um usuário real. Da mesma forma, se
223+ // houver um user agent com bot ou crawl é um bot, e preg_match
224+ // retornará 1, fazendo a função retornar false
225+ return preg_match("/(bot|crawl)/i", $_SERVER["HTTP_USER_AGENT"]) === 0;
226+ }
227+
211228 // Adiciona o bloco de instruções necessário para renderizar as estatísticas
212229 // do site. A função deve retornar apenas aquilo que deve substituir o
213230 // placeholder, porém scripts PHP que precisem ser executados, bem como
@@ -215,6 +232,14 @@
215232 // sendo executado dentro desta função, na verdade excutará no mesmo ponto
216233 // da ocorrência do place holder
217234 private function addStatisticsFragment($aDOMDocument,&$aNodeToReplace) {
235+ // O bloco de estatísticas só será colocado para usuários reais. Caso o
236+ // acesso atual tenha sido feito por um robô, não conta como acesso.
237+ // Neste caso, nem mesmo o bloco de estatísticas precisa ser
238+ // renderizado, portanto, sai imediatamente, sem fazer nada!
239+ if (!$this->isRealUser()) {
240+ return;
241+ }
242+
218243 // Adiciona os arquivos necessários. Isso também vai executar o conteúdo
219244 // destes arquivos dentro do contexto da página sendo renderizada
220245 require_once(__DIR__ . "/../../zolc/php/zolc.config.php");
@@ -268,6 +293,10 @@
268293 }
269294
270295 private function addAdSenseFragment($aDOMDocument,&$aNodeToReplace) {
296+ if (!$this->isRealUser()) {
297+ return;
298+ }
299+
271300 if (!empty(Self::ADSENSE_ID)) {
272301 $dataAdLayout = $aNodeToReplace->getAttribute("data-ad-layout") ?: "in-article";
273302 $dataAdFormat = $aNodeToReplace->getAttribute("data-ad-format") ?: "fluid";
@@ -292,7 +321,7 @@
292321 <div class="translucid" style="border-radius: 5px; width: 806px; overflow: hidden">
293322 <!-- ================== -->
294323 <!-- ANUNCIO IN-ARTICLE -->
295- <script async="true" src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"> </script>
324+ <script async="async" src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"> </script>
296325 <ins class="adsbygoogle" style="display:block; text-align:center;" data-ad-layout="$dataAdLayout" data-ad-format="$dataAdFormat" data-ad-client="$dataAdClient" data-ad-slot="$dataAdSlot"> </ins>
297326 <script>(adsbygoogle = window.adsbygoogle || []).push({});</script>
298327 <!-- ================== -->
@@ -365,19 +394,22 @@
365394 // Obtendo os links com notas de rodapé
366395 $footNoteIndex = 0;
367396 $footNoteTable = null;
397+
398+ $currentUrl = htmlspecialchars($this->currentUrl());
399+
368400 foreach ($aDOMDocument->getElementsByTagName("a") as $link) {
369401 if (!empty($link->getAttribute("title")) && $link->getAttribute("href") == "#" && $link->getAttribute("rel") == "bookmark") {
370- $footNoteText =$link->getAttribute("title");
402+ $footNoteText = $link->getAttribute("title");
371403 $footNoteIndex++;
372404 $linkText = $link->nodeValue;
373405 $linkTitle = $this->xmlentities("Clique para ver a nota de rodapé a respeito de <b>$linkText</b>");
374- $this->replaceNodeXML($aDOMDocument,$link,"$linkText<a class=\"fnlink\" id=\"RN$footNoteIndex\" href=\"#FN$footNoteIndex\" data-toggle=\"tooltip\" data-html=\"true\" title=\"$linkTitle\"><sup>[$footNoteIndex]</sup></a>");
406+ $this->replaceNodeXML($aDOMDocument,$link,"$linkText<a class=\"fnlink\" id=\"RN$footNoteIndex\" href=\"$currentUrl#FN$footNoteIndex\" data-toggle=\"tooltip\" data-html=\"true\" title=\"$linkTitle\"><sup>[$footNoteIndex]</sup></a>");
375407
376408 if (empty($footNoteTable)) {
377409 $footNoteTable = "<hr class=\"footnotes\" />\n<table class=\"footnotes\">";
378410 }
379411
380- $footNoteTable .= '<tr id="FN' . $footNoteIndex . '"><td>' . $footNoteIndex . '</td><td>' . $footNoteText . ' <a href="#RN' . $footNoteIndex . '" title="Clique para voltar ao ponto de leitura onde esta nota foi inserida" data-toggle="tooltip"><svg viewBox="0 0 8 8" class="icon" style="height: 0.9rem"><use class="icon" href="' . $this->baseSite(true) . '/templates/' . $this->app->getTemplate() . '/assets/_/img/open-iconic.min.svg#arrow-thick-top" /></svg></a></td></tr>';
412+ $footNoteTable .= '<tr id="FN' . $footNoteIndex . '"><td>' . $footNoteIndex . '</td><td>' . $footNoteText . ' <a href="' . $currentUrl . '#RN' . $footNoteIndex . '" title="Clique para voltar ao ponto de leitura onde esta nota foi inserida" data-toggle="tooltip"><svg viewBox="0 0 8 8" class="icon" style="height: 0.9rem"><use class="icon" href="' . $this->baseSite(true) . '/templates/' . $this->app->getTemplate() . '/assets/_/img/open-iconic.min.svg#arrow-thick-top" /></svg></a></td></tr>';
381413 }
382414 }
383415
@@ -612,7 +644,7 @@
612644 // Não coloquei espaço entre " e / porque o parser remove este
613645 // espaço e isso pode confundir uma pessoa lendo que aqui o PH
614646 // tem espaço, mas na hora da substituição não. Como o loop
615- // funciona de tras pra frente, usamos array_unshift para
647+ // funciona de trás pra frente, usamos array_unshift para
616648 // empilhar seus itens
617649 array_unshift($result,$this->replaceNodeXML($aDOMDocument,$pre,"<hr class=\"zostPP\"/>"));
618650 }
@@ -757,7 +789,8 @@
757789 // servidor ou se a resposta já será SEF. Aparentemente a classe Uri tem
758790 // outras facilidades, como os pedaços da URL. Isso pode ser útil! Usar
759791 // Uri permite acessar e alterar o url de uma forma mais estruturada,
760- // usando métodos disponibilizados pelo objeto
792+ // usando métodos disponibilizados pelo objeto. ATENÇÃO: current() não
793+ // retorna a query string
761794
762795 // Assum que a url passada no parâmetro (ou a url detectada) é uma url
763796 // SEF
@@ -808,7 +841,8 @@
808841 // servidor ou se a resposta já será SEF. Aparentemente a classe Uri tem
809842 // outras facilidades, como os pedaços da URL. Isso pode ser útil! Usar
810843 // Uri permite acessar e alterar o url de uma forma mais estruturada,
811- // usando métodos disponibilizados pelo objeto
844+ // usando métodos disponibilizados pelo objeto. ATENÇÃO: current() não
845+ // retorna a query string
812846 $url = (@$_SERVER["HTTPS"] == "on") ? "https://" : "http://";
813847
814848 $url .= $_SERVER["SERVER_NAME"];
@@ -898,7 +932,7 @@
898932
899933 $html .= isset($this->doc->_metaTags["name"]["keywords"])?"\t\t<meta name=\"keywords\" content=\"" . $this->doc->_metaTags["name"]["keywords"] . "\" />\n":"";
900934 $html .= isset($this->doc->_metaTags["name"]["rights"])?"\t\t<meta name=\"rights\" content=\"" . $this->doc->_metaTags["name"]["rights"] . "\" />\n":"";
901- $html .= "\t\t<meta name=\"description\" content=\"" . $this->doc->description . "\" />\n";
935+ $html .= "\t\t<meta name=\"description\" content=\"" . htmlentities($this->doc->description, ENT_QUOTES, "UTF-8") . "\" />\n";
902936 $html .= isset($this->doc->_generator)?"\t\t<meta name=\"generator\" content=\"" . $this->doc->_generator. "\" />\n":"";
903937 $html .= isset($this->doc->title)?"\t\t<title>" . $this->doc->title . "</title>\n":"";
904938
@@ -914,7 +948,7 @@
914948 // Open Graph comum (todas as páginas tem)
915949 $html .= "\t\t<meta property=\"og:url\" content=\"" . $this->doc->base . "\"/>\n";
916950 $html .= "\t\t<meta property=\"og:site_name\" content=\"" . $this->cnf->get("sitename") . "\"/>\n";
917- $html .= "\t\t<meta property=\"og:description\" content=\"" . htmlentities($this->doc->description) . "\"/>\n";
951+ $html .= "\t\t<meta property=\"og:description\" content=\"" . htmlentities($this->doc->description, ENT_QUOTES, "UTF-8") . "\"/>\n";
918952
919953 $image = null;
920954
@@ -976,6 +1010,16 @@
9761010
9771011 echo($html);
9781012 }
1013+
1014+ public function shortLink($aDocument = null) {
1015+ $aDocument = $aDocument ?: $this->doc;
1016+
1017+ foreach ($aDocument->_links as $href => $properties) {
1018+ if ($properties["relation"] == "shortlink") {
1019+ return $href;
1020+ }
1021+ }
1022+ }
9791023
9801024 // Retorna os cabeçalhos que são exigidos pelo template de forma básica.
9811025 // Normalmente esta função não precisa ser customizada. Verifique as funções
@@ -1005,11 +1049,31 @@
10051049 $modal_js = $this->cacheBuster(JPATH_THEMES . "/{$this->doc->template}/assets/squeezebox/js/squeezebox.js");
10061050 $modal_css = $this->cacheBuster(JPATH_THEMES . "/{$this->doc->template}/assets/squeezebox/css/squeezebox.css");
10071051
1052+ // Esta função não deveria conter qualquer inclusão opcional, mas como
1053+ // eu quis usar o jQuery para inicializar os plugins sociais, eu tive de
1054+ // colocar isso aqui
1055+ $fbInit = null;
1056+ if (self::FB_APP_ID != "") {
1057+ $fbAppId = self::FB_APP_ID;
1058+
1059+ $fbInit = <<<EOH
1060+
1061+ // Obtém o script via ajax e tão logo ele for obtido, inicia o plugin social
1062+ jZost.getScript("https://connect.facebook.net/pt_BR/sdk.js", function(){
1063+ FB.init({appId: "$fbAppId"
1064+ ,autoLogAppEvents: true
1065+ ,xfbml: true
1066+ ,version: "v7.0"
1067+ });
1068+ });
1069+EOH;
1070+ }
1071+
10081072 $html = <<<EOH
10091073 <link rel="stylesheet" href="$bootstrap_css" type="text/css" />
1010- <link rel="stylesheet" href="$styles_css" type="text/css" />
10111074 <link rel="stylesheet" href="$prism_css" type="text/css" />
10121075 <link rel="stylesheet" href="$modal_css" type="text/css" />
1076+ <link rel="stylesheet" href="$styles_css" type="text/css" />
10131077 <script src="$modernizr"> </script>
10141078 <script src="$core_js"> </script>
10151079 <script src="$mootoolsCore_js"> </script>
@@ -1032,6 +1096,7 @@
10321096 jZost("[data-toggle=\"tooltip\"]").tooltip();
10331097
10341098 squeezeBoxConfigure();
1099+$fbInit
10351100 });
10361101
10371102 /**
@@ -1059,7 +1124,7 @@
10591124 attachmentsUrl += "&parent_type=" + aParentType + "&parent_entity=" + aParentEntity;
10601125 attachmentsUrl += "&lang=" + aLang;
10611126 attachmentsUrl += "&from=" + aFrom + "&tmpl=component&format=raw";
1062- attachmentsUrl += "&template=zost_basicblack"; /* REMOVA A REFERÊNCIA FIXA AO TEMPLATE */
1127+ //attachmentsUrl += "&template=zost_basicblack"; /* REMOVA A REFERÊNCIA FIXA AO TEMPLATE */
10631128
10641129 if (!attachmentsList) {
10651130 attachmentsList = window.parent.document.getElementById(id);
@@ -1082,13 +1147,10 @@
10821147 }
10831148 }).send();
10841149 };
1085-
1086-
10871150 /* ]]> */
10881151 </script>
10891152
10901153 EOH;
1091-
10921154 echo($html);
10931155 }
10941156
@@ -1103,7 +1165,7 @@
11031165 $html .= self::NORTON_SAFEWEB_SITE_VERIFICATION != ""?"\t\t<meta name=\"norton-safeweb-site-verification\" content=\"" . self::NORTON_SAFEWEB_SITE_VERIFICATION . "\" />\n":"";
11041166 $html .= self::GOOGLE_SITE_VERIFICATION != ""?"\t\t<meta name=\"google-site-verification\" content=\"" . self::GOOGLE_SITE_VERIFICATION . "\" />\n":"";
11051167 $html .= self::MS_VALIDATE != ""?"\t\t<meta name=\"msvalidate.01\" content=\"" . self::MS_VALIDATE . "\" />\n":"";
1106- $html .= self::ADSENSE_ID != ""?"\t\t<script data-ad-client=\"" . self::ADSENSE_ID . "\" async src=\"https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js\"> </script>\n":"";
1168+ $html .= self::ADSENSE_ID != ""?"\t\t<script data-ad-client=\"" . self::ADSENSE_ID . "\" async=\"async\" src=\"https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js\"> </script>\n":"";
11071169 $html .= self::FAV_ICON != ""?"\t\t<link rel=\"icon\" type=\"image/x-icon\" href=\"" . $this->doc->baseurl . "/" . self::FAV_ICON . "\" />\n":"";
11081170
11091171 if (self::ZOLC_DSN != "") {
@@ -1126,7 +1188,7 @@
11261188 $analyticsId = self::ANALYTICS_ID;
11271189
11281190 $html .= <<<EOH
1129- <script async src="https://www.googletagmanager.com/gtag/js?id=$analyticsId"> </script>
1191+ <script async="async" src="https://www.googletagmanager.com/gtag/js?id=$analyticsId"> </script>
11301192 <script>
11311193 /* <![CDATA[ */
11321194 window.dataLayer = window.dataLayer || [];
@@ -1139,6 +1201,7 @@
11391201 EOH;
11401202 }
11411203
1204+
11421205 /*
11431206 outros cabeçalhos opcionais, verifique o template atual. veja que também
11441207 existe codigo do facebook, provavelmente para comentários, botoes e
@@ -1168,15 +1231,28 @@
11681231 // Retorna os cabeçalhos exclusivos para este site. Coloque seus scripts
11691232 // aqui
11701233 public function exclusiveHeaders() {
1171- $scripts_js = $this->cacheBuster(JPATH_THEMES . "/{$this->doc->template}/assets/_/js/scripts.js");
1234+ $helpers_js = $this->cacheBuster(JPATH_THEMES . "/{$this->doc->template}/assets/_/js/helpers.js");
11721235
11731236 $html = <<<EOH
1174- <script src="$scripts_js"> </script>
1237+ <script src="$helpers_js"> </script>
11751238 <script>
11761239 /* <![CDATA[ */
1240+var zostHelpers = null;
1241+// O código abaixo é executado quando o DOM está pronto (document ready), por
1242+// isso, é garantido que os elementos existam e eles poderão ser manipulados,
1243+// contudo isso diz respeito apenas ao DOM, dimensões de elementos ainda não
1244+// foram calculadas neste ponto
11771245 jQuery(function(jZost) {
1178- mostrarMensagemIdioma();
1246+ zostHelpers = new ZOSTHelpers(jZost("#overlay"));
11791247 });
1248+// O código abaixo ocorre depois que outros elementos foram carregados, como
1249+// imagens. Neste ponto é mais correta a obtenção de dimensões e posições
1250+// relativas, por isso é aqui que estamos mostrando os overlays com conteúdo que
1251+// precisam ser dimensionados e posicionados
1252+jQuery(window).on("load",function() {
1253+ zostHelpers.showLanguageWarning(jQuery("div.languageSelector")
1254+ ,[jQuery("#tab-content")]);
1255+});
11801256 /* ]]> */
11811257 </script>
11821258
--- trunk/Projetos/Templates/zost_basicblack/assets/prism/css/prism.css (revision 74)
+++ trunk/Projetos/Templates/zost_basicblack/assets/prism/css/prism.css (revision 75)
@@ -1,5 +1,5 @@
11 /* PrismJS 1.20.0
2-https://prismjs.com/download.html#themes=prism-okaidia&languages=markup+css+clike+javascript+apacheconf+basic+batch+c+csharp+cpp+css-extras+ini+java+json+markup-templating+nasm+pascal+perl+php+php-extras+plsql+powershell+python+ruby+smarty+sql&plugins=line-highlight+line-numbers+file-highlight+show-language+toolbar+copy-to-clipboard+download-button */
2+https://prismjs.com/download.html#themes=prism-okaidia&languages=markup+css+clike+javascript+apacheconf+basic+batch+c+csharp+cpp+css-extras+ini+java+json+markup-templating+nasm+pascal+perl+php+php-extras+plsql+powershell+python+ruby+smarty+sql&plugins=line-highlight+line-numbers+file-highlight+show-language+command-line+toolbar+copy-to-clipboard+download-button */
33 /**
44 * okaidia theme for JavaScript, CSS and HTML
55 * Loosely based on Monokai textmate theme by http://www.monokai.nl/
@@ -290,3 +290,37 @@
290290 text-decoration: none;
291291 }
292292
293+.command-line-prompt {
294+ border-right: 1px solid #999;
295+ display: block;
296+ float: left;
297+ font-size: 100%;
298+ letter-spacing: -1px;
299+ margin-right: 1em;
300+ pointer-events: none;
301+
302+ -webkit-user-select: none;
303+ -moz-user-select: none;
304+ -ms-user-select: none;
305+ user-select: none;
306+}
307+
308+.command-line-prompt > span:before {
309+ color: #999;
310+ content: ' ';
311+ display: block;
312+ padding-right: 0.8em;
313+}
314+
315+.command-line-prompt > span[data-user]:before {
316+ content: "[" attr(data-user) "@" attr(data-host) "] $";
317+}
318+
319+.command-line-prompt > span[data-user="root"]:before {
320+ content: "[" attr(data-user) "@" attr(data-host) "] #";
321+}
322+
323+.command-line-prompt > span[data-prompt]:before {
324+ content: attr(data-prompt);
325+}
326+
--- trunk/Projetos/Templates/zost_basicblack/assets/prism/js/prism.js (revision 74)
+++ trunk/Projetos/Templates/zost_basicblack/assets/prism/js/prism.js (revision 75)
@@ -1,5 +1,5 @@
11 /* PrismJS 1.20.0
2-https://prismjs.com/download.html#themes=prism-okaidia&languages=markup+css+clike+javascript+apacheconf+basic+batch+c+csharp+cpp+css-extras+ini+java+json+markup-templating+nasm+pascal+perl+php+php-extras+plsql+powershell+python+ruby+smarty+sql&plugins=line-highlight+line-numbers+file-highlight+show-language+toolbar+copy-to-clipboard+download-button */
2+https://prismjs.com/download.html#themes=prism-okaidia&languages=markup+css+clike+javascript+apacheconf+basic+batch+c+csharp+cpp+css-extras+ini+java+json+markup-templating+nasm+pascal+perl+php+php-extras+plsql+powershell+python+ruby+smarty+sql&plugins=line-highlight+line-numbers+file-highlight+show-language+command-line+toolbar+copy-to-clipboard+download-button */
33 var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(u){var c=/\blang(?:uage)?-([\w-]+)\b/i,n=0,C={manual:u.Prism&&u.Prism.manual,disableWorkerMessageHandler:u.Prism&&u.Prism.disableWorkerMessageHandler,util:{encode:function e(n){return n instanceof _?new _(n.type,e(n.content),n.alias):Array.isArray(n)?n.map(e):n.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/\u00a0/g," ")},type:function(e){return Object.prototype.toString.call(e).slice(8,-1)},objId:function(e){return e.__id||Object.defineProperty(e,"__id",{value:++n}),e.__id},clone:function t(e,r){var a,n;switch(r=r||{},C.util.type(e)){case"Object":if(n=C.util.objId(e),r[n])return r[n];for(var i in a={},r[n]=a,e)e.hasOwnProperty(i)&&(a[i]=t(e[i],r));return a;case"Array":return n=C.util.objId(e),r[n]?r[n]:(a=[],r[n]=a,e.forEach(function(e,n){a[n]=t(e,r)}),a);default:return e}},getLanguage:function(e){for(;e&&!c.test(e.className);)e=e.parentElement;return e?(e.className.match(c)||[,"none"])[1].toLowerCase():"none"},currentScript:function(){if("undefined"==typeof document)return null;if("currentScript"in document)return document.currentScript;try{throw new Error}catch(e){var n=(/at [^(\r\n]*\((.*):.+:.+\)$/i.exec(e.stack)||[])[1];if(n){var t=document.getElementsByTagName("script");for(var r in t)if(t[r].src==n)return t[r]}return null}},isActive:function(e,n,t){for(var r="no-"+n;e;){var a=e.classList;if(a.contains(n))return!0;if(a.contains(r))return!1;e=e.parentElement}return!!t}},languages:{extend:function(e,n){var t=C.util.clone(C.languages[e]);for(var r in n)t[r]=n[r];return t},insertBefore:function(t,e,n,r){var a=(r=r||C.languages)[t],i={};for(var l in a)if(a.hasOwnProperty(l)){if(l==e)for(var o in n)n.hasOwnProperty(o)&&(i[o]=n[o]);n.hasOwnProperty(l)||(i[l]=a[l])}var s=r[t];return r[t]=i,C.languages.DFS(C.languages,function(e,n){n===s&&e!=t&&(this[e]=i)}),i},DFS:function e(n,t,r,a){a=a||{};var i=C.util.objId;for(var l in n)if(n.hasOwnProperty(l)){t.call(n,l,n[l],r||l);var o=n[l],s=C.util.type(o);"Object"!==s||a[i(o)]?"Array"!==s||a[i(o)]||(a[i(o)]=!0,e(o,t,l,a)):(a[i(o)]=!0,e(o,t,null,a))}}},plugins:{},highlightAll:function(e,n){C.highlightAllUnder(document,e,n)},highlightAllUnder:function(e,n,t){var r={callback:t,container:e,selector:'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'};C.hooks.run("before-highlightall",r),r.elements=Array.prototype.slice.apply(r.container.querySelectorAll(r.selector)),C.hooks.run("before-all-elements-highlight",r);for(var a,i=0;a=r.elements[i++];)C.highlightElement(a,!0===n,r.callback)},highlightElement:function(e,n,t){var r=C.util.getLanguage(e),a=C.languages[r];e.className=e.className.replace(c,"").replace(/\s+/g," ")+" language-"+r;var i=e.parentElement;i&&"pre"===i.nodeName.toLowerCase()&&(i.className=i.className.replace(c,"").replace(/\s+/g," ")+" language-"+r);var l={element:e,language:r,grammar:a,code:e.textContent};function o(e){l.highlightedCode=e,C.hooks.run("before-insert",l),l.element.innerHTML=l.highlightedCode,C.hooks.run("after-highlight",l),C.hooks.run("complete",l),t&&t.call(l.element)}if(C.hooks.run("before-sanity-check",l),!l.code)return C.hooks.run("complete",l),void(t&&t.call(l.element));if(C.hooks.run("before-highlight",l),l.grammar)if(n&&u.Worker){var s=new Worker(C.filename);s.onmessage=function(e){o(e.data)},s.postMessage(JSON.stringify({language:l.language,code:l.code,immediateClose:!0}))}else o(C.highlight(l.code,l.grammar,l.language));else o(C.util.encode(l.code))},highlight:function(e,n,t){var r={code:e,grammar:n,language:t};return C.hooks.run("before-tokenize",r),r.tokens=C.tokenize(r.code,r.grammar),C.hooks.run("after-tokenize",r),_.stringify(C.util.encode(r.tokens),r.language)},tokenize:function(e,n){var t=n.rest;if(t){for(var r in t)n[r]=t[r];delete n.rest}var a=new i;return M(a,a.head,e),function e(n,t,r,a,i,l,o){for(var s in r)if(r.hasOwnProperty(s)&&r[s]){var u=r[s];u=Array.isArray(u)?u:[u];for(var c=0;c<u.length;++c){if(o&&o==s+","+c)return;var g=u[c],f=g.inside,h=!!g.lookbehind,d=!!g.greedy,v=0,p=g.alias;if(d&&!g.pattern.global){var m=g.pattern.toString().match(/[imsuy]*$/)[0];g.pattern=RegExp(g.pattern.source,m+"g")}g=g.pattern||g;for(var y=a.next,k=i;y!==t.tail;k+=y.value.length,y=y.next){var b=y.value;if(t.length>n.length)return;if(!(b instanceof _)){var x=1;if(d&&y!=t.tail.prev){g.lastIndex=k;var w=g.exec(n);if(!w)break;var A=w.index+(h&&w[1]?w[1].length:0),P=w.index+w[0].length,S=k;for(S+=y.value.length;S<=A;)y=y.next,S+=y.value.length;if(S-=y.value.length,k=S,y.value instanceof _)continue;for(var E=y;E!==t.tail&&(S<P||"string"==typeof E.value&&!E.prev.value.greedy);E=E.next)x++,S+=E.value.length;x--,b=n.slice(k,S),w.index-=k}else{g.lastIndex=0;var w=g.exec(b)}if(w){h&&(v=w[1]?w[1].length:0);var A=w.index+v,w=w[0].slice(v),P=A+w.length,O=b.slice(0,A),L=b.slice(P),N=y.prev;O&&(N=M(t,N,O),k+=O.length),W(t,N,x);var j=new _(s,f?C.tokenize(w,f):w,p,w,d);if(y=M(t,N,j),L&&M(t,y,L),1<x&&e(n,t,r,y.prev,k,!0,s+","+c),l)break}else if(l)break}}}}}(e,a,n,a.head,0),function(e){var n=[],t=e.head.next;for(;t!==e.tail;)n.push(t.value),t=t.next;return n}(a)},hooks:{all:{},add:function(e,n){var t=C.hooks.all;t[e]=t[e]||[],t[e].push(n)},run:function(e,n){var t=C.hooks.all[e];if(t&&t.length)for(var r,a=0;r=t[a++];)r(n)}},Token:_};function _(e,n,t,r,a){this.type=e,this.content=n,this.alias=t,this.length=0|(r||"").length,this.greedy=!!a}function i(){var e={value:null,prev:null,next:null},n={value:null,prev:e,next:null};e.next=n,this.head=e,this.tail=n,this.length=0}function M(e,n,t){var r=n.next,a={value:t,prev:n,next:r};return n.next=a,r.prev=a,e.length++,a}function W(e,n,t){for(var r=n.next,a=0;a<t&&r!==e.tail;a++)r=r.next;(n.next=r).prev=n,e.length-=a}if(u.Prism=C,_.stringify=function n(e,t){if("string"==typeof e)return e;if(Array.isArray(e)){var r="";return e.forEach(function(e){r+=n(e,t)}),r}var a={type:e.type,content:n(e.content,t),tag:"span",classes:["token",e.type],attributes:{},language:t},i=e.alias;i&&(Array.isArray(i)?Array.prototype.push.apply(a.classes,i):a.classes.push(i)),C.hooks.run("wrap",a);var l="";for(var o in a.attributes)l+=" "+o+'="'+(a.attributes[o]||"").replace(/"/g,"&quot;")+'"';return"<"+a.tag+' class="'+a.classes.join(" ")+'"'+l+">"+a.content+"</"+a.tag+">"},!u.document)return u.addEventListener&&(C.disableWorkerMessageHandler||u.addEventListener("message",function(e){var n=JSON.parse(e.data),t=n.language,r=n.code,a=n.immediateClose;u.postMessage(C.highlight(r,C.languages[t],t)),a&&u.close()},!1)),C;var e=C.util.currentScript();function t(){C.manual||C.highlightAll()}if(e&&(C.filename=e.src,e.hasAttribute("data-manual")&&(C.manual=!0)),!C.manual){var r=document.readyState;"loading"===r||"interactive"===r&&e&&e.defer?document.addEventListener("DOMContentLoaded",t):window.requestAnimationFrame?window.requestAnimationFrame(t):window.setTimeout(t,16)}return C}(_self);"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism);
44 Prism.languages.markup={comment:/<!--[\s\S]*?-->/,prolog:/<\?[\s\S]+?\?>/,doctype:{pattern:/<!DOCTYPE(?:[^>"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|<!--(?:[^-]|-(?!->))*-->)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^<!|>$|[[\]]/,"doctype-tag":/^DOCTYPE/,name:/[^\s<>'"]+/}},cdata:/<!\[CDATA\[[\s\S]*?]]>/i,tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.languages.markup.doctype.inside["internal-subset"].inside=Prism.languages.markup,Prism.hooks.add("wrap",function(a){"entity"===a.type&&(a.attributes.title=a.content.replace(/&amp;/,"&"))}),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(a,e){var s={};s["language-"+e]={pattern:/(^<!\[CDATA\[)[\s\S]+?(?=\]\]>$)/i,lookbehind:!0,inside:Prism.languages[e]},s.cdata=/^<!\[CDATA\[|\]\]>$/i;var n={"included-cdata":{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,inside:s}};n["language-"+e]={pattern:/[\s\S]+/,inside:Prism.languages[e]};var t={};t[a]={pattern:RegExp("(<__[^]*?>)(?:<!\\[CDATA\\[(?:[^\\]]|\\](?!\\]>))*\\]\\]>|(?!<!\\[CDATA\\[)[^])*?(?=</__>)".replace(/__/g,function(){return a}),"i"),lookbehind:!0,greedy:!0,inside:n},Prism.languages.insertBefore("markup","cdata",t)}}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.ssml=Prism.languages.xml,Prism.languages.atom=Prism.languages.xml,Prism.languages.rss=Prism.languages.xml;
55 !function(e){var s=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-]+[\s\S]*?(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\((?!\s*\))\s*)(?:[^()]|\((?:[^()]|\([^()]*\))*\))+?(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+s.source+"|(?:[^\\\\\r\n()\"']|\\\\[^])*)\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+s.source+"$"),alias:"url"}}},selector:RegExp("[^{}\\s](?:[^{};\"']|"+s.source+")*?(?=\\s*\\{)"),string:{pattern:s,greedy:!0},property:/[-_a-z\xA0-\uFFFF][-\w\xA0-\uFFFF]*(?=\s*:)/i,important:/!important\b/i,function:/[-a-z0-9]+(?=\()/i,punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var t=e.languages.markup;t&&(t.tag.addInlined("style","css"),e.languages.insertBefore("inside","attr-value",{"style-attr":{pattern:/\s*style=("|')(?:\\[\s\S]|(?!\1)[^\\])*\1/i,inside:{"attr-name":{pattern:/^\s*style/i,inside:t.tag.inside},punctuation:/^\s*=\s*['"]|['"]\s*$/,"attr-value":{pattern:/.+/i,inside:e.languages.css}},alias:"language-css"}},t.tag))}(Prism);
@@ -31,6 +31,7 @@
3131 !function(){if("undefined"!=typeof self&&self.Prism&&self.document){var o="line-numbers",a=/\n(?!$)/g,e=Prism.plugins.lineNumbers={getLine:function(e,n){if("PRE"===e.tagName&&e.classList.contains(o)){var t=e.querySelector(".line-numbers-rows"),i=parseInt(e.getAttribute("data-start"),10)||1,r=i+(t.children.length-1);n<i&&(n=i),r<n&&(n=r);var s=n-i;return t.children[s]}},resize:function(e){u([e])},assumeViewportIndependence:!0},t=function(e){return e?window.getComputedStyle?getComputedStyle(e):e.currentStyle||null:null},n=void 0;window.addEventListener("resize",function(){e.assumeViewportIndependence&&n===window.innerWidth||(n=window.innerWidth,u(Array.prototype.slice.call(document.querySelectorAll("pre."+o))))}),Prism.hooks.add("complete",function(e){if(e.code){var n=e.element,t=n.parentNode;if(t&&/pre/i.test(t.nodeName)&&!n.querySelector(".line-numbers-rows")&&Prism.util.isActive(n,o)){n.classList.remove(o),t.classList.add(o);var i,r=e.code.match(a),s=r?r.length+1:1,l=new Array(s+1).join("<span></span>");(i=document.createElement("span")).setAttribute("aria-hidden","true"),i.className="line-numbers-rows",i.innerHTML=l,t.hasAttribute("data-start")&&(t.style.counterReset="linenumber "+(parseInt(t.getAttribute("data-start"),10)-1)),e.element.appendChild(i),u([t]),Prism.hooks.run("line-numbers",e)}}}),Prism.hooks.add("line-numbers",function(e){e.plugins=e.plugins||{},e.plugins.lineNumbers=!0})}function u(e){if(0!=(e=e.filter(function(e){var n=t(e)["white-space"];return"pre-wrap"===n||"pre-line"===n})).length){var n=e.map(function(e){var n=e.querySelector("code"),t=e.querySelector(".line-numbers-rows");if(n&&t){var i=e.querySelector(".line-numbers-sizer"),r=n.textContent.split(a);i||((i=document.createElement("span")).className="line-numbers-sizer",n.appendChild(i)),i.innerHTML="0",i.style.display="block";var s=i.getBoundingClientRect().height;return i.innerHTML="",{element:e,lines:r,lineHeights:[],oneLinerHeight:s,sizer:i}}}).filter(Boolean);n.forEach(function(e){var i=e.sizer,n=e.lines,r=e.lineHeights,s=e.oneLinerHeight;r[n.length-1]=void 0,n.forEach(function(e,n){if(e&&1<e.length){var t=i.appendChild(document.createElement("span"));t.style.display="block",t.textContent=e}else r[n]=s})}),n.forEach(function(e){for(var n=e.sizer,t=e.lineHeights,i=0,r=0;r<t.length;r++)void 0===t[r]&&(t[r]=n.children[i++].getBoundingClientRect().height)}),n.forEach(function(e){var n=e.sizer,t=e.element.querySelector(".line-numbers-rows");n.style.display="none",n.innerHTML="",e.lineHeights.forEach(function(e,n){t.children[n].style.height=e+"px"})})}}}();
3232 !function(){if("undefined"!=typeof self&&self.Prism&&self.document){var o=window.Prism,h={js:"javascript",py:"python",rb:"ruby",ps1:"powershell",psm1:"powershell",sh:"bash",bat:"batch",h:"c",tex:"latex"},g="data-src-status",u="loading",c="loaded",d="pre[data-src]:not(["+g+'="'+c+'"]):not(['+g+'="'+u+'"])',n=/\blang(?:uage)?-([\w-]+)\b/i;o.hooks.add("before-highlightall",function(e){e.selector+=", "+d}),o.hooks.add("before-sanity-check",function(e){var t=e.element;if(t.matches(d)){e.code="",t.setAttribute(g,u);var i=t.appendChild(document.createElement("CODE"));i.textContent="Loading…";var n=t.getAttribute("data-src"),a=e.language;if("none"===a){var s=(/\.(\w+)$/.exec(n)||[,"none"])[1];a=h[s]||s}f(i,a),f(t,a);var l=o.plugins.autoloader;l&&l.loadLanguages(a);var r=new XMLHttpRequest;r.open("GET",n,!0),r.onreadystatechange=function(){4==r.readyState&&(r.status<400&&r.responseText?(t.setAttribute(g,c),i.textContent=r.responseText,o.highlightElement(i)):(t.setAttribute(g,"failed"),400<=r.status?i.textContent=function(e,t){return"✖ Error "+e+" while fetching file: "+t}(r.status,r.statusText):i.textContent="✖ Error: File does not exist or is empty"))},r.send(null)}});var e=!(o.plugins.fileHighlight={highlight:function(e){for(var t,i=(e||document).querySelectorAll(d),n=0;t=i[n++];)o.highlightElement(t)}});o.fileHighlight=function(){e||(console.warn("Prism.fileHighlight is deprecated. Use `Prism.plugins.fileHighlight.highlight` instead."),e=!0),o.plugins.fileHighlight.highlight.apply(this,arguments)}}function f(e,t){var i=e.className;i=i.replace(n," ")+" language-"+t,e.className=i.replace(/\s+/g," ").trim()}}();
3333 !function(){if("undefined"!=typeof self&&self.Prism&&self.document){var i=[],l={},c=function(){};Prism.plugins.toolbar={};var e=Prism.plugins.toolbar.registerButton=function(e,n){var t;t="function"==typeof n?n:function(e){var t;return"function"==typeof n.onClick?((t=document.createElement("button")).type="button",t.addEventListener("click",function(){n.onClick.call(this,e)})):"string"==typeof n.url?(t=document.createElement("a")).href=n.url:t=document.createElement("span"),n.className&&t.classList.add(n.className),t.textContent=n.text,t},e in l?console.warn('There is a button with the key "'+e+'" registered already.'):i.push(l[e]=t)},t=Prism.plugins.toolbar.hook=function(a){var e=a.element.parentNode;if(e&&/pre/i.test(e.nodeName)&&!e.parentNode.classList.contains("code-toolbar")){var t=document.createElement("div");t.classList.add("code-toolbar"),e.parentNode.insertBefore(t,e),t.appendChild(e);var r=document.createElement("div");r.classList.add("toolbar");var n=i,o=function(e){for(;e;){var t=e.getAttribute("data-toolbar-order");if(null!=t)return(t=t.trim()).length?t.split(/\s*,\s*/g):[];e=e.parentElement}}(a.element);o&&(n=o.map(function(e){return l[e]||c})),n.forEach(function(e){var t=e(a);if(t){var n=document.createElement("div");n.classList.add("toolbar-item"),n.appendChild(t),r.appendChild(n)}}),t.appendChild(r)}};e("label",function(e){var t=e.element.parentNode;if(t&&/pre/i.test(t.nodeName)&&t.hasAttribute("data-label")){var n,a,r=t.getAttribute("data-label");try{a=document.querySelector("template#"+r)}catch(e){}return a?n=a.content:(t.hasAttribute("data-url")?(n=document.createElement("a")).href=t.getAttribute("data-url"):n=document.createElement("span"),n.textContent=r),n}}),Prism.hooks.add("complete",t)}}();
34-!function(){if("undefined"!=typeof self&&self.Prism&&self.document)if(Prism.plugins.toolbar){var r={html:"HTML",xml:"XML",svg:"SVG",mathml:"MathML",ssml:"SSML",rss:"RSS",css:"CSS",clike:"C-like",js:"JavaScript",abap:"ABAP",abnf:"ABNF",al:"AL",antlr4:"ANTLR4",g4:"ANTLR4",apacheconf:"Apache Configuration",apl:"APL",aql:"AQL",arff:"ARFF",asciidoc:"AsciiDoc",adoc:"AsciiDoc",aspnet:"ASP.NET (C#)",asm6502:"6502 Assembly",autohotkey:"AutoHotkey",autoit:"AutoIt",basic:"BASIC",bbcode:"BBcode",bnf:"BNF",rbnf:"RBNF",csharp:"C#",cs:"C#",dotnet:"C#",cpp:"C++",cil:"CIL",cmake:"CMake",coffee:"CoffeeScript",conc:"Concurnas",csp:"Content-Security-Policy","css-extras":"CSS Extras",dax:"DAX",django:"Django/Jinja2",jinja2:"Django/Jinja2","dns-zone-file":"DNS zone file","dns-zone":"DNS zone file",dockerfile:"Docker",ebnf:"EBNF",ejs:"EJS",etlua:"Embedded Lua templating",erb:"ERB","excel-formula":"Excel Formula",xlsx:"Excel Formula",xls:"Excel Formula",fsharp:"F#","firestore-security-rules":"Firestore security rules",ftl:"FreeMarker Template Language",gml:"GameMaker Language",gamemakerlanguage:"GameMaker Language",gcode:"G-code",gdscript:"GDScript",gedcom:"GEDCOM",glsl:"GLSL",graphql:"GraphQL",hs:"Haskell",hcl:"HCL",hlsl:"HLSL",http:"HTTP",hpkp:"HTTP Public-Key-Pins",hsts:"HTTP Strict-Transport-Security",ichigojam:"IchigoJam",inform7:"Inform 7",javadoc:"JavaDoc",javadoclike:"JavaDoc-like",javastacktrace:"Java stack trace",jq:"JQ",jsdoc:"JSDoc","js-extras":"JS Extras",json:"JSON",webmanifest:"Web App Manifest",json5:"JSON5",jsonp:"JSONP",jsstacktrace:"JS stack trace","js-templates":"JS Templates",latex:"LaTeX",tex:"TeX",context:"ConTeXt",lilypond:"LilyPond",ly:"LilyPond",emacs:"Lisp",elisp:"Lisp","emacs-lisp":"Lisp",llvm:"LLVM IR",lolcode:"LOLCODE",md:"Markdown","markup-templating":"Markup templating",matlab:"MATLAB",mel:"MEL",moon:"MoonScript",n1ql:"N1QL",n4js:"N4JS",n4jsd:"N4JS","nand2tetris-hdl":"Nand To Tetris HDL",nasm:"NASM",neon:"NEON",nginx:"nginx",nsis:"NSIS",objectivec:"Objective-C",objc:"Objective-C",ocaml:"OCaml",opencl:"OpenCL",parigp:"PARI/GP",objectpascal:"Object Pascal",pcaxis:"PC-Axis",px:"PC-Axis",peoplecode:"PeopleCode",pcode:"PeopleCode",php:"PHP",phpdoc:"PHPDoc","php-extras":"PHP Extras",plsql:"PL/SQL",powerquery:"PowerQuery",pq:"PowerQuery",mscript:"PowerQuery",powershell:"PowerShell",properties:".properties",protobuf:"Protocol Buffers",purebasic:"PureBasic",pbfasm:"PureBasic",py:"Python",q:"Q (kdb+ database)",qml:"QML",rkt:"Racket",jsx:"React JSX",tsx:"React TSX",renpy:"Ren'py",rpy:"Ren'py",rest:"reST (reStructuredText)",robotframework:"Robot Framework",robot:"Robot Framework",rb:"Ruby",sas:"SAS",sass:"Sass (Sass)",scss:"Sass (Scss)","shell-session":"Shell session",solidity:"Solidity (Ethereum)",sol:"Solidity (Ethereum)","solution-file":"Solution file",sln:"Solution file",soy:"Soy (Closure Template)",sparql:"SPARQL",rq:"SPARQL","splunk-spl":"Splunk SPL",sqf:"SQF: Status Quo Function (Arma 3)",sql:"SQL",iecst:"Structured Text (IEC 61131-3)","t4-templating":"T4 templating","t4-cs":"T4 Text Templates (C#)",t4:"T4 Text Templates (C#)","t4-vb":"T4 Text Templates (VB)",tap:"TAP",tt2:"Template Toolkit 2",toml:"TOML",trig:"TriG",ts:"TypeScript",uscript:"UnrealScript",uc:"UnrealScript",vbnet:"VB.Net",vhdl:"VHDL",vim:"vim","visual-basic":"Visual Basic",vb:"Visual Basic",wasm:"WebAssembly",wiki:"Wiki markup",xeoracube:"XeoraCube","xml-doc":"XML doc (.net)",xojo:"Xojo (REALbasic)",xquery:"XQuery",yaml:"YAML",yml:"YAML"};Prism.plugins.toolbar.registerButton("show-language",function(e){var a=e.element.parentNode;if(a&&/pre/i.test(a.nodeName)){var t,s=a.getAttribute("data-language")||r[e.language]||((t=e.language)?(t.substring(0,1).toUpperCase()+t.substring(1)).replace(/s(?=cript)/,"S"):t);if(s){var o=document.createElement("span");return o.textContent=s,o}}})}else console.warn("Show Languages plugin loaded before Toolbar plugin.")}();
34+!function(){if("undefined"!=typeof self&&self.Prism&&self.document)if(Prism.plugins.toolbar){var r={html:"HTML",xml:"XML",svg:"SVG",mathml:"MathML",ssml:"SSML",rss:"RSS",css:"CSS",clike:"C-like",js:"JavaScript",abap:"ABAP",abnf:"ABNF",al:"AL",antlr4:"ANTLR4",g4:"ANTLR4",apacheconf:"Apache Configuration",apl:"APL",aql:"AQL",arff:"ARFF",asciidoc:"AsciiDoc",adoc:"AsciiDoc",aspnet:"ASP.NET (C#)",asm6502:"6502 Assembly",autohotkey:"AutoHotkey",autoit:"AutoIt",basic:"BASIC",bbcode:"BBcode",bnf:"BNF",rbnf:"RBNF",csharp:"C#",cs:"C#",dotnet:"C#",cpp:"C++",cil:"CIL",cmake:"CMake",coffee:"CoffeeScript",conc:"Concurnas",csp:"Content-Security-Policy","css-extras":"CSS Extras",dax:"DAX",django:"Django/Jinja2",jinja2:"Django/Jinja2","dns-zone-file":"DNS zone file","dns-zone":"DNS zone file",dockerfile:"Docker",ebnf:"EBNF",editorconfig:"EditorConfig",ejs:"EJS",etlua:"Embedded Lua templating",erb:"ERB","excel-formula":"Excel Formula",xlsx:"Excel Formula",xls:"Excel Formula",fsharp:"F#","firestore-security-rules":"Firestore security rules",ftl:"FreeMarker Template Language",gml:"GameMaker Language",gamemakerlanguage:"GameMaker Language",gcode:"G-code",gdscript:"GDScript",gedcom:"GEDCOM",glsl:"GLSL",graphql:"GraphQL",hs:"Haskell",hcl:"HCL",hlsl:"HLSL",http:"HTTP",hpkp:"HTTP Public-Key-Pins",hsts:"HTTP Strict-Transport-Security",ichigojam:"IchigoJam",inform7:"Inform 7",javadoc:"JavaDoc",javadoclike:"JavaDoc-like",javastacktrace:"Java stack trace",jq:"JQ",jsdoc:"JSDoc","js-extras":"JS Extras",json:"JSON",webmanifest:"Web App Manifest",json5:"JSON5",jsonp:"JSONP",jsstacktrace:"JS stack trace","js-templates":"JS Templates",latex:"LaTeX",tex:"TeX",context:"ConTeXt",lilypond:"LilyPond",ly:"LilyPond",emacs:"Lisp",elisp:"Lisp","emacs-lisp":"Lisp",llvm:"LLVM IR",lolcode:"LOLCODE",md:"Markdown","markup-templating":"Markup templating",matlab:"MATLAB",mel:"MEL",moon:"MoonScript",n1ql:"N1QL",n4js:"N4JS",n4jsd:"N4JS","nand2tetris-hdl":"Nand To Tetris HDL",nasm:"NASM",neon:"NEON",nginx:"nginx",nsis:"NSIS",objectivec:"Objective-C",objc:"Objective-C",ocaml:"OCaml",opencl:"OpenCL",parigp:"PARI/GP",objectpascal:"Object Pascal",pcaxis:"PC-Axis",px:"PC-Axis",peoplecode:"PeopleCode",pcode:"PeopleCode",php:"PHP",phpdoc:"PHPDoc","php-extras":"PHP Extras",plsql:"PL/SQL",powerquery:"PowerQuery",pq:"PowerQuery",mscript:"PowerQuery",powershell:"PowerShell",properties:".properties",protobuf:"Protocol Buffers",purebasic:"PureBasic",pbfasm:"PureBasic",py:"Python",q:"Q (kdb+ database)",qml:"QML",rkt:"Racket",jsx:"React JSX",tsx:"React TSX",renpy:"Ren'py",rpy:"Ren'py",rest:"reST (reStructuredText)",robotframework:"Robot Framework",robot:"Robot Framework",rb:"Ruby",sas:"SAS",sass:"Sass (Sass)",scss:"Sass (Scss)","shell-session":"Shell session",solidity:"Solidity (Ethereum)",sol:"Solidity (Ethereum)","solution-file":"Solution file",sln:"Solution file",soy:"Soy (Closure Template)",sparql:"SPARQL",rq:"SPARQL","splunk-spl":"Splunk SPL",sqf:"SQF: Status Quo Function (Arma 3)",sql:"SQL",iecst:"Structured Text (IEC 61131-3)","t4-templating":"T4 templating","t4-cs":"T4 Text Templates (C#)",t4:"T4 Text Templates (C#)","t4-vb":"T4 Text Templates (VB)",tap:"TAP",tt2:"Template Toolkit 2",toml:"TOML",trig:"TriG",ts:"TypeScript",uscript:"UnrealScript",uc:"UnrealScript",vbnet:"VB.Net",vhdl:"VHDL",vim:"vim","visual-basic":"Visual Basic",vb:"Visual Basic",wasm:"WebAssembly",wiki:"Wiki markup",xeoracube:"XeoraCube","xml-doc":"XML doc (.net)",xojo:"Xojo (REALbasic)",xquery:"XQuery",yaml:"YAML",yml:"YAML"};Prism.plugins.toolbar.registerButton("show-language",function(e){var a=e.element.parentNode;if(a&&/pre/i.test(a.nodeName)){var t,s=a.getAttribute("data-language")||r[e.language]||((t=e.language)?(t.substring(0,1).toUpperCase()+t.substring(1)).replace(/s(?=cript)/,"S"):t);if(s){var o=document.createElement("span");return o.textContent=s,o}}})}else console.warn("Show Languages plugin loaded before Toolbar plugin.")}();
35+!function(){if("undefined"!=typeof self&&self.Prism&&self.document){var f=/(?:^|\s)command-line(?:\s|$)/,p="command-line-prompt",m="".startsWith?function(e,t){return e.startsWith(t)}:function(e,t){return 0===e.indexOf(t)};Prism.hooks.add("before-highlight",function(e){var t=h(e);if(!t.complete&&e.code){var n=e.element.parentElement;if(n&&/pre/i.test(n.nodeName)&&(f.test(n.className)||f.test(e.element.className))){var a=e.element.querySelector("."+p);a&&a.remove();var s=e.code.split("\n");t.numberOfLines=s.length;var o=t.outputLines=[],r=n.getAttribute("data-output"),i=n.getAttribute("data-filter-output");if(null!==r)r.split(",").forEach(function(e){var t=e.split("-"),n=parseInt(t[0],10),a=2===t.length?parseInt(t[1],10):n;if(!isNaN(n)&&!isNaN(a)){n<1&&(n=1),a>s.length&&(a=s.length),a--;for(var r=--n;r<=a;r++)o[r]=s[r],s[r]=""}});else if(i)for(var l=0;l<s.length;l++)m(s[l],i)&&(o[l]=s[l].slice(i.length),s[l]="");e.code=s.join("\n")}else t.complete=!0}else t.complete=!0}),Prism.hooks.add("before-insert",function(e){var t=h(e);if(!t.complete){for(var n=e.highlightedCode.split("\n"),a=t.outputLines||[],r=0,s=a.length;r<s;r++)a.hasOwnProperty(r)&&(n[r]=a[r]);e.highlightedCode=n.join("\n")}}),Prism.hooks.add("complete",function(e){var t=h(e);if(!t.complete){var n,a=e.element.parentElement;f.test(e.element.className)&&(e.element.className=e.element.className.replace(f," ")),f.test(a.className)||(a.className+=" command-line");var r=t.numberOfLines||0,s=u("data-prompt","");if(""!==s)n=d('<span data-prompt="'+s+'"></span>',r);else n=d('<span data-user="'+u("data-user","user")+'" data-host="'+u("data-host","localhost")+'"></span>',r);var o=document.createElement("span");o.className=p,o.innerHTML=n;for(var i=t.outputLines||[],l=0,m=i.length;l<m;l++)if(i.hasOwnProperty(l)){var c=o.children[l];c.removeAttribute("data-user"),c.removeAttribute("data-host"),c.removeAttribute("data-prompt")}e.element.insertBefore(o,e.element.firstChild),t.complete=!0}function u(e,t){return(a.getAttribute(e)||t).replace(/"/g,"&quot")}})}function d(e,t){for(var n="",a=0;a<t;a++)n+=e;return n}function h(e){var t=e.vars=e.vars||{};return t["command-line"]=t["command-line"]||{}}}();
3536 !function(){if("undefined"!=typeof self&&self.Prism&&self.document)if(Prism.plugins.toolbar){var i=window.ClipboardJS||void 0;i||"function"!=typeof require||(i=require("clipboard"));var c=[];if(!i){var o=document.createElement("script"),t=document.querySelector("head");o.onload=function(){if(i=window.ClipboardJS)for(;c.length;)c.pop()()},o.src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.0/clipboard.min.js",t.appendChild(o)}Prism.plugins.toolbar.registerButton("copy-to-clipboard",function(o){var t=document.createElement("button");t.textContent="Copy";var e=o.element;return i?n():c.push(n),t;function n(){var o=new i(t,{text:function(){return e.textContent}});o.on("success",function(){t.textContent="Copied!",r()}),o.on("error",function(){t.textContent="Press Ctrl+C to copy",r()})}function r(){setTimeout(function(){t.textContent="Copy"},5e3)}})}else console.warn("Copy to Clipboard plugin loaded before Toolbar plugin.")}();
3637 "undefined"!=typeof self&&self.Prism&&self.document&&document.querySelector&&Prism.plugins.toolbar.registerButton("download-file",function(t){var e=t.element.parentNode;if(e&&/pre/i.test(e.nodeName)&&e.hasAttribute("data-src")&&e.hasAttribute("data-download-link")){var a=e.getAttribute("data-src"),n=document.createElement("a");return n.textContent=e.getAttribute("data-download-link-label")||"Download",n.setAttribute("download",""),n.href=a,n}});
--- trunk/Projetos/Templates/zost_basicblack/html/com_content/article/default.php (revision 74)
+++ trunk/Projetos/Templates/zost_basicblack/html/com_content/article/default.php (revision 75)
@@ -145,6 +145,9 @@
145145 }
146146 // Passa o texto da publicação e transforma-o em um DOMDocument, assim
147147 // podemos realizar operações html mais facilmente
148+
149+ //file_put_contents("conteudo.txt",$this->item->text,FILE_TEXT);
150+
148151 // echo($this->item->text);
149152 // exit;
150153 $textDocument = $zostHelpers->documentFromHtml($this->item->text);
@@ -204,11 +207,20 @@
204207 foreach ($toPostProcess as $node) {
205208 // == Código processado pelos Prism (Syntax Highlighter) ===========
206209 if ($node->tagName == "pre" && stripos($node->getAttribute("class"),"language-") !== false) {
210+ // Atributos gerais
207211 $id = !empty($node->getAttribute("id")) ? ' id="' . $node->getAttribute("id") . '"' : null;
208- $class = trim($node->getAttribute("class"));
209- $text = $node->firstChild->textContent;
212+ $class = trim($node->getAttribute("class")) != "" ? ' class="' . trim($node->getAttribute("class")) . '"' : null;
213+ // Atributos usados pelo plugin "Command Line" do Prism
214+ $dataPrompt = !empty($node->getAttribute("data-prompt")) ? ' data-prompt="' . $node->getAttribute("data-prompt") . '"' : null;
215+ $dataOutput = !empty($node->getAttribute("data-output")) ? ' data-output="' . $node->getAttribute("data-output") . '"' : null;
216+ // O parser converte entidades &#XX; em seus caracteres reais.
217+ // Curiosamente isso só aconteceu até o momento para o conteúdo
218+ // do prism o texto normal que contém tais entidades são
219+ // mantidas como são. htmlentities garante que <, > e outros
220+ // caracteres sejam convertidos em entidades.
221+ $text = htmlentities($node->firstChild->textContent);
210222 $code = <<<EOH
211- <pre$id class="$class"><code>$text</pre></code>
223+ <pre$id$class$dataPrompt$dataOutput><code>$text</code></pre>
212224
213225 EOH;
214226 // Substituindo o primeiro placeholder pelo primeiro conteúdo
@@ -299,4 +311,38 @@
299311 </div>
300312 EOH;
301313 }
302-?>
\ No newline at end of file
314+// O url identificador dos plugins sociais do Facebook será o url reduzido do
315+// artigo, com o protocolo http sempre
316+$facebookCommentsDataHref = $zostHelpers->shortLink();
317+$facebookCommentsDataHref = preg_replace("/http[s]?/", "http", $facebookCommentsDataHref, 1);
318+?>
319+<div id="FacebookSocialPlugins">
320+ <!-- Citações: selecione qualquer texto e compartilhe -->
321+ <div class="fb-quote" data-layout="quote"> </div>
322+ <!-- Botões curtir + compartilhar -->
323+ <div class="fb-like" data-action="like" data-colorscheme="light" data-layout="standard" data-share="true" data-show-faces="true" data-size="large"> </div>
324+ <!-- Botão para salvar o artigo atual no Facebook -->
325+ <div class="fb-save"> </div>
326+ <!-- Comentários -->
327+ <div id="FBC">
328+ <!-- O plugin de comentários é associado a um url, que pode ser fictício
329+ ou não, pois é apenas uma idetificação (chave primária) para o plugin.
330+ Para que cada página dentro do site tenha seus próprios comentários, o
331+ url precisa ser uma identificação daquela página e a escolha mais lógica
332+ seria o url completo para a página
333+ ($zostHelpers->app->getDocument()->base). O problema disso é que se a
334+ pessoa acessar com http ou https ela vai conseguir duas páginas
335+ diferentes para o plugin, com comentários diferentes. O mesmo acontece
336+ caso a página possua uma query string, muito comum em artigos divididos
337+ em páginas. Isso não é problema para comentários em páginas individuais,
338+ porém ao ver o artigo completo (que possui uma querystring diferente),
339+ os comentários colocados nas páginas individuais não são "juntados".
340+ Infelizmente, a única forma de resolver este problema é utilizar uma
341+ página única para o artigo, seja ele dividido ou não. Isso vai mostrar
342+ todos os comentários em todas as páginas do artigo. Comentários nas
343+ páginas ANTES dessa alteração serão perdidos para sempre, mais
344+ especificamente eles continuarão existindo, porém ficarão inacessíveis,
345+ pois estaremos usando uma "chave" diferente -->
346+ <div class="fb-comments" data-href="<?php echo($facebookCommentsDataHref); ?>" data-colorscheme="light" data-numposts="20" data-order-by="reverse_time" data-width="100%"> </div>
347+ </div>
348+</div>
--- trunk/Projetos/Templates/zost_basicblack/html/modules.php (revision 74)
+++ trunk/Projetos/Templates/zost_basicblack/html/modules.php (revision 75)
@@ -41,11 +41,13 @@
4141 // construído esteja perfeito!
4242 $contents = Helpers::indentLines($aModule->content,2);
4343
44+ $classSuffix = $aParams->get("moduleclass_sfx") ? " " . $aParams->get("moduleclass_sfx") : "";
45+
4446 // IndentLines mais adiante utiliza trim no texto que vai ser endentado.
4547 // Isso remove qualquer enter adicionado ao final do texto que será
4648 // endentado, por isso foi incluído um \n no final do echo
4749 $html = <<<EOH
48-<div class="module-container">
50+<div class="module-container$classSuffix">
4951 $title <div class="module-contents">
5052 $contents
5153 </div>
--- trunk/Projetos/Templates/zost_basicblack/index.php (revision 74)
+++ trunk/Projetos/Templates/zost_basicblack/index.php (revision 75)
@@ -17,6 +17,8 @@
1717
1818 use Zost\Helpers;
1919
20+//file_put_contents("acessos.txt",$_SERVER['HTTP_USER_AGENT'] . "\n",FILE_TEXT | FILE_APPEND);
21+
2022 $zostHelpers = Helpers::getHelpers();
2123 ?>
2224 <!DOCTYPE html>
@@ -48,7 +50,7 @@
4850 <main>
4951 <div>
5052 <jdoc:include type="module" name="menu" title="basicblack-menu" /><!-- basicblack-menu -->
51- <div class="tab-content">
53+ <div id="tab-content" class="tab-content">
5254 <div class="tab-pane active" role="tabpanel" id="tab-1">
5355 <?php
5456 if ($this->countModules("basicblack-Row1Column1 or basicblack-Row2Column1 or basicblack-Row3Column1")) {
@@ -172,7 +174,7 @@
172174 <?php
173175 }
174176 ?>
175- <div class="overlay"></div>
177+ <div id="overlay" class="overlay"><div class="overlaytext"></div></div>
176178 <div class="modal fade" role="dialog" tabindex="-1" id="SysModal">
177179 <div class="modal-dialog modal-lg modal-dialog-centered" role="document">
178180 <div class="modal-content">
Show on old repository browser