From 495445b5e96d94dda18090a9b6f43a7b5dfe8885 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Sat, 1 Nov 2025 00:39:48 +0000 Subject: [PATCH] Fix: Handle parentheses in author names in RTL/LTR linter The `BOOK_ITEM_RE` regex in `scripts/rtl_ltr_linter.py` did not correctly parse author names containing parentheses. This change updates the regex to correctly capture the author and metadata, even when the author's name includes parentheses. --- .../__pycache__/rtl_ltr_linter.cpython-312.pyc | Bin 0 -> 21669 bytes scripts/rtl_ltr_linter.py | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 scripts/__pycache__/rtl_ltr_linter.cpython-312.pyc diff --git a/scripts/__pycache__/rtl_ltr_linter.cpython-312.pyc b/scripts/__pycache__/rtl_ltr_linter.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2452784f03e31d63fafb83d23a9983e24c4fd586 GIT binary patch literal 21669 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%0AN*nu-K+u6D9)v~JjbML)A*ZH_{_u^a2 z+E`=9+$p%yS{(C+RiWj;nn8Wc_X@3+Z@?(JX&*{;2S#d_Ta*zvH7E z(4(&5)mq!a@sGMc>UdHEOrPX|22awt`VM~W7|-Qyi(49_md2Q+Id0h-wd`G-_}p@M z)toKeqT*tnBC<|6fYW{y1;`+{bTx^v1%uKf3%!m66?@@!j3g z-QAJb--iD!cGVTzJru1PdX~Y#>}OvoYeGAMJzlvhTDfbnd!_Qos?f4n6%}^PXX8y# zRlKk)b!{njJLmDQrMdHy}ad%7pPfbJLlJXhL`&%+pZe{osE znF`i4T7%^=K2y;>(>*KRAG`rIR(ZQhCGZ+#lTix_tO`q@7)GL|2k%3=j;p0#n2GX2@Q^oY%HcDFXNi$_ZQojAzAfW1Uc9~cmQ zgJAW44v@;O@XzVjaY|~D$l3JWrWU9A{W=!f#5M*NrzH(jK_4aKl#EdoGkvCs9RNMv z+e@cFB~o)F+UTY0R3QCQ=lQlX2-ix#*walhQ<6mQ&Qd}lGs@0F9FCBs-3b^{_#rzI zsc^xJLvXcBcw9%MpW+1=A?Md41%-J23tcX+Log?w`4i6Y6E26Png5B~_9U&D&wFx} z&*X3MYh|3dWLml#oC!uscEoa8r%ae&YSx-Yqu=>dt21kmoy}P*W_KzfD~Fe)?}xt^ zj^&+>aAwStoZ{(gcSmPNBgO5@=l`<*2mP_^3saeRky|#Kd%xsf$y|5LvTZ6GuvH*) zzF1xh)z07wgxT}=FWQ^Y8=n_O;tOPG_19KGYWfSeNk+yTI>sC5%k}2aSYJ#{d8T literal 0 HcmV?d00001 diff --git a/scripts/rtl_ltr_linter.py b/scripts/rtl_ltr_linter.py index 8c990c9717467..bd8c93427c894 100644 --- a/scripts/rtl_ltr_linter.py +++ b/scripts/rtl_ltr_linter.py @@ -94,8 +94,8 @@ def is_rtl_filename(path): # Example: Book Title - Author (Metadata) BOOK_ITEM_RE = re.compile( r"^\s*\[(?P.+?)\]\((?P<url>.+?)\)" # Title and URL (required) - r"(?:\s*[-–—]\s*(?P<author>[^\(\n\[]+?))?" # Author (optional), separated by -, –, — - r"(?:\s*[\(\[](?P<meta>.*?)[\)\]])?\s*$" # Metadata (optional), enclosed in parentheses () or [] + r"(?:\s*[-–—]\s*(?P<author>.*?))?" # Author (optional), separated by -, –, — + r"(?:\s*[\(\[](?P<meta>[^\]\)]*)[\)\]])?\s*$" # Metadata (optional), enclosed in parentheses () or [] ) # Regex to find the dir="rtl" or dir="ltr" attribute in an HTML tag