Opened 4 years ago
Last modified 2 months ago
#32849 assigned Bug
ManifestStaticFilesStorage newline breaks regex
| Reported by: | TZanke | Owned by: | blighj |
|---|---|---|---|
| Component: | contrib.staticfiles | Version: | 3.2 |
| Severity: | Normal | Keywords: | |
| Cc: | Triage Stage: | Accepted | |
| Has patch: | yes | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | yes |
| Easy pickings: | no | UI/UX: | no |
Description
Hello,
I am trying to use the ManifestStaticFilesStorage static file handling. Right now i found a possible issue with line breaks.
The file in which strings should be replaced is loaded as a string with line breaks:
https://github.com/django/django/blob/main/django/contrib/staticfiles/storage.py#L315
The default regex may not have this issue, default_template = """url("%(url)s")""" cause a minifier will not break inside this url() method.
https://github.com/django/django/blob/main/django/contrib/staticfiles/storage.py#L45
But in my case a more complex string with URL has to be replaced, so currently the string sometimes contains a line break.
The line break now is not matched against the regex which leads to a caching problem.
Expample:
CKEditor4: https://cdn.ckeditor.com/4.16.1/standard/ckeditor.js
Search for "styles/tableselection.css"
First occurrence is split by line break.
My regex: (appendStyleSheet\(this\.path\+"([^'"]*?)"\))
Regex with newline support: (appendStyleSheet\(this\s?\.\s?path\s?\+\s?"([^'"]*?)"\))
Question:
Who is responsible for possible line breaks?
Maybe Django should load the content without line breaks?
Or has the developer/user of ManifestStaticFilesStorage a responsibility to care for possible line breaks in his regexes?
But: Maybe he (the developer) does not know this can happen. Later on, someone else changes the JS code => minifyer adds linebreaks => production => regex mismatch => caching problem
Let me know whats your opinion.
Best regards
Tobias
Change History (8)
follow-up: 2 comment:1 by , 4 years ago
| Triage Stage: | Unreviewed → Accepted |
|---|
comment:2 by , 4 years ago
Replying to Carlton Gibson:
(Can we always strip
\nin JS without loss? [...])
Possibly not, due to the rules around Automatic Semi-colon Insertion (similar to how white-space is sort-of significant in HTML). I'd presume any/all minifiers do explicit insertion in such cases to avoid affecting the intended output...
comment:3 by , 7 months ago
| Owner: | changed from to |
|---|---|
| Status: | new → assigned |
comment:4 by , 7 months ago
| Has patch: | set |
|---|
comment:5 by , 7 months ago
Patch available via Pull Request #19322 – fixes newline handling in ManifestStaticFilesStorage.
comment:6 by , 6 months ago
| Patch needs improvement: | set |
|---|
comment:7 by , 3 months ago
This package I've been working on and hoping to get feedback on, takes care of this ticket as it is no longer using regex's to parse import/export statements https://github.com/blighj/django-manifeststaticfiles-enhanced
comment:8 by , 2 months ago
| Owner: | changed from to |
|---|
This https://github.com/django/django/pull/19561 PR for #21080 will make this ticket obsolete.
Hi Tobias. Thanks for the report.
I'm not 100% sure, but let's provisionally Accept to see what a PR looks like.
If you can reduce that CKEditor example to a minimum case, that would help.
(Can we always strip
\nin JS without loss? — minifiers often output on one line, no? 🤔)