Opened 3 years ago

Last modified 3 years ago

#32849 new Bug

ManifestStaticFilesStorage newline breaks regex

Reported by: TZanke Owned by: nobody
Component: contrib.staticfiles Version: 3.2
Severity: Normal Keywords:
Cc: Triage Stage: Accepted
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
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 (2)

comment:1 by Carlton Gibson, 3 years ago

Triage Stage: UnreviewedAccepted

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 \n in JS without loss? — minifiers often output on one line, no? 🤔)

in reply to:  1 comment:2 by Keryn Knight, 3 years ago

Replying to Carlton Gibson:

(Can we always strip \n in 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...

Note: See TracTickets for help on using tickets.
Back to Top