Jim Baker has been working on tagged strings, and Guido has a working implementation. See https://github.com/jimbaker/tagstr/issues/1
I thought Jim had a draft PEP on this somewhere, but I can’t find it. -- Eric > On Dec 17, 2022, at 11:14 AM, e...@emilstenstrom.se wrote: > > Hi everyone! > > I'm the maintainer of a small django library called django-components. I've > run into a problem that I have a language-level solution (tagged strings) to, > that I think would benefit the wider python community. > > *Problem* > A component in my library is a combination of python code, html, css and > javascript. Currently I glue things together with a python file, where you > put the paths to the html, css and javascript. When run, it brings all of the > files together into a component. But for small components, having to juggle > four different files around is cumbersome, so I've started to look for a way > to put everything related to the component _in the same file_. This makes it > much easier to work on, understand, and with fewer places to make path errors. > > Example: > class Calendar(component.Component): > template_string = '<span class="calendar"></span>' > css_string = '.calendar { background: pink }' > js_string = 'document.getElementsByClassName("calendar)[0].onclick = > function() { alert("click!") }' > > Seems simple enough, right? The problem is: There's no syntax highlighting in > my code editor for the three other languages. This makes for a horrible > developer experience, where you constantly have to hunt for characters inside > of strings. You saw the missing quote in js_string right? :) > > If I instead use separate files, I get syntax highlighting and > auto-completion for each file, because editors set language based on file > type. But should I really have to choose? > > *Do we need a python language solution to this?* > Could the code editors fix this? There's a long issue thread for vscode where > this is discussed: https://github.com/Microsoft/vscode/issues/1751 - The > reasoning (reasonable imho) is that this is not something that can be done > generally, but that it needs to be handled at the python vscode extension > level. Makes sense. > > Could the vscode language extension fix this? Well, the language extension > has no way to know what language it should highlight. If a string is HTML or > CSS. PyCharm has decided to use a "special python comment" # language=html > that makes the next string be highlighted in that language. > > So if just all editors could standardize on that comment, everything would > work? I guess so, but is that really the most intuitive API to standardize > around? If the next statement is not a string, what happens? If the comment > is on the same line as another statement, does it affect that line, or the > next? What if there's a newline in between the comment in the string, does > that work? > > *Suggested solution* > I suggest supporting _tagged strings_ in python. They would look like > html'<span class="calendar"></span>'. > * Python should not hold a list of which tagged strings it should support, it > should be possible to use any tag. > * To avoid clashes with current raw strings and unicode strings, a tag should > be required to be at least 2 characters long (I'm open to other ways to avoid > this). > > I like this syntax because: > 1. It's clear what string the tag is affecting. > 2. It makes sense when you read it, even though you've never seen the syntax > before. > 3. It clearly communicates which language to highlight to code editors, since > you can use the language identifiers that already exist: > https://code.visualstudio.com/docs/languages/identifiers#_known-language-identifiers > - for single letter languages, which are not supported to avoid clash with > raw strings and unicode strings, the language extension would have to support > "r-lang" and "c-lang" instead. > 4. It mimics the syntax of tagged string templates in javascript > (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals#tagged_templates). > So it has som precedent. > > (If desirable, I think mimicing javascript further and making tagged strings > call a function with the tag's name, would be a great addition to Python too. > This would make the syntax for parsing foreign languages much nicer. But this > is not required for my specific problem, it's just a nice next possible step > for this feature.) > > *Backwards compatibility* > This syntax currently raises a invalid syntax error. So introducing this > shouldn't break existing programs. Python's currently supported string types > are just single letter, so the suggestion is to require tagged strings to be > at least two letters. > > *Feedback?* > What are your thoughts on this? Do you see a value in adding tagged strings > to python? Are there other use-cases where this would be useful? Does the > suggestion need to support calling tags as functions like in javascript to be > interesting? > > (I'm new to python-ideas, so I hope I haven't broken some unspoken rule with > this suggestion.) > > -- > Emil Stenström > _______________________________________________ > Python-ideas mailing list -- python-ideas@python.org > To unsubscribe send an email to python-ideas-le...@python.org > https://mail.python.org/mailman3/lists/python-ideas.python.org/ > Message archived at > https://mail.python.org/archives/list/python-ideas@python.org/message/OXHQHMV2JC2PY7K63VNIMSTP5T46LPKT/ > Code of Conduct: http://python.org/psf/codeofconduct/
_______________________________________________ Python-ideas mailing list -- python-ideas@python.org To unsubscribe send an email to python-ideas-le...@python.org https://mail.python.org/mailman3/lists/python-ideas.python.org/ Message archived at https://mail.python.org/archives/list/python-ideas@python.org/message/EBCW3OQNASEIRNDETTDWCQYKWWNZXZY5/ Code of Conduct: http://python.org/psf/codeofconduct/