Function: web-mode-scan-blocks
web-mode-scan-blocks is a natively compiled function defined in
web-mode.el.
Signature
(web-mode-scan-blocks REG-BEG REG-END)
Documentation
Identifies blocks (with block-side, block-beg, block-end text properties).
Source Code
;; Defined in /nix/store/2qgnz1rp30nzfz6w0apx4kdm14if1bbs-emacs-packages-deps/share/emacs/site-lisp/elpa/web-mode-20260831.219/web-mode.el
;;---- LEXER BLOCKS ------------------------------------------------------------
(defun web-mode-scan-blocks (reg-beg reg-end)
"Identifies blocks (with block-side, block-beg, block-end text properties)."
(save-excursion
(let ((i 0) open close closing-string sub1 sub2 pos tagopen tmp delim-open delim-close part-beg part-end tagclose)
(goto-char reg-beg)
;;(message "%S: %Sx%S" (point) reg-beg reg-end)
;;(message "regexp=%S" web-mode-block-regexp)
(while (and (< i 2000)
(> reg-end (point))
web-mode-block-regexp
(re-search-forward web-mode-block-regexp reg-end t)
(not (eobp)))
(setq i (1+ i)
closing-string nil
close nil
tagopen (match-string 0)
open (match-beginning 0)
delim-open nil
delim-close nil
pos nil)
(let ((l (length tagopen)))
(when (member (string-to-char tagopen) '(?\s ?\t))
(setq tagopen (replace-regexp-in-string "\\`[ \t]*" "" tagopen))
(setq open (+ open (- l (length tagopen))))
(setq l (length tagopen))
)
(setq sub1 (substring tagopen 0 1)
sub2 (substring tagopen 0 (if (>= l 2) 2 1)))
)
;;(message " found block #(%S) at pos=(%S), part-type=(%S)" i open (get-text-property open 'part-side))
(cond
((string= web-mode-engine "php")
(unless (member (char-after) '(?x ?X))
(setq closing-string '("<\\?". "\\?>")))
(cond
((looking-at-p "<?php")
(setq delim-open "<?php")
(setq delim-close "?>"))
((eq (char-after) ?\=)
(setq delim-open "<?=")
(setq delim-close "?>"))
(t
(setq delim-open "<?")
(setq delim-close "?>"))
) ;cond
) ;php
((string= web-mode-engine "erb")
(cond
((string= sub2 "<%")
(setq closing-string '("<%". "%>")
delim-open "<%\\(==\\|[=-]\\)?"
delim-close "[-]?%>"))
(t
(setq closing-string "EOL"
delim-open "%"))
)
) ;erb
((string= web-mode-engine "django")
(cond
((string= sub2 "{{")
(setq closing-string "EODQ"
;;(setq closing-string '("{{" . "}}")
delim-open "{{"
delim-close "}}"))
((string= sub2 "{%")
(setq closing-string "%}"
delim-open "{%[+-]?"
delim-close "[-]?%}"))
((string= sub2 "{#")
(setq closing-string "#}"))
(t
(setq closing-string "EOL"
delim-open "#[#]?"))
)
) ;django
((string= web-mode-engine "anki")
(setq closing-string "}}"
delim-open "{{[#/^]?"
delim-close "}}")
) ;anki
((string= web-mode-engine "ejs")
(setq closing-string "%>"
delim-open "<%[=-]?"
delim-close "[-]?%>")
) ;ejs
((string= web-mode-engine "lsp")
(setq closing-string "%>"
delim-open "<%[%#]?"
delim-close "%>")
) ;lsp
((string= web-mode-engine "mako")
(cond
((and (string= tagopen "<%")
(member (char-after) '(?\s ?\n ?\!)))
(setq closing-string "%>"
delim-open "<%[!]?"
delim-close "%>"))
((member sub2 '("<%" "</"))
(setq closing-string ">"
delim-open "</?%"
delim-close "/?>"))
((string= sub2 "${")
(setq closing-string "}"
delim-open "${"
delim-close "}"))
(t
(setq closing-string "EOL"
delim-open "%"))
)
) ;mako
((string= web-mode-engine "cl-emb")
(cond
((string= tagopen "<%#")
(setq closing-string "#%>"))
((string= sub2 "<%")
(setq closing-string "%>"
delim-open "<%[=%]?"
delim-close "%>"))
)
) ;cl-emb
((string= web-mode-engine "artanis")
(cond
((string= tagopen "<%;")
(setq closing-string "%>"))
((string= tagopen "<%#|")
(setq closing-string "|#%>"))
((string= sub2 "<@")
(setq closing-string "%>"
delim-open "<@\\(css\\|icon\\|include\\|js\\)"
delim-close "%>"))
((string= sub2 "<%")
(setq closing-string "%>"
delim-open "<%[=]?"
delim-close "%>"))
)
) ;artanis
((string= web-mode-engine "elixir")
(cond
((member (char-after) '(?\#))
(setq closing-string "%>"))
(t
(setq closing-string "%>"
delim-open "<%[=%]?"
delim-close "%>"))
)
) ;elixir
((string= web-mode-engine "mojolicious")
(cond
((string= tagopen "<%#")
(setq closing-string "%>"))
((string= sub2 "<%")
(setq closing-string "%>"
delim-open "<%\\(==\\|[=%]\\)?"
delim-close "%>"))
((string= sub2 "%#")
(setq closing-string "EOL"))
(t
(setq closing-string "EOL"
delim-open "%\\(==\\|[=%]\\)?"))
)
) ;mojolicious
((string= web-mode-engine "ctemplate")
(cond
((member tagopen '("{{{" "{{~"))
(setq closing-string "}~?}}"
delim-open "{{~?{"
delim-close "}~?}}")
)
((string= tagopen "{~{")
(setq closing-string "}~?}"
delim-open "{~{"
delim-close "}~?}")
)
((string= tagopen "{{!")
(setq closing-string (if (looking-at-p "--") "--}}" "}}"))
)
((string= sub2 "{{")
(setq closing-string "}~?}"
delim-open "{{[>#/%^&]?"
delim-close "}~?}"))
(t
(setq closing-string "}}"
delim-open "${{"
delim-close "}}"))
)
) ;ctemplate
((string= web-mode-engine "antlers")
(cond
((string= tagopen "{{$")
(setq closing-string "$}}"
delim-open "{{$"
delim-close "$}}")
)
((string= tagopen "{{?")
(setq closing-string "?}}"
delim-open "{{?"
delim-close "?}}")
)
((string= tagopen "{{$")
(setq closing-string "$}}"
delim-open "{{$"
delim-close "$}}")
)
((string= sub2 "{{")
(setq closing-string "}}"
delim-open "{{"
delim-close "}}"))
)
) ;antlers
((string= web-mode-engine "astro")
(cond
((string= tagopen "---")
(setq closing-string "---"
delim-open "---"
delim-close "---")
)
)
) ;astro
((string= web-mode-engine "aspx")
(setq closing-string "%>"
delim-open "<%[:=#@$]?"
delim-close "%>")
) ;aspx
((string= web-mode-engine "asp")
(cond
((string= sub2 "<%")
(setq closing-string "%>"
delim-open "<%[:=#@$]?"
delim-close "%>"))
(t
(setq closing-string ">"
delim-open "</?"
delim-close "/?>"))
)
) ;asp
((string= web-mode-engine "jsp")
(cond
((looking-at-p "--")
(setq closing-string "--%>"))
((string= sub2 "<%")
(setq closing-string "%>"
delim-open "<%\\([!=@]\\|#=\\)?"
delim-close "[-]?%>"))
((string= sub2 "${")
(setq closing-string "}"
delim-open "${"
delim-close "}"))
)
) ;jsp
((string= web-mode-engine "clip")
(setq closing-string ">"
delim-open "</?"
delim-close "/?>")
) ;clip
((string= web-mode-engine "perl")
(setq closing-string ">"
delim-open "</?"
delim-close "/?>")
) ;perl
((string= web-mode-engine "blade")
(cond
((string= tagopen "{{-")
(setq closing-string "--}}"))
((string= tagopen "{!!")
(setq closing-string "!!}"
delim-open "{!!"
delim-close "!!}"))
((string= tagopen "@{{")
(setq closing-string nil))
((string= tagopen "{{{")
(setq closing-string "}}}"
delim-open "{{{"
delim-close "}}}"))
((string= sub2 "{{")
(setq closing-string "}}"
delim-open "{{"
delim-close "}}"))
((looking-at-p "[[:alnum:]]+\\.[[:alpha:]]+")
)
((string= sub1 "@")
(setq closing-string "EOB"
delim-open "@"))
((looking-at-p "[[:alnum:]]+(")
(setq closing-string ")"
delim-open "@"))
)
;;(message "closing-string=%S delim-open=%S delim-close=%S" closing-string delim-open delim-close)
) ;blade
((string= web-mode-engine "smarty")
(cond
((string= tagopen "{*")
(setq closing-string "*}")
)
((string= tagopen "{#")
(setq closing-string "#}"
delim-open "{#"
delim-close "#}")
)
(t
(setq closing-string (cons "{" "}")
delim-open "{/?"
delim-close "}")
) ;t
) ;cond
) ;smarty
((string= web-mode-engine "hero")
(setq closing-string "%>"
delim-open "<%==?\\([biufsv]\\|bs\\)?\\|<%[:~@+!]?"
delim-close "%>")
) ;hero
((string= web-mode-engine "xoops")
(cond
((string= tagopen "<{*")
(setq closing-string "*}>")
)
((string= tagopen "<{#")
(setq closing-string "#}>"
delim-open "<{#"
delim-close "#}>")
)
(t
(setq closing-string (cons "<{" "}>")
delim-open "<{/?"
delim-close "}>")
) ;t
) ;cond
) ;xoops
((string= web-mode-engine "web2py")
(setq closing-string "}}"
delim-open "{{[=]?"
delim-close "}}")
) ;web2py
((string= web-mode-engine "expressionengine")
(cond
((string= sub2 "{!--")
(setq closing-string "--}"))
(t
(setq closing-string '("{". "}")
delim-open "{/?"
delim-close "}")
)
)
) ;expressionengine
((string= web-mode-engine "dust")
(cond
((string= sub2 "{!")
(setq closing-string "!}"))
(t
(setq closing-string '("{". "}")
delim-open "{[#/:?@><+^]?"
delim-close "/?}")
)
)
) ;dust
((string= web-mode-engine "svelte")
(cond
((string= sub2 "{!")
(setq closing-string "!}"))
((string= sub2 "{}")
(setq closing-string nil
delim-open nil
delim-close nil))
(t
(setq closing-string '("{". "}")
delim-open "{[#/:?@><+^]?"
delim-close "/?}")
)
)
) ;svelte
((string= web-mode-engine "closure")
(cond
((string= sub2 "//")
(setq closing-string "EOL")
)
((string= sub2 "/*")
(setq closing-string "*/")
)
(t
(setq closing-string "}"
delim-open "{/?"
delim-close "/?}")
)
)
) ;closure
((string= web-mode-engine "go")
(setq closing-string "}}"
delim-open "{{-?"
delim-close "-?}}")
) ;go
((string= web-mode-engine "angular")
(setq closing-string "}}"
delim-open "{{"
delim-close "}}")
) ;angular
((string= web-mode-engine "vue")
(cond
((string-match-p "[:@][-[:alpha:].]+=\"" tagopen)
(setq closing-string "\""
delim-open tagopen
delim-close "\""))
((string= tagopen "{{")
(setq closing-string "}}"
delim-open "{{"
delim-close "}}")))
) ;vue
((string= web-mode-engine "mason")
(cond
((and (member sub2 '("<%" "</"))
(looking-at "[[:alpha:]]+"))
(if (member (match-string-no-properties 0) '("after" "around" "augment" "before" "def" "filter" "method" "override"))
(setq closing-string ">"
delim-open "<[/]?%"
delim-close ">")
(setq closing-string (concat "</%" (match-string-no-properties 0) ">")
delim-open "<[^>]+>"
delim-close "<[^>]+>")
) ;if
)
((and (string= sub2 "<%")
(eq (char-after) ?\s))
(setq closing-string "%>"
delim-open "<%"
delim-close "%>"))
((string= tagopen "</&")
(setq closing-string ">"
delim-open "</&"
delim-close ">")
)
((string= sub2 "<&")
(setq closing-string "&>"
delim-open "<&[|]?"
delim-close "&>"))
(t
(setq closing-string "EOL"
delim-open "%"))
)
) ;mason
((string= web-mode-engine "underscore")
(setq closing-string "%>"
delim-open "<%"
delim-close "%>")
) ;underscore
((string= web-mode-engine "template-toolkit")
(cond
((string= tagopen "%%#")
(setq closing-string "EOL"))
((string= tagopen "[%#")
(setq closing-string "%]"))
(t
(setq closing-string "%]"
delim-open "\\[%[-+]?"
delim-close "[-=+]?%\\]"))
)
) ;template-toolkit
((string= web-mode-engine "freemarker")
(cond
((and (string= sub2 "<#") (eq (char-after) ?\-))
(setq closing-string "-->"))
((string= sub1 "<")
(setq closing-string ">"
delim-open "</?[#@]"
delim-close "/?>"))
((string= sub1 "[")
(setq closing-string "]"
delim-open "\\[/?[#@]"
delim-close "/?\\]"))
(t
(setq closing-string "}"
delim-open "${"
delim-close "}"))
)
) ;freemarker
((string= web-mode-engine "velocity")
(cond
((string= sub2 "##")
(setq closing-string "EOL"))
((string= sub2 "#*")
(setq closing-string "*#"))
(t
(setq closing-string "EOV"
delim-open "#"))
)
) ;velocity
((string= web-mode-engine "razor")
(cond
((string= sub2 "@@")
(forward-char 2)
(setq closing-string nil))
((string= sub2 "@*")
(setq closing-string "*@"))
((string= sub1 "@")
(setq closing-string "EOR"
delim-open "@"))
((and (string= sub1 "}")
(looking-at-p "[ ]*\n"))
;;(setq closing-string "EOC")
(save-excursion
(let (paren-pos)
(setq paren-pos (web-mode-part-opening-paren-position (1- (point))))
(if (and paren-pos (get-text-property paren-pos 'block-side))
(setq closing-string "EOC")
(setq closing-string nil)
) ;if
) ;let
) ;save-excursion
;;(message "%s %S %S" sub2 (point) (get-text-property (point) 'part-side))
)
((string= sub1 "}")
;;(message "%s: %s" (point) sub1)
(save-excursion
(let (paren-pos)
(setq paren-pos (web-mode-part-opening-paren-position (1- (point))))
(if (and paren-pos (get-text-property paren-pos 'block-side))
(setq closing-string "EOR")
(setq closing-string nil)
) ;if
) ;let
) ;save-excursion
) ;case }
) ;cond
) ;razor
((and (string= web-mode-engine "riot")
(not (get-text-property open 'part-side)))
(setq closing-string (if (string= tagopen "{") "}" "/// end script")
delim-open "{"
delim-close "}")
) ;riot
((string= web-mode-engine "spip")
(cond
((and (string= sub1 "#")
(looking-at "[A-Z0-9_]+"))
(setq closing-string (match-string-no-properties 0)))
((string= sub1 "(")
(setq closing-string '("(" . ")")))
((string= sub1 "{")
(setq closing-string '("{" . "}")))
((string= sub2 "<:")
(setq closing-string ":>"))
(t
(setq closing-string "]"))
))
((string= web-mode-engine "marko")
(setq closing-string "}"
delim-open "${"
delim-close "}")
) ;marko
) ;cond
(when closing-string
(cond
((listp closing-string)
(cond
((web-mode-rsf-balanced (car closing-string) (cdr closing-string) reg-end t)
(setq close (match-end 0)
pos (point))
)
((and (string= web-mode-engine "php")
(string= "<?" sub2))
(if (or (text-property-not-all (1+ open) (point-max) 'tag-beg nil)
(text-property-not-all (1+ open) (point-max) 'block-beg nil)
(looking-at-p "[ \t\n]*<"))
(setq close nil
delim-close nil
pos (point))
(setq close (point-max)
delim-close nil
pos (point-max))
) ;if
) ;case
) ;cond
) ;case listp
((and (string= web-mode-engine "smarty")
(string= closing-string "}"))
(goto-char open)
(setq tmp (web-mode-closing-delimiter-position
"}"
(point)
(line-end-position)))
(if tmp
(setq tmp (1+ tmp))
(setq tmp (line-end-position)))
(goto-char tmp)
(setq close (point)
pos (point))
)
((and (member web-mode-engine '("closure"))
(string= closing-string "}"))
(when (web-mode-closure-skip reg-beg reg-end)
(setq close (point)
pos (point))
;;(message "close=%S pos=%S" close pos)
) ;when
)
((string= closing-string "EOB")
(web-mode-blade-skip open)
(setq close (point)
pos (point)))
((string= closing-string "EOL")
(end-of-line)
(setq close (point)
pos (point)))
((string= closing-string "EOC")
(setq close (point)
pos (point)))
((string= closing-string "EODQ")
(when (web-mode-django-skip reg-beg reg-end)
(setq close (point)
pos (point))
))
((string= closing-string "EOR")
(web-mode-razor-skip open)
(setq close (if (> (point) reg-end) reg-end (point))
pos (if (> (point) reg-end) reg-end (point)))
(goto-char pos))
((string= closing-string "EOV")
(web-mode-velocity-skip open)
(setq close (point)
pos (point)))
((and (member web-mode-engine '("ctemplate"))
(re-search-forward closing-string reg-end t))
(setq close (match-end 0)
pos (point)))
((and (member web-mode-engine '("antlers"))
(re-search-forward closing-string reg-end t))
(setq close (match-end 0)
pos (point)))
((and (member web-mode-engine '("astro"))
(re-search-forward closing-string reg-end t))
(setq close (match-end 0)
pos (point)))
((search-forward closing-string reg-end t)
(setq close (match-end 0)
pos (point)))
) ;cond
(when (and close (>= reg-end pos))
;;(message "pos(%S) : open(%S) close(%S)" pos open close)
(put-text-property open (1+ open) 'block-beg 0)
(put-text-property open (1+ open) 'block-controls 0)
(put-text-property open close 'block-side t)
(put-text-property (1- close) close 'block-end t)
(when delim-open
(web-mode-block-delimiters-set open close delim-open delim-close))
(web-mode-block-scan open close)
(cond
((and (string= web-mode-engine "erb")
(looking-at-p "<%= javascript_tag do %>"))
(setq tagopen "<%= javascript_tag do %>"))
((and (string= web-mode-engine "mojolicious")
(looking-at-p "%= javascript begin"))
(setq tagopen "%= javascript begin"))
((and (string= web-mode-engine "mako")
(looking-at-p "<%block filter=\"collect_js\">"))
(setq tagopen "<%block filter=\"collect_js\">"))
((and (string= web-mode-engine "mako")
(looking-at-p "<%block filter=\"collect_css\">"))
(setq tagopen "<%block filter=\"collect_css\">"))
((and (string= web-mode-engine "django")
(looking-at-p "{% javascript %}"))
(setq tagopen "{% javascript %}"))
((and (string= web-mode-engine "django")
(looking-at-p "{% schema %}"))
(setq tagopen "{% schema %}"))
((and (string= web-mode-engine "django")
(looking-at-p "{% stylesheet %}"))
(setq tagopen "{% stylesheet %}"))
)
;;(message "%S %s" (point) tagopen)
(when (and (member tagopen '("<r:script" "<r:style"
"<c:js" "<c:css"
"<%= javascript_tag do %>"
"<%block filter=\"collect_js\">"
"<%block filter=\"collect_css\">"
"{% javascript %}"
"{% schema %}"
"{% stylesheet %}"
"%= javascript begin"
"---"))
(setq part-beg close)
(setq tagclose
(cond
((string= tagopen "<r:script") "</r:script")
((string= tagopen "<r:style") "</r:style")
((string= tagopen "<c:js") "</c:js")
((string= tagopen "<c:css") "</c:css")
((string= tagopen "{% javascript %}") "{% endjavascript %}")
((string= tagopen "{% schema %}") "{% endschema %}")
((string= tagopen "{% stylesheet %}") "{% endstylesheet %}")
((string= tagopen "%= javascript begin") "% end")
((string= tagopen "---") "---")
((string= tagopen "<%= javascript_tag do %>") "<% end %>")
((member tagopen '("<%block filter=\"collect_js\">"
"<%block filter=\"collect_css\">")) "</%block")
))
(web-mode-sf tagclose)
(setq part-end (match-beginning 0))
(> part-end part-beg))
;;(message "tagopen=%S tagclose=%S end=%S" tagopen tagclose (point))
(put-text-property part-beg part-end
'part-side
(cond
((member tagopen '("<r:style" "<c:css" "<%block filter=\"collect_css\">" "{% stylesheet %}")) 'css)
(t 'javascript)))
(setq pos part-beg
part-beg nil
part-end nil)
) ;when
) ;when close
(if pos (goto-char pos))
) ;when closing-string
) ;while
(cond
((>= i 2000)
(message "scan-blocks ** warning (%S) **" i))
((string= web-mode-engine "razor")
(web-mode-block-foreach reg-beg reg-end 'web-mode-block-scan))
((string= web-mode-engine "django")
(web-mode-scan-engine-comments reg-beg reg-end
"{% comment %}" "{% endcomment %}"))
((string= web-mode-engine "mako")
(web-mode-scan-engine-comments reg-beg reg-end
"<%doc>" "</%doc>"))
((string= web-mode-engine "mason")
(web-mode-scan-engine-comments reg-beg reg-end
"<%doc>" "</%doc>"))
) ;cond
)))