{"id":16762425,"url":"https://github.com/tlack/qqq","last_synced_at":"2025-10-28T21:11:51.549Z","repository":{"id":32333576,"uuid":"35908960","full_name":"tlack/qqq","owner":"tlack","description":"www toolkit for q","archived":false,"fork":false,"pushed_at":"2015-07-15T20:47:32.000Z","size":156,"stargazers_count":2,"open_issues_count":0,"forks_count":2,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-01-22T22:25:23.580Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tlack.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2015-05-19T21:16:02.000Z","updated_at":"2019-09-13T01:02:03.000Z","dependencies_parsed_at":"2022-09-12T19:12:58.895Z","dependency_job_id":null,"html_url":"https://github.com/tlack/qqq","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tlack%2Fqqq","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tlack%2Fqqq/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tlack%2Fqqq/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tlack%2Fqqq/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tlack","download_url":"https://codeload.github.com/tlack/qqq/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243853617,"owners_count":20358451,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-13T04:44:43.726Z","updated_at":"2025-10-28T21:11:46.520Z","avatar_url":"https://github.com/tlack.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"qqq.q: www toolkit for q\n========================\n\nThis is a toolkit of useful functions for those creating websites with Q and Kdb+.\n\nThis is not a framework and you don't have to use all of it. Feel free to mix this\nwith (.h)[http://code.kx.com/wiki/Doth), (.z.ph)[http://code.kx.com/wiki/Reference/dotzdotph],\netc. \n\nIncluded is an experimental approach to transforming Q data into an HTML tree structure. I've\nalso been experimenting with transmitting the raw Q data structures to the client via \n(.z.ws)[http://code.kx.com/wiki/Reference/dotzdotws] and (Kx's own c.js)[http://kx.com/q/c/c.js], \nthen creating DOM elements using the excellent (https://github.com/Matt-Esch/virtual-dom]. This\napproach has a lot of promise in terms of performance, expressivity, and productivity.\n\nStatus\n------\n\nHandy for my personal use, but not ready for prime time. Caveat emptor.\n\nUsage\n-----\n\nAs a URL parser:\n\nTo extract handy data from the passed-in data to .z.ph:\n\n```\n\\l qqq/qqq.q\n.z.ph:{.qqq.parsereq[x]; otherstuff[]}\n```\n\nServer-side DOM tree:\n\n```\n\\l qqq/qqq.q\n.z.ph:{.qqq.divv[\"Welcome to my humble website!\"]}\n```\n\nCopyright\n---------\n\nMIT License. (c) Copyright 2015 @tlack \n\nOLD Notes/thinking/observations\n-------------------------------\n\nThe following may be out of date:\n\nExample single pager:\n\n```\nsave: {reggedat:.z.P;\n\t`users insert (x.name;reggedat);\n\tdiv[`banner;\"Welcome, you are user #\",(string count users),\"!\"]\n}\ndiv (`banner;\"Please login\")\nitext (`name; (`blur`placeholder)!(save;\"Enter your username\"))\n.qqq.boot[]\n```\n\nIt outputs:\n\n```html\n\u003cheader-stuff/\u003e\n\u003cscript src=\"qqq.js\"\u003e\u003c/script\u003e\n\u003cinput type=\"text\" name=\"name\" id=\"qqq-name\" \n\tplaceholder=\"Enter your username\"\u003e\n\u003cscript\u003e\nqqq.bind('name')\n\u003c/script\u003e\n\u003cother-content/\u003e\n\u003cscript\u003e\n// and later:\nqqq.boot()\n\u003c/script\u003e\n```\n\nNeed to figure out\n------------------\n\nHow do we namespace \"components\" so I can compose pieces of the page into\na single unit, as a kind of programmatic \"atomic design\"?\n\nTODO\n----\n\nEverything\n\nFlexible calling syntax\n-----------------------\n\nThis allows us to get around the fact that Q doesn't allow optional arguments;\nuse a list as the argument list.\n\n```\nfunc:{x[0] + x[1]}\nfunc(1;2) = func[(1;2)]\n```\n\nHandlers on elements\n--------------------\n\nLet's try a pub-sub system based on Q symbol names - this can be tied easily to\nQ variables or functions.\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftlack%2Fqqq","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftlack%2Fqqq","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftlack%2Fqqq/lists"}