Function: web-mode-point-context

web-mode-point-context is a natively compiled function defined in web-mode.el.

Signature

(web-mode-point-context POS)

Documentation

POS should be at the beginning of the indentation.

Source Code

;; Defined in /nix/store/2qgnz1rp30nzfz6w0apx4kdm14if1bbs-emacs-packages-deps/share/emacs/site-lisp/elpa/web-mode-20260831.219/web-mode.el
(defun web-mode-point-context (pos)
  "POS should be at the beginning of the indentation."
  (save-excursion
    (let (curr-char curr-indentation curr-line
                    language
                    options
                    reg-beg reg-col
                    prev-char prev-indentation prev-line prev-pos
                    token
                    part-language
                    depth)

      (setq reg-beg (point-min)
            reg-col 0
            token "live"
            options ""
            language ""
            prev-line ""
            prev-char 0
            prev-pos nil
            prev-line-end nil)

      (when (get-text-property pos 'part-side)
        (setq part-language (symbol-name (get-text-property pos 'part-side))))

      ;;(message "part-language=%S" part-language)

      (cond

        ((and (bobp) (member web-mode-content-type '("html" "xml")))
         (setq language web-mode-content-type)
         )

        ((string= web-mode-content-type "css")
         (setq language "css"
               curr-indentation web-mode-css-indent-offset))

        ((member web-mode-content-type '("javascript" "json" "typescript"))
         (setq language web-mode-content-type
               curr-indentation web-mode-code-indent-offset))

        ((or (string= web-mode-content-type "jsx")
             (and part-language (string= part-language "jsx")))
         (setq language "jsx"
               curr-indentation web-mode-code-indent-offset)
         (cond
           ((web-mode-jsx-is-html pos)
            (setq curr-indentation web-mode-markup-indent-offset
                  options "is-html"))
           ((and (setq depth (get-text-property pos 'jsx-depth)) (> depth 1))
            (when (get-text-property pos 'jsx-beg)
              (setq depth (1- depth)))
            (setq reg-beg (web-mode-jsx-depth-beginning-position pos depth))
            (setq reg-beg (1+ reg-beg))
            ;;(message "%S" (point))
            (save-excursion
              (goto-char reg-beg)
              ;;(message "pt=%S" reg-beg)
              (cond
                ((and (not (looking-at-p "[ ]*$"))
                      (looking-back "^[[:space:]]*{" (point-min)))
                 (setq reg-col (+ (current-indentation) ;; #1027
                                  (cond
                                    ((looking-at "[ ]+") (1+ (length (match-string-no-properties 0))))
                                    (t 0))
                                  ))
                 )
                ((looking-at-p "[ ]*\\[[ ]*$") ;; #0659
                 (setq reg-col (current-indentation))
                 )
                ((and (looking-back "=[ ]*{" (point-min)) ;; #0739 #1022
                      (not (looking-at-p "[[:space:]]*<")))
                 (setq reg-col (current-indentation))
                 )
                ;;((and (looking-back "=[ ]*{" (point-min)) ;; #0739
                ;;      (looking-at-p "{[ ]*"))
                ;; (setq reg-col (current-indentation))
                ;; )
                ((get-text-property (1- (point)) 'tag-beg)
                 ;;(message "point=%S" (point))
                 (setq reg-col (current-indentation))
                 )
                (t
                 (message "%S : %S %S" (point) (current-indentation) web-mode-code-indent-offset)
                 ;;(setq reg-col (+ (current-indentation) web-mode-code-indent-offset web-mode-jsx-expression-padding)))
                 (setq reg-col (+ (current-indentation) web-mode-code-indent-offset)))
                )

              ;;(message "%S %S %S" (point) (current-indentation) reg-col)
              ) ;save-excursion
            )
           ((string= web-mode-content-type "jsx")
            (setq reg-beg (point-min)))
           (t
            (setq reg-beg (or (web-mode-part-beginning-position pos) (point-min)))
            (save-excursion
              (goto-char reg-beg)
              (search-backward "<" nil t)
              (setq reg-col (current-column))
              ) ;save-excursion
            )
           ) ;cond
         ;;(message "jsx reg-beg=%S" reg-beg)
         ) ;jsx

        ((string= web-mode-content-type "php")
         (setq language "php"
               curr-indentation web-mode-code-indent-offset))

        ((or (string= web-mode-content-type "xml"))
         (setq language "xml"
               curr-indentation web-mode-markup-indent-offset))

        ;; TODO: est ce util ?
        ((and (get-text-property pos 'tag-beg)
              (get-text-property pos 'tag-name)
              ;;(not (get-text-property pos 'part-side))
              )
         (setq language "html"
               curr-indentation web-mode-markup-indent-offset))

        ((and (get-text-property pos 'block-side)
              (not (get-text-property pos 'block-beg)))

         (setq reg-beg (or (web-mode-block-beginning-position pos) (point-min)))
         (goto-char reg-beg)
         (setq reg-col (current-column))
         ;;(message "%S %S" reg-beg reg-col)
         (setq language web-mode-engine)
         (setq curr-indentation web-mode-code-indent-offset)

         (cond
           ((string= web-mode-engine "blade")
            (save-excursion
              (when (web-mode-rsf "{[{!]+[ ]*\\|@props[ ]*[(]") ;; #1318
                (setq reg-col (current-column))))
            (setq reg-beg (+ reg-beg 2))
            )
           ((string= web-mode-engine "razor")
            ;;(setq reg-beg (+ reg-beg 2))
            ;;(setq reg-col (current-column))
            )
           ;; tests/demo.chtml
           ((string= web-mode-engine "ctemplate")
            (save-excursion
              (when (web-mode-rsf "{{#?")
                (setq reg-col (current-column))))
            )
           ((string= web-mode-engine "dust")
            (save-excursion
              (when (web-mode-rsf "{@")
                (setq reg-col (current-column))))
            )
           ((string= web-mode-engine "svelte")
            (save-excursion
              (when (web-mode-rsf "{@")
                (setq reg-col (current-column))))
            )
           ((string= web-mode-engine "template-toolkit")
            (setq reg-beg (+ reg-beg 3)
                  reg-col (+ reg-col 3))
            )
           ((and (string= web-mode-engine "jsp")
                 (web-mode-looking-at "<%@" reg-beg))
            (save-excursion
              (goto-char reg-beg)
              (looking-at "<%@[ ]*[[:alpha:]]+[ ]+\\|</?[[:alpha:]]+[:.][[:alpha:]]+[ ]+")
              (goto-char (match-end 0))
              (setq reg-col (current-column))
              )
            )
           ((and (string= web-mode-engine "freemarker")
                 (web-mode-looking-at "<@\\|<%@\\|<[[:alpha:]]" reg-beg))
            (save-excursion
              (goto-char reg-beg)
              (looking-at "<@[[:alpha:].]+[ ]+\\|<%@[ ]*[[:alpha:]]+[ ]+\\|<[[:alpha:]]+:[[:alpha:]]+[ ]+")
              (goto-char (match-end 0))
              (setq reg-col (current-column))
              )
            )
           ) ;cond
         ) ;block-side

        ((and part-language (member part-language
                                    '("css" "javascript" "json" "sql" "markdown"
                                      "pug" "ruby" "sass" "stylus" "typescript")))
         (setq reg-beg (or (web-mode-part-beginning-position pos) (point-min)))
         (goto-char reg-beg)
         (if (and (string= web-mode-engine "mojolicious")
                  (looking-back "javascript begin" (point-min)))
             (search-backward "%" nil t)
             (search-backward "<" nil t))
         (setq reg-col (current-column))
         (setq language part-language)
         (cond
           ((string= language "css")
            (setq curr-indentation web-mode-css-indent-offset))
           ((string= language "sql")
            (setq curr-indentation web-mode-sql-indent-offset))
           ((string= language "markdown")
            (setq curr-indentation web-mode-code-indent-offset))
           ((string= language "pug")
            (setq curr-indentation web-mode-code-indent-offset))
           ((string= language "sass")
            (setq curr-indentation web-mode-code-indent-offset))
           ((string= language "stylus")
            (setq curr-indentation web-mode-code-indent-offset))
           ((string= language "ruby")
            (setq curr-indentation web-mode-code-indent-offset))
           ((string= language "typescript")
            (setq curr-indentation web-mode-code-indent-offset))
           (t
            (setq language "javascript"
                  curr-indentation web-mode-code-indent-offset))
           )
         ) ;part-side

        (t
         (setq language "html"
               curr-indentation web-mode-markup-indent-offset)
         )

        ) ;cond

      (cond
        ((or (and (> pos (point-min))
                  (eq (get-text-property pos 'part-token) 'comment)
                  (eq (get-text-property (1- pos) 'part-token) 'comment)
                  (progn
                    (setq reg-beg (previous-single-property-change pos 'part-token))
                    t))
             (and (> pos (point-min))
                  (eq (get-text-property pos 'block-token) 'comment)
                  (eq (get-text-property (1- pos) 'block-token) 'comment)
                  (progn
                    (setq reg-beg (previous-single-property-change pos 'block-token))
                    t))
             (and (> pos (point-min))
                  (eq (get-text-property pos 'tag-type) 'comment)
                  (not (get-text-property pos 'tag-beg))
                  (progn
                    (setq reg-beg (web-mode-tag-beginning-position pos))
                    t))
             )
         (setq token "comment"))
        ((or (and (> pos (point-min))
                  (member (get-text-property pos 'part-token)
                          '(string context key))
                  (member (get-text-property (1- pos) 'part-token)
                          '(string context key)))
             (and (eq (get-text-property pos 'block-token) 'string)
                  (eq (get-text-property (1- pos) 'block-token) 'string)))
         (setq token "string"))
        )

      (goto-char pos)
      (setq curr-line (web-mode-trim
                       (buffer-substring-no-properties
                        (line-beginning-position)
                        (line-end-position))))
      (setq curr-char (if (string= curr-line "") 0 (aref curr-line 0)))

      (when (or (member language '("php" "blade" "javascript" "typescript" "jsx" "razor" "css"))
                (and (member language '("html" "xml"))
                     (not (eq ?\< curr-char))))
        (let (prev)
          (cond
            ((member language '("html" "xml" "javascript" "typescript" "jsx" "css"))
             (when (setq prev (web-mode-part-previous-live-line reg-beg))
               (setq prev-line (nth 0 prev)
                     prev-indentation (nth 1 prev)
                     prev-pos (nth 2 prev)
                     prev-line-end (nth 3 prev))
               )
             )
            ((setq prev (web-mode-block-previous-live-line))
             (setq prev-line (nth 0 prev)
                   prev-indentation (nth 1 prev)
                   prev-pos (nth 2 prev)
                   prev-line-end (nth 3 prev))
             (setq prev-line (web-mode-clean-block-line prev-line)))
            ) ;cond
          ) ;let
        (when (>= (length prev-line) 1)
          (setq prev-char (aref prev-line (1- (length prev-line))))
          (setq prev-line (substring-no-properties prev-line))
          )
        )

      (cond
        ((not (member web-mode-content-type '("html" "xml")))
         )
        ((member language '("javascript" "typescript" "jsx" "ruby"))
         (setq reg-col (if web-mode-script-padding (+ reg-col web-mode-script-padding) 0)))
        ((member language '("css" "sql" "markdown" "pug" "sass" "stylus"))
         (setq reg-col (if web-mode-style-padding (+ reg-col web-mode-style-padding) 0)))
        ((not (member language '("html" "xml")))
         (setq reg-col
               (cond
                 ((not web-mode-block-padding) reg-col)
                 ((eq web-mode-block-padding -1) 0)
                 (t (+ reg-col web-mode-block-padding))
                 ) ;cond
               ) ;setq
         )
        )

      (list :curr-char curr-char
            :curr-indentation curr-indentation
            :curr-line curr-line
            :language language
            :options options
            :prev-char prev-char
            :prev-indentation prev-indentation
            :prev-line prev-line
            :prev-line-end prev-line-end
            :prev-pos prev-pos
            :reg-beg reg-beg
            :reg-col reg-col
            :token token)
      )))