all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: Akira Kyle <akira@akirakyle.com>
To: "T.V Raman" <raman@google.com>
Cc: emacs-devel@gnu.org
Subject: Re: Introducing emacs-webkit and more thoughts on Emacs rendering (was Rethinking the design of xwidgets)
Date: Sun, 22 Nov 2020 20:44:16 -0700	[thread overview]
Message-ID: <86eekkohyn.fsf@akirakyle.com> (raw)
In-Reply-To: <p917dqc6gtb.fsf@google.com>


On Sun, Nov 22, 2020 at 05:46 PM, T.V Raman <raman@google.com> 
wrote:

> Doing the manipulation with injected jSON would be fin e bye me.
>
> I did look at parenscript in the context of nyxt,
> and it looks interesting, but I dont have anything religious  re 
> the
> shape of delimiters I use to write code :-)
>
> My interest stems primarily from wanting to speak Web content
> intelligently and EWW gets me a lot of that, except where Web 
> Content
> is dynamically generated from JS and  given that, I'm looking to 
> get
> Webkit to build the DOM, and give it to me in a form that I can 
> query
> it, manipulate it, and finally speak the relevant bits.

Here's a proof of concept of that. Don't try it on any large or 
complicated page as it'll grind Emacs to a halt trying to do the 
parsing. 

(setq webkit--to-json-js "
function toJSON(node) {
  let propFix = { for: 'htmlFor', class: 'className' };
  let specialGetters = {
    style: (node) => node.style.cssText,
  };
  let attrDefaultValues = { style: '' };
  let obj = {
    nodeType: node.nodeType,
  };
  if (node.tagName) {
    obj.tagName = node.tagName.toLowerCase();
  } else if (node.nodeName) {
    obj.nodeName = node.nodeName;
  }
  if (node.nodeValue) {
    obj.nodeValue = node.nodeValue;
  }
  let attrs = node.attributes;
  if (attrs) {
    let defaultValues = new Map();
    for (let i = 0; i < attrs.length; i++) {
      let name = attrs[i].nodeName;
      defaultValues.set(name, attrDefaultValues[name]);
    }
    // Add some special cases that might not be included by 
    enumerating
    // attributes above. Note: this list is probably not 
    exhaustive.
    switch (obj.tagName) {
      case 'input': {
        if (node.type === 'checkbox' || node.type === 'radio') {
          defaultValues.set('checked', false);
        } else if (node.type !== 'file') {
          // Don't store the value for a file input.
          defaultValues.set('value', '');
        }
        break;
      }
      case 'option': {
        defaultValues.set('selected', false);
        break;
      }
      case 'textarea': {
        defaultValues.set('value', '');
        break;
      }
    }
    let arr = [];
    for (let [name, defaultValue] of defaultValues) {
      let propName = propFix[name] || name;
      let specialGetter = specialGetters[propName];
      let value = specialGetter ? specialGetter(node) : 
      node[propName];
      if (value !== defaultValue) {
        arr.push([name, value]);
      }
    }
    if (arr.length) {
      obj.attributes = arr;
    }
  }
  let childNodes = node.childNodes;
  // Don't process children for a textarea since we used `value` 
  above.
  if (obj.tagName !== 'textarea' && childNodes && 
  childNodes.length) {
    let arr = (obj.childNodes = []);
    for (let i = 0; i < childNodes.length; i++) {
      arr[i] = toJSON(childNodes[i]);
    }
  }
  return obj;
}
toJSON(document);
")

(defun webkit--save-json (msg)
  (setq webkit--json (json-parse-string msg)))

(webkit--execute-js
 (with-current-buffer (car webkit--buffers) webkit--id)
 webkit--to-json-js "webkit--save-json")


I think through this general framework one could more efficiently 
extract the parts of the DOM one is interested in rather than 
dumping it all into elisp like I did above.



  reply	other threads:[~2020-11-23  3:44 UTC|newest]

Thread overview: 225+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-10-12 20:58 Rethinking the design of xwidgets Akira Kyle
2020-10-12 22:18 ` joakim
2020-10-13 16:07   ` Akira Kyle
2020-10-13 19:06     ` joakim
2020-10-14  0:33       ` Akira Kyle
2020-10-13 13:36 ` Stefan Monnier
2020-10-13 16:09   ` Akira Kyle
2020-10-13 14:16 ` Eli Zaretskii
2020-10-13 17:05   ` Akira Kyle
2020-10-13 17:24     ` Qiantan Hong
2020-10-13 18:29       ` Akira Kyle
2020-10-13 18:44         ` Qiantan Hong
2020-10-13 19:17           ` Eli Zaretskii
2020-10-13 20:52           ` Akira Kyle
2020-10-14 14:36             ` Eli Zaretskii
2020-10-14 17:01               ` Stefan Monnier
2020-10-15 19:55                 ` arthur miller
2020-10-13 18:45         ` Eli Zaretskii
2020-10-13 21:00           ` Akira Kyle
2020-10-14 14:44             ` Eli Zaretskii
2020-10-15  0:35               ` Akira Kyle
2020-10-15  2:07                 ` Stefan Monnier
2020-10-15  3:35                   ` arthur miller
2020-10-15 15:06                     ` Eli Zaretskii
2020-10-15 15:20                       ` Arthur Miller
2020-10-15 15:48                         ` Eli Zaretskii
2020-10-13 17:55     ` Eli Zaretskii
2020-10-13 18:42       ` Basil L. Contovounesios
2020-10-13 19:10         ` Eli Zaretskii
2020-10-13 20:37       ` Akira Kyle
2020-10-14 14:33         ` Eli Zaretskii
2020-10-14 15:04           ` Arthur Miller
2020-10-14 15:32             ` Eli Zaretskii
2020-10-15 13:20               ` Arthur Miller
2020-10-17  4:26                 ` Kai Ma
2020-10-17  4:42                   ` Qiantan Hong
2020-11-14  5:40                   ` Richard Stallman
2020-10-14 16:53             ` Stefan Monnier
2020-10-14 18:56               ` Aiko Kyle
2020-10-15 12:48                 ` Arthur Miller
2020-10-15 16:25                   ` Akira Kyle
2020-10-15 12:35               ` Arthur Miller
2020-10-16  4:02             ` Richard Stallman
2020-10-16 13:03               ` Arthur Miller
2020-10-16 18:38                 ` Dmitry Gutov
2020-10-17  4:19                   ` Richard Stallman
2020-10-17  4:21                 ` Richard Stallman
2020-10-17  6:30                   ` Arthur Miller
2020-10-17 13:35                     ` Stefan Monnier
2020-10-17 19:15                       ` Arthur Miller
2020-10-19  3:44                         ` Richard Stallman
2020-10-18  4:17                     ` Richard Stallman
2020-10-18  4:17                     ` Richard Stallman
2020-10-18  9:31                       ` Dmitry Gutov
2020-10-19  3:44                         ` Richard Stallman
2020-10-19 12:37                           ` Dmitry Gutov
2020-10-19 13:43                             ` Arthur Miller
2020-10-20  5:13                               ` Richard Stallman
2020-10-20  5:47                                 ` Arthur Miller
2020-10-20 12:58                                   ` Stefan Monnier
2020-10-20 13:40                                     ` Arthur Miller
2020-10-21  4:42                                       ` Richard Stallman
2020-10-21 12:25                                         ` Arthur Miller
2020-10-21  4:46                                   ` Richard Stallman
2020-10-20  5:14                             ` Richard Stallman
2020-10-20  5:56                               ` Arthur Miller
2020-10-20 10:45                                 ` Dmitry Gutov
2020-10-20 13:49                                   ` Arthur Miller
2020-10-20 20:11                                     ` Jean Louis
2020-10-20 23:25                                       ` Sv: " arthur miller
2020-10-21  8:10                                         ` Jean Louis
2020-10-21 11:59                                           ` Arthur Miller
2020-10-21 12:58                                             ` Hardware respecting your freedom Jean Louis
2020-10-22  2:53                                               ` Arthur Miller
2020-10-22  7:08                                                 ` Jean Louis
2020-10-23  3:40                                                 ` Richard Stallman
2020-10-23 12:53                                                   ` Arthur Miller
2020-10-23 15:15                                                     ` Pankaj Jangid
2020-10-24  3:49                                                     ` Richard Stallman
2020-10-24  6:02                                                       ` Jean Louis
2020-10-24 15:00                                                       ` Arthur Miller
2020-10-25  3:54                                                         ` Richard Stallman
2020-10-21  4:46                                 ` Rethinking the design of xwidgets Richard Stallman
2020-10-19 13:34                           ` Arthur Miller
2020-10-19 14:04                           ` Stefan Monnier
2020-10-20  5:13                             ` Richard Stallman
2020-10-18 14:41                       ` Arthur Miller
2020-10-19  3:48                         ` Richard Stallman
2020-10-19 13:48                           ` Arthur Miller
2020-10-16 14:54               ` Dmitry Gutov
2020-10-14 18:07           ` Akira Kyle
2020-10-14 18:32             ` Eli Zaretskii
2020-10-14 19:10               ` Akira Kyle
2020-10-13 18:36     ` Tomas Hlavaty
2020-10-13 18:38       ` Tomas Hlavaty
2020-10-13 21:20       ` Aiko Kyle
2020-10-14  0:12         ` Corwin Brust
2020-10-14 19:16           ` Akira Kyle
2020-10-14  7:32         ` Tomas Hlavaty
2020-10-14 15:02           ` Eli Zaretskii
2020-10-14 16:35             ` Tomas Hlavaty
2020-10-14 19:22               ` Akira Kyle
2020-10-14 21:29                 ` Tomas Hlavaty
2020-10-16  4:02                 ` Richard Stallman
2020-10-16 13:09                   ` Arthur Miller
2020-10-14 19:24     ` Mingde (Matthew) Zeng
2020-10-14 21:46       ` Akira Kyle
2020-10-15  5:17         ` Mingde (Matthew) Zeng
2020-10-14  4:38 ` Richard Stallman
2020-10-14  6:36   ` Akira Kyle
2020-11-22  3:35 ` Introducing emacs-webkit and more thoughts on Emacs rendering (was Rethinking the design of xwidgets) Akira Kyle
2020-11-22 12:01   ` Jean Louis
2020-11-22 12:04   ` Jean Louis
2020-11-22 12:18     ` tomas
2020-11-22 12:57       ` Jean Louis
2020-11-22 16:24         ` tomas
2020-11-22 17:18           ` Jean Louis
2020-11-22 17:48             ` tomas
2020-11-22 18:40             ` Akira Kyle
2020-11-22 19:58               ` Jean Louis
2020-11-22 20:29                 ` Akira Kyle
2020-11-22 20:38                   ` Jean Louis
2020-11-22 15:27     ` Arthur Miller
2020-11-22 12:50   ` Jean Louis
2020-11-22 18:33     ` Akira Kyle
2020-11-22 18:04   ` Eli Zaretskii
2020-11-22 18:46     ` Akira Kyle
2020-11-22 21:20       ` Vasilij Schneidermann
2020-11-22 22:04         ` Akira Kyle
2020-11-22 18:29   ` T.V Raman
2020-11-22 18:53     ` Akira Kyle
2020-11-22 19:35       ` T.V Raman
2020-11-22 20:26         ` Akira Kyle
2020-11-23  0:46           ` T.V Raman
2020-11-23  3:44             ` Akira Kyle [this message]
2020-11-23  3:01       ` T.V Raman
2020-11-23  3:47         ` Akira Kyle
2020-11-23 16:29           ` Jose A. Ortega Ruiz
2020-11-23  9:39   ` Lars Ingebrigtsen
2020-11-23 13:26     ` joakim
2020-11-24  6:21       ` Lars Ingebrigtsen
2020-11-23 14:59     ` Arthur Miller
2020-11-23 23:47       ` Alan Third
2020-11-24  3:58         ` Akira Kyle
2020-11-24  8:06         ` Arthur Miller
2020-11-24  5:51       ` Richard Stallman
2020-11-24  6:24         ` Lars Ingebrigtsen
2020-11-26  4:49           ` Richard Stallman
2020-11-26  5:25             ` Arthur Miller
2020-11-26  8:27               ` tomas
2020-11-26 14:55                 ` Arthur Miller
2020-11-26 19:11                 ` Tomas Hlavaty
2020-11-26 19:34                   ` arthur miller
2020-11-27  8:04                     ` Tomas Hlavaty
2020-11-27  8:44                       ` Arthur Miller
2020-11-27 13:35                     ` Richard Stallman
2020-11-27 19:22                       ` Arthur Miller
2020-11-27 20:01                         ` Eli Zaretskii
2020-11-27 21:22                           ` Arthur Miller
2020-11-27 20:07                         ` Stefan Monnier
2020-11-27 21:09                           ` Arthur Miller
2020-11-27 21:35                             ` Stefan Monnier
2020-11-27 23:23                               ` Arthur Miller
2020-11-28  0:28                                 ` Stefan Monnier
2020-11-28  8:48                                   ` Arthur Miller
2020-11-27 21:22                           ` Akira Kyle
2020-11-28  7:31                             ` Eli Zaretskii
2020-11-28  5:55                         ` Richard Stallman
2020-11-28  8:50                           ` Arthur Miller
2020-11-29  5:24               ` Richard Stallman
2020-11-24  7:50         ` Arthur Miller
2020-11-24  8:47           ` tomas
2020-11-24  9:04             ` Arthur Miller
2020-11-25  5:38               ` Richard Stallman
2020-11-25  8:46                 ` tomas
2020-11-25 15:26                 ` Arthur Miller
2020-11-25 16:15                   ` Eric S Fraga
2020-11-24 15:43             ` T.V Raman
2020-11-25  5:38             ` Richard Stallman
2020-11-25  8:54               ` tomas
2020-11-24  6:23       ` Lars Ingebrigtsen
2020-11-24  3:33     ` Akira Kyle
2020-11-24  6:27       ` Lars Ingebrigtsen
2020-11-25  1:36         ` Akira Kyle
2020-11-25 15:11           ` Eli Zaretskii
2020-11-27 20:56             ` Akira Kyle
2020-11-28  8:38               ` Eli Zaretskii
2020-11-28  8:57                 ` Arthur Miller
2020-11-28  9:19                   ` Eli Zaretskii
2020-11-29  0:22                     ` Arthur Miller
2020-11-29  1:29                 ` Akira Kyle
2020-11-29  8:22                   ` martin rudalics
2020-11-29 19:01                   ` Eli Zaretskii
2020-11-30  3:54                     ` Akira Kyle
2020-11-30 15:39                       ` Eli Zaretskii
2020-11-30 17:03                         ` Akira Kyle
2020-11-30 18:11                           ` Eli Zaretskii
2020-11-30 18:30                             ` Akira Kyle
2020-12-01  7:44                           ` Tomas Hlavaty
2020-12-03  0:24                             ` Akira Kyle
2020-12-03  8:07                               ` Tomas Hlavaty
2020-12-03 20:34                                 ` Arthur Miller
2020-12-03 20:53                                 ` Stefan Monnier
2020-12-01  8:01                       ` Tomas Hlavaty
2020-12-01 15:36                         ` Arthur Miller
2020-12-01 16:48                           ` Tomas Hlavaty
2020-12-01 15:58                         ` Eli Zaretskii
2020-12-01 17:33                           ` Tomas Hlavaty
2020-12-01 19:41                             ` Eli Zaretskii
2020-12-02 20:37                               ` Tomas Hlavaty
2020-12-03 14:39                                 ` Eli Zaretskii
2020-12-03 21:02                                   ` Tomas Hlavaty
2020-12-04  7:48                                     ` Eli Zaretskii
2020-12-03  0:37                         ` Akira Kyle
2020-12-03  8:15                           ` Tomas Hlavaty
2020-12-03 15:13                             ` Eli Zaretskii
2020-12-03 21:15                               ` Tomas Hlavaty
2020-12-04  8:00                                 ` Eli Zaretskii
2020-11-30  9:05                     ` martin rudalics
2020-11-30 16:10                       ` Eli Zaretskii
2020-11-23 22:12   ` Alexander Adolf
2020-11-24  1:30     ` T.V Raman
2020-11-24  8:13       ` Arthur Miller
2020-11-24  3:51     ` Akira Kyle
  -- strict thread matches above, loose matches on Subject: below --
2020-12-02  2:58 arthur miller

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=86eekkohyn.fsf@akirakyle.com \
    --to=akira@akirakyle.com \
    --cc=emacs-devel@gnu.org \
    --cc=raman@google.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.