Jump to content
  • Sky
  • Blueberry
  • Slate
  • Blackcurrant
  • Watermelon
  • Strawberry
  • Orange
  • Banana
  • Apple
  • Emerald
  • Chocolate
  • Charcoal
Kmario19

[FIX] BBCode parse emoticones

Recommended Posts

Hola a todos les comparto rápidamente este par de fix a unos problemas que se han presentado desde la ultima actualización del bbcode usando ahora JBBCode, el problema es que al bbcode se parsea primero los emoticones y luego a html por lo que si, por ejemplo, un texto se presenta así:

 

[b]Instrucciones:[/b]

1. Descargar...

El parser primero realiza los emoticones, como el del vampiro que es :[ y por lo tanto rompe el bbcode para cerrar la etiqueta de negrita B y todo lo demás aparecerá en negrita, así mismo con cualquier otra etiqueta. Hago referencia a este topic publicado por @boltador:

Y otro topic más que no recuerdo pero había reportado @fem se puede apreciar en la demo que con un quote también se rompe el bbcode:

 

KuRnOh9.png

Entonces para solucionarlo básicamente trata de parsear primero todos los tags del bbocode y después, si es permitido, parsear los emoticones y menciones.

 

Para ello vamos al archivo inc/class/c.core.php y buscamos la función parseBBCode y la reemplazaremos por esta:

	function parseBBCode($bbcode, $type = 'normal', $smiles = true, $mentions = true) {
		// Class BBCode
		include_once(TS_EXTRA . 'bbcode.inc.php');
		$parser =& BBCode::getInstance();
		
		// Seleccionar texto
		$parser->setText($bbcode);

		// Seleccionar tipo
		switch ($type) {
			// NORMAL
			case 'normal':
				// BBCodes permitidos
				$parser->setRestriction(array('url', 'code', 'quote', 'font', 'size', 'color', 'img', 'b', 'i', 'u', 's', 'align', 'spoiler', 'swf', 'video', 'goear', 'hr', 'sub', 'sup', 'table', 'td', 'tr', 'ul', 'li', 'ol', 'notice', 'info', 'warning', 'error', 'success'));
				break;
			// FIRMA
			case 'firma':
				// BBCodes permitidos
				$parser->setRestriction(array('url', 'font', 'size', 'color', 'img', 'b', 'i', 'u', 's', 'align', 'spoiler'));
				break;
			// NOTICIAS
			case 'news':
				// BBCodes permitidos
				$parser->setRestriction(array('url', 'b', 'i', 'u', 's'));
				break;
			// SOLO SMILES (Esta opción se mantiene por compatibilidad con versiones anteriores, pero en su lugar se recomienda utilizar la opción "normal")
			case 'smiles':
				$parser->setRestriction(array('url', 'code', 'quote', 'quotePHPost', 'font', 'size', 'color', 'img', 'b', 'i', 'u', 'align', 'spoiler', 'swf', 'goear', 'hr', 'li'));
			break;
		}

		// HTML
		$html = $parser->getAsHtml();
		// SMILES
		if ($smiles) $html = $parser->parseSmiles();
		// MENCIONES
		if ($mentions) $html = $parser->parseMentions();

		// Retornar resultado
		return $html;
	}

Ahora en el archivo inc/ext/bbcode.inc.php buscar:

return nl2br($this->text);

Reemplazar por:

return $this->text = nl2br($this->text);

Mas abajo buscar:

$this->text = substr($this->text, 0, -1);

Reemplazar por:

return $this->text = substr($this->text, 0, -1);

Casi al final buscar:

$this->text = str_replace($bbcode, $html, $this->text);

Reemplazar por:

return $this->text = str_replace($bbcode, $html, $this->text);

Y listo con eso se arreglaría el problema. Ahora el segundo detalle es que la opción de "Sin Smileys" que tienen los posts, no funciona. Para solucionarlo ir al archivo inc/class/c.posts.php y buscar:

$tsCore->parseBBCode($postData['post_body'], 'firma')

Reemplazar por:

$tsCore->parseBBCode($postData['post_body'], 'normal', false)

Y con esto ya estaría funcionando la opción de NO parsear emoticones.

 

Les dejo algunas capturas:

 

Post:

KeQ5Pai.png

Antes:

whY3gjD.png

Ahora:

DeyVN8D.png

Sin emoticones:

kqe85Ud.png

Bueno, eso sería todo por este post. Dejen sus dudas, comentarios sugerencias. Ante cualquier problema no dudes en comentarlo, intentaré ayudarte lo más rápido  que pueda. Nos vemos en otro aporte, hasta entonces! 

  • Like 12

Share this post


Link to post
Share on other sites

Esta bueno, pero muchos pasos para mi, me quedo con mi método que deje en ese topic mencionado 3IXcv.gif igual +1

Share this post


Link to post
Share on other sites
hace 6 minutos, Rengo dijo:

Esta bueno, pero muchos pasos para mi, me quedo con mi método que deje en ese topic mencionado 3IXcv.gif igual +1

Jajaja no seas vago un :666: nunca parecerá un vampiro, mas bien un bicho satánico xD

Share this post


Link to post
Share on other sites

 

hace 5 horas, Kmario19 dijo:

 

hace 5 horas, Rengo dijo:

Esta bueno, pero muchos pasos para mi, me quedo con mi método que deje en ese topic mencionado 3IXcv.gif igual +1

Jajaja no seas vago un :666: nunca parecerá un vampiro, mas bien un bicho satánico xD

 

jajaja peor yo q solo agregué un espacio entre el :   y el  ]     :D    +1

Share this post


Link to post
Share on other sites

Gracias Kmario! No pensé que fueran tantos cambios para solucionarlo. Creo que lo había reportado en el ep 

Share this post


Link to post
Share on other sites

Buena Kmario19. He realizado los cambios y ahora todo ok. Lo que falta para que esté perfecto es que no los tome dentro de la etiqueta code u otras etiquetas de codigo.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By Solo_Duvan
      Hola amigos, me percate que los comentarios de los post no se pueden editar, les dejo un pequeño fix por si les molesta este problema.
       
      Vamos a funciones.js ubicado en themes/default/js y buscamos:
       
      var text = textarea.bbcode();  
      Lo reemplazamos con esto:

       
      var text = (type == 'new') ? textarea.bbcode() : textarea.val();  
      Listo, ahora podremos editar comentarios, espero les funciones. Saludos 😉
    • By Kmario19
      Hola a todos, soy Kmario19. Tal vez me recuerden de mods como la portada de los posts, o secciones como las de juegos y las comunidades. Esta vez vengo con un fix para aquellos sitios que tengan millones de visitas y la tabla w_visitas esté afectando la carga de un post ya que es la tabla que más registros genera.
       
      Junto a @Rengo estuvimos analizando por qué los posts cargaba tan lento, después de un rato noté que una consulta en particular era la culpable:
       
      db_exec(array(__FILE__, __LINE__), 'query', 'UPDATE `w_visitas` SET `date` = \''.time().'\', ip = \''.$tsCore->getIP().'\' WHERE `for` = \''.(int)$post_id.'\' && `type` = \'2\' && `user` = \''.$tsUser->uid.'\' LIMIT 1'); Esta línea está en c.posts.php en la función getPost. (esta consulta actualiza la fecha de visita del usuario logueado al post)
       
      El problema es que después de que el sitio tenga suficiente tiempo online o muchísimas visitas, esta tabla w_visitas llega a tener millones de registros y cuando una tabla así no está indexada tiende a hacer una consulta "FULL SCAN" por lo que básicamente tiene que recorrer todos los registros para poder finalizar su tarea, y en el caso del sitio de pruebas tiene más de 2 millones de registros.
       
      Entonces, para todos aquellos que quieran evitar este pequeño problema de rendimiento a futuro cuando tengan muchas visitas o si ya se les presenta el caso, la solución es ir a su base de datos y ejecutar la siguiente consulta:
       
      ALTER TABLE `w_visitas` ADD INDEX (`for`, `type`, `user`);  
      Y listo, eso soluciona el problema.
       
      Para que se hagan una idea de los resultados, esta es una consulta antes de agregar el indice:
       

       
      Y esta es la misma consulta después de agregar el índice:
       

       
      Estamos hablando de una absurda reducción de 91150% de acuerdo al tiempo de ejecución de MySQL pero realmente pasamos a un tiempo de carga del sitio de unos 6 segundos aprox. a menos de 1 segundo.
       
      Bueno, es un índice que debería ir por defecto en el .sql con el que se instala el script para evitar ese inconveniente a futuro. Seguramente algunas otras secciones críticas del script con el pasar del tiempo y vayan creciendo necesitarán de estos índices para mejorar los tiempos de consulta de la base de datos.
       
      Bueno no siendo más, me despido. Hasta otra ocasión... espero no tan tardía xD
    • By Miguel92
      Problemas al comentar y/o enviar mensaje 
      después de haber agregado el wysibb
       
      Si actualizaste y te has topado con este problema, bueno te traigo la solución.
       
      [1] SOLUCIONADO: No puedo comentar
      Ir a default/js/funciones.js y buscan
          // NUEVO COMENTARIO     nuevo: function(mostrar_resp, comentarionum){         // EVITAR FLOOD         $('#btnsComment').attr({'disabled':'disabled'});         //         var textarea = $('#body_comm');         var text = textarea.val(); y en la parte que dice .val(); lo cambian por .bbcode();
              var text = textarea.bbcode();  
      [2] SOLUCIONADO: No puedo previsualizar el comentario
      Ir a default/js/funciones.js y buscan
      // VISTA PREVIA DEL COMENTARIO     preview: function(id, type){         var textarea = (type == 'new') ? $('#' + id) : $('#edit-comment-' + id);         var text = textarea.val(); lo mismo que el paso anterior
              var text = (type == 'new') ? textarea.bbcode() : textarea.val(); // 26/09/2019 16/05/2018
      Con la nueva actualización del script phpost_1.3.0.000 tiene este problema, en el momento que lo estaba haciendo me había funcionado de la manera que esta publicado..luego tuve el error de no poder editar el comentario y la solución fue revertir este paso y de esa manera edita y previsualiza
       
       
      SOLUCIONADO: No puedo previsualizar el mensaje
      Ir a default/js/funciones.js y buscan
          // VISTA PREVIA DEL MENSAJE     previewms: function(id, type){         var textarea = (type == 'new') ? $('#' + id) : $('#edit-comment-' + id);         var text = textarea.val(); lo mismo que el paso anterior
              var text = textarea.bbcode();  
      [3] SOLUCIONADO: No puedo enviar mensaje desde "Mensajes"
      Ir a default/js/acciones.js y buscan
          // RESPONDER     responder: function(mp_id){         this.vars['mp_id'] = $('#mp_id').val();         this.vars['mp_body'] = encodeURIComponent($('#respuesta').val()); // Fix: 14/12/2014 - 1.1.000.9 lo mismo que el paso anterior  .val(); lo cambian por .bbcode();
              this.vars['mp_body'] = encodeURIComponent($('#respuesta').bbcode()); // Fix: 14/12/2014 - 1.1.000.9  
      En el caso de encontrar mas lo ire colocando!
    • By Tronlar
      Hola a [email protected],os dejo como hacer funcionar el sistema de captcha en las V5,V6,lo acabo de probar y funciona bien.
       
       
      Ejecutar esta consulta:
      ALTER TABLE `w_configuracion` ADD `pkey` VARCHAR(55) NOT NULL AFTER `offline_message`, ADD `skey` VARCHAR(55) NOT NULL AFTER `pkey`;  
      En c.admin.php --> inc/class/c.admin.php
       
      Buscar:
      'newr' => empty($_POST['newr']) ? 0 : 1);
      Cambiar por:
      'newr' => empty($_POST['newr']) ? 0 : 1, 'pkey' => $tsCore->setSecure($_POST['pkey']), 'skey' => $tsCore->setSecure($_POST['skey']),  
       
      Buscar:
      '\', `offline_message` = \'' . $c['offline_message'] .  
      Añadir al lado:
      '\', `pkey` = \'' . $c['pkey'] . '\', `skey` = \'' . $c['skey'] .
      Tiene que quedar así:
      '\', `offline_message` = \'' . $c['offline_message'] . '\', `pkey` = \'' . $c['pkey'] . '\', `skey` = \'' . $c['skey'] .  
       

      En c.registro.php --> inc/class/c.registro.php
       
      Buscar:
      'user_captacha_challenge' => $_POST['recaptcha_challenge_field'], 'user_captacha_response' => $_POST['recaptcha_response_field'],  
      Cambiar por:
      'user_captcha' => $_POST['g-recaptcha-response'],  
      Buscar:
      'captacha' => 'El código es incorrecto'
      Cambiar por:
      'captcha' => 'Validación incorrecta',  
       
      Buscar:
      // CAPTACHA require(TS_EXTRA . 'recaptchalib.php'); $robot = recaptcha_check_answer(RC_PIK,$_SERVER["REMOTE_ADDR"],$tsData['user_captacha_challenge'],$tsData['user_captacha_response']); if(!$robot->is_valid) return 'recaptcha: El código es incorrecto.';

      Cambiar por:        
      /** reCAPTCHA **/ $recaptcha = 'https://www.google.com/recaptcha/api/siteverify?secret=' . $tsCore->settings['skey'] . '&response=' . $tsData['user_captcha'] . '&remoteip=' . $tsCore->getIP(); // Obtener respuesta $response = file_get_contents($recaptcha); // Extraer resultado $ext1 = explode('"success":', $response); $ext2 = explode(',', $ext1[1]); // Comprobar resultado $valid = trim($ext2[0]); // Devolver respuesta si es incorrecta if ($valid == 'false') { return 'recaptcha: No hemos podido validar tu humanidad'; }  
       
      registro.js --> default/js/registro.js
      registro.js --> V6/js/registro.js
       
      Buscar:
      /* reCAPTCHA */ case 'recaptcha_challenge_field': return true; break; case 'recaptcha_response_field': //Si ya paso por aca y no hubieron cambios, devuelvo el mismo status if(!force_check && this.datos[campo] === value && this.datos['recaptcha_challenge_field'] == $('#RegistroForm .pasoDos #recaptcha_challenge_field').val()) if(this.datos_status[campo]=='empty') return no_empty ? this.show_status(el, this.datos_status[campo], this.datos_text[campo]) : this.hide_status(el, this.datos_status[campo], this.datos_text[campo]); else return this.show_status(el, this.datos_status[campo], this.datos_text[campo]); //Almaceno el dato this.datos[campo] = value; this.datos['recaptcha_challenge_field'] = $('#RegistroForm .pasoDos #recaptcha_challenge_field').val(); //!empty if(empty(value)){ var status = 'empty'; var text = 'El campo es requerido'; if(no_empty) return this.show_status(el, status, text); else return this.hide_status(el, status, text); } return registro.show_status(el, 'ok', 'OK'); break; } },  

      Cambiar por:    
      /* reCAPTCHA */ case 'g-recaptcha-response': this.datos[campo] = value; //!empty if (!value) { return this.show_status($('#RegistroForm .g-recaptcha'), 'empty', 'Demuestra que eres humano'); } return registro.show_status($('#RegistroForm .g-recaptcha'), 'ok', 'OK'); break; } },  
       
      Buscar:
      case 'recaptcha': //reCAPTCHA registro.change_paso(2, true); registro.show_status($('#RegistroForm #recaptcha_response_field'), 'error', h.substring(strpos(h, ':')+2)); break;
         
      Cambiar por:
      case 'recaptcha': //reCAPTCHA registro.change_paso(2, true); registro.show_status($('#RegistroForm .g-recaptcha'), 'error', h.substring(strpos(h, ':') + 2)); break;

      t.registro.tpl --> default/templates/t.registro.tpl
      t.registro.tpl --> V6/templates/t.registro.tpl    
          
       Buscar:
      <div class="form-line"> <label for="recaptcha_response_field">Ingresa el código de la imagen</label> <div id="recaptcha_ajax"> <div id="recaptcha_image"></div> <input type="text" id="recaptcha_response_field" name="recaptcha_response_field" /> </div> <div class="help recaptcha" id="nubex"><span id="puy"></span><span><em></em></span></div> </div>  

      Cambiar por:
      <div class="form-line"> <label>Confirme humanidad:</label> <div class="g-recaptcha" data-sitekey="{$tsConfig.pkey}"></div> <div class="help"><span><em></em></span></div> </div>
         
      Buscar:
      <script type="text/javascript"> // $.getScript("{$tsConfig.js}/registro.js{literal}", function(){ //Seteo el pais seleccionado //registro.datos['pais']='MX'; //registro.datos_status['pais']='ok'; //registro.datos_text['pais']='OK'; // registro.change_paso(1); //Genero el autocomplete de la ciudad /*$('#RegistroForm .pasoDos #ciudad').autocomplete('/registro-geo.php', { minChars: 2, width: 298 }).result(function(event, data, formatted){ registro.datos['ciudad_id'] = (data) ? data[1] : ''; registro.datos['ciudad_text'] = (data) ? data[0].toLowerCase() : ''; if(data) $('#RegistroForm .pasoDos #terminos').focus(); });*/ mydialog.procesando_fin(); }); //Load recaptcha $.getScript("http://www.google.com/recaptcha/api/js/recaptcha_ajax.js", function(){ Recaptcha.create('6LcXvL0SAAAAAPJkBrro96lnXGZ56TBRExEmVM3L', 'recaptcha_ajax', { theme:'custom', lang:'es', tabindex:'13', custom_theme_widget: 'recaptcha_ajax', callback: function(){ $('#recaptcha_response_field').blur(function(){ registro.blur(this); }).focus(function(){ registro.focus(this); }).attr('title', 'Ingrese el código de la imagen'); } }); }); </script>

      Cambiar por:       
      <script type="text/javascript"> // $.getScript("{$tsConfig.js}/registro.js{literal}", function(){ //Seteo el pais seleccionado //registro.datos['pais']='MX'; //registro.datos_status['pais']='ok'; //registro.datos_text['pais']='OK'; // registro.change_paso(1); //Genero el autocomplete de la ciudad /*$('#RegistroForm .pasoDos #ciudad').autocomplete('/registro-geo.php', { minChars: 2, width: 298 }).result(function(event, data, formatted){ registro.datos['ciudad_id'] = (data) ? data[1] : ''; registro.datos['ciudad_text'] = (data) ? data[0].toLowerCase() : ''; if(data) $('#RegistroForm .pasoDos #terminos').focus(); });*/ mydialog.procesando_fin(); }); </script> <script src="https://www.google.com/recaptcha/api.js" async defer></script> <script type="text/javascript"> $.getScript("{$tsConfig.js}/registro.js{literal}", function(){ registro.change_paso(1); mydialog.procesando_fin(); }); </script>

       m.admin_configs.tpl     --> default/templates/admin_mods/m.admin_configs.tpl            
       m.admin_configs.tpl     --> V6/templates/admin_mods/m.admin_configs.tpl    
              
      Buscar:   
      <dl> <dt><label for="ai_xat">Xat ID:</label><br /><span>Por defecto puedes agregar un chat de <a href="http://xat.com">Xat</a> para tu web, solo crea tu grupo he ingresa el nombre.</span></dt> <dd><input type="text" id="ai_xat" name="xat" maxlength="20" value="{$tsConfig.xat_id}" /> </dd> </dl> <hr />  

      Añadir debajo:
      <dl> <dt> <label for="pkey">reCaptcha pública</label> <br /><span>Clave pública de <a href="https://www.google.com/recaptcha/admin">reCatpcha</a>.</span> </dt> <dd> <input type="text" id="pkey" name="pkey" value="{$tsConfig.pkey}" /> </dd> </dl> <dl> <dt> <label for="skey">reCaptcha secreta</label> <br /><span>Clave privada de <a href="https://www.google.com/recaptcha/admin">reCatpcha</a>.</span> </dt> <dd> <input type="text" id="skey" name="skey" value="{$tsConfig.skey}" /> </dd> </dl> <hr />  
       
       
      Y con eso ya la tienen funcionando,saludos.


       
       
       
       
       

              
           
       
  • Recently Browsing   0 members

    No registered users viewing this page.

  • Patrocinador



  • ×