Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Correct tag matching in truncate #6394

Merged
merged 1 commit into from
Mar 16, 2015
Merged

Conversation

MarkRS-UK
Copy link
Contributor

String truncate doesn't correctly match closing html tags that contain numbers.
This change corrects this.
Fixes #6149


Truncated text from articles containing an html element with numerals (currently only "h"(eader) exists) and another html element whose closing tag is removed in the truncation, will produce invalid html.
This is because the regex in string.truncate fails to match closing tags with numerals.

Steps to reproduce the issue

Put text like <h1>Title</h1><p>Enough text to get truncated</p> at the beginning of an article that is then displayed with string.truncate.

Expected result

The html <h1>Title</h1><p>Partial text</p>... is produced

Actual result

The html <h1>Title</h1><p>Partial text</p></h1>... is produced.
This is invalid in that it produces a second, unmatched, closing h1 tag.

System information (as much as possible)

The incorrect code is in line 100 in /libraries/cms/html/string.php.
The match string is #</([a-z]+)>#iU when it should be #</([a-z][a-z0-9]*)>#iU
to match closing tags with numerals.
This renders correct html in the above example.
If we wanted to cover the case where a closing tag like </h1 > was being matched, the pattern should be #</([a-z][a-z0-9]*)\b(?:[^>]*?)>#iU

Additional comments

This error, of course, afflicts truncateComplex too, since it calls truncate.
This code is called anywhere where a short extract from html is displayed, six different views in core components (content, tags, finder, newsfeed).

String truncate doesn't correctly match closing html tags that contain numbers.
This change corrects this.
Fixes joomla#6149
@Hackwar
Copy link
Member

Hackwar commented Mar 11, 2015

Would you be able to extend the existing unittest testcases regarding this with an example?

@Bolzman
Copy link

Bolzman commented Mar 14, 2015

Tested without applying the patch. Hm, could not see any truncation. Second was not produced.


This comment was created with the J!Tracker Application at issues.joomla.org/joomla-cms/6394.

@Bolzman
Copy link

Bolzman commented Mar 14, 2015

edit ... Second < / h 1 > was not produced.


This comment was created with the J!Tracker Application at issues.joomla.org/joomla-cms/6394.

@FrankyDE
Copy link

I can not reproduce the bug, therefore I can not test the patch :-(
My Text:
I entered in CodeMirror editor:

Title

Enough text


to get truncated

as the normal TinyMCE will change the code that it is not testable for this bug. Maybe I misunderstand the bug, so maybe that is just because English is not my native language. In that case I am sorry.

@gorgonz
Copy link

gorgonz commented Mar 14, 2015

can't reproduce it with TinyMCE. Added code with Editor and as 2. try i switched to raw code
=> effect not seen

@Harmageddon
Copy link
Contributor

@FrankyDE @gorgonz
Try to insert the following in a .php file, e.g. the index.php of your template:

<?php echo JHtmlString::truncate("<h1>Header</h1> Lorem ipsum dolor sit amet blind text", 20); ?>

@test:
Patch solves the reported bug. Only missing thing would be a unit test as proposed by @Hackwar, but the patch itself works fine.


This comment was created with the J!Tracker Application at issues.joomla.org/joomla-cms/6394.

@ghost
Copy link

ghost commented Mar 15, 2015

@test Success

What means "unit tests"?

@Erftralle
Copy link
Contributor

@test: bug confirmed, patch tested succesfully.

@Harmageddon
Copy link
Contributor

@bertmert Unit tests are PHP programs that test other PHP functions to make sure that they produce the desired result. So for this one, we could need a test that makes sure that the truncate method returns correct results for a few different inputs.
See also: https://docs.joomla.org/Unit_Testing and https://docs.joomla.org/Category:Automated_Testing

@gorgonz
Copy link

gorgonz commented Mar 16, 2015

works!
added the mentioned code to the isis index.php
before:
=> wrong tag is there

after patch install
=> correct functionality of truncate()

undo patch
=> error is here again


This comment was created with the J!Tracker Application at issues.joomla.org/joomla-cms/6394.

wilsonge added a commit that referenced this pull request Mar 16, 2015
Correct tag matching in truncate
@wilsonge wilsonge merged commit efad14c into joomla:staging Mar 16, 2015
@wilsonge wilsonge added this to the Joomla! 3.4.1 milestone Mar 16, 2015
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

string.truncate fails to match closing tags with numerals
9 participants