{"spec_id":"qrcode-basic","library":"bokeh","language":"python","code":"\"\"\" anyplot.ai\nqrcode-basic: Basic QR Code Generator\nLibrary: bokeh 3.9.1 | Python 3.13.14\nQuality: 88/100 | Updated: 2026-06-24\n\"\"\"\n\nimport os\nimport sys\n\n\n# Prevent self-import: this file is named bokeh.py, which shadows the installed\n# bokeh package when its directory sits at the front of sys.path.\n_this_dir = os.path.dirname(os.path.abspath(__file__))\nsys.path = [p for p in sys.path if os.path.abspath(p or \".\") != _this_dir]\n\nimport time\nfrom pathlib import Path\n\nimport numpy as np\nimport qrcode\nfrom bokeh.io import output_file, save\nfrom bokeh.models import ColumnDataSource, HoverTool, Label\nfrom bokeh.plotting import figure\nfrom selenium import webdriver\nfrom selenium.webdriver.chrome.options import Options\n\n\n# Theme tokens\nTHEME = os.getenv(\"ANYPLOT_THEME\", \"light\")\nPAGE_BG = \"#FAF8F1\" if THEME == \"light\" else \"#1A1A17\"\nELEVATED_BG = \"#FFFDF6\" if THEME == \"light\" else \"#242420\"\nINK = \"#1A1A17\" if THEME == \"light\" else \"#F0EFE8\"\nINK_SOFT = \"#4A4A44\" if THEME == \"light\" else \"#B8B7B0\"\n\n# Imprint palette — region color assignments for educational color-coding\nFINDER_COLOR = \"#009E73\"  # brand green — distinctive corner markers\nTIMING_COLOR = \"#4467A3\"  # blue — timing grid lines\nALIGN_COLOR = \"#C475FD\"  # lavender — alignment patterns\nDATA_COLOR = \"#1A1A17\"  # near-black — always dark for scannability\n\n# Data — real, scannable QR code encoding a URL\ncontent = \"https://anyplot.ai\"\nqr = qrcode.QRCode(version=None, error_correction=qrcode.constants.ERROR_CORRECT_M, box_size=1, border=0)\nqr.add_data(content)\nqr.make(fit=True)\n\nqr_matrix = np.array(qr.get_matrix(), dtype=bool)\nsize = qr_matrix.shape[0]\nquiet_zone = 4\nfinder_size = 7\n\n# Region classification — flat sets for O(1) lookup per module\nfinder_cells = set()\nfor r in range(finder_size):\n    for c in range(finder_size):\n        finder_cells.add((r, c))\n        finder_cells.add((r, size - finder_size + c))\n        finder_cells.add((size - finder_size + r, c))\n\ntiming_cells = set()\nfor i in range(finder_size, size - finder_size):\n    timing_cells.add((6, i))\n    timing_cells.add((i, 6))\n\nalignment_cells = set()\nalignment_pos = qrcode.util.pattern_position(qr.version)\nfor ar in alignment_pos:\n    for ac in alignment_pos:\n        in_tl = ar <= finder_size + 1 and ac <= finder_size + 1\n        in_tr = ar <= finder_size + 1 and ac >= size - finder_size - 2\n        in_bl = ar >= size - finder_size - 2 and ac <= finder_size + 1\n        if not (in_tl or in_tr or in_bl):\n            for dr in range(-2, 3):\n                for dc in range(-2, 3):\n                    alignment_cells.add((ar + dr, ac + dc))\n\nregion_color_map = {\"Finder\": FINDER_COLOR, \"Timing\": TIMING_COLOR, \"Alignment\": ALIGN_COLOR, \"Data\": DATA_COLOR}\n\nmod_x, mod_y, mod_region, mod_color = [], [], [], []\nfor row in range(size):\n    for col in range(size):\n        if qr_matrix[row, col]:\n            if (row, col) in finder_cells:\n                reg = \"Finder\"\n            elif (row, col) in timing_cells:\n                reg = \"Timing\"\n            elif (row, col) in alignment_cells:\n                reg = \"Alignment\"\n            else:\n                reg = \"Data\"\n            mod_x.append(col + quiet_zone + 0.5)\n            mod_y.append(size - row - 1 + quiet_zone + 0.5)\n            mod_region.append(reg)\n            mod_color.append(region_color_map[reg])\n\nsource = ColumnDataSource(data={\"x\": mod_x, \"y\": mod_y, \"region\": mod_region, \"color\": mod_color})\n\ntotal_size = size + 2 * quiet_zone\n\n# Title — compute fontsize scaled to character length\ntitle = \"qrcode-basic · python · bokeh · anyplot.ai\"\nn = len(title)\nratio = 67 / n if n > 67 else 1.0\ntitle_fontsize = max(34, round(50 * ratio))\n\n# Plot — 2400×2400 square canvas (canonical size for square/symmetric plots)\np = figure(\n    width=2400,\n    height=2400,\n    title=title,\n    x_range=(-0.5, total_size + 0.5),\n    y_range=(-2.5, total_size + 0.5),\n    tools=\"\",\n    toolbar_location=None,\n    min_border_bottom=80,\n    min_border_left=50,\n    min_border_top=110,\n    min_border_right=50,\n)\n\n# QR area: near-white (#FAF8F1) inner background — scannable and Imprint-palette-compliant\np.background_fill_color = \"#FAF8F1\"\np.border_fill_color = PAGE_BG\np.outline_line_color = None\n\np.xaxis.visible = False\np.yaxis.visible = False\np.xgrid.visible = False\np.ygrid.visible = False\n\n# Title\np.title.text_font_size = f\"{title_fontsize}pt\"\np.title.align = \"center\"\np.title.text_color = INK\np.title.text_font_style = \"normal\"\np.title.offset = 10\n\n# Style — QR modules colored by structural region\nrenderer = p.rect(x=\"x\", y=\"y\", width=1, height=1, source=source, fill_color=\"color\", line_color=None)\n\n# HoverTool — Bokeh's interactive advantage for QR region exploration\nhover = HoverTool(renderers=[renderer], tooltips=[(\"Region\", \"@region\")], mode=\"mouse\")\np.add_tools(hover)\n\n# Footer metadata — compact, two-line\np.add_layout(\n    Label(\n        x=total_size / 2,\n        y=-0.5,\n        text=f\"Encoded: {content}\",\n        text_font_size=\"26pt\",\n        text_color=\"#4A4A44\",  # always dark — footer renders on near-white QR background\n        text_font=\"monospace\",\n        text_align=\"center\",\n    )\n)\np.add_layout(\n    Label(\n        x=total_size / 2,\n        y=-1.9,\n        text=f\"Version {qr.version} ({size}×{size} modules) · Error Correction M (15%)\",\n        text_font_size=\"20pt\",\n        text_color=\"#4A4A44\",  # always dark — footer renders on near-white QR background\n        text_align=\"center\",\n    )\n)\n\n# Save interactive HTML\noutput_file(f\"plot-{THEME}.html\", title=\"QR Code · anyplot.ai\")\nsave(p)\n\n# Screenshot via headless Chrome — add height buffer for browser viewport offset\nW, H = 2400, 2400\nWIN_H = H + 150\nopts = Options()\nfor arg in (\n    \"--headless=new\",\n    \"--no-sandbox\",\n    \"--disable-dev-shm-usage\",\n    \"--disable-gpu\",\n    f\"--window-size={W},{WIN_H}\",\n    \"--hide-scrollbars\",\n):\n    opts.add_argument(arg)\ndriver = webdriver.Chrome(options=opts)\ndriver.set_window_size(W, WIN_H)\ndriver.get(f\"file://{Path(f'plot-{THEME}.html').resolve()}\")\ntime.sleep(3)\ndriver.execute_script(\n    \"document.body.style.backgroundColor = arguments[0];document.documentElement.style.backgroundColor = arguments[0];\",\n    PAGE_BG,\n)\ntime.sleep(1)\ndriver.save_screenshot(f\"plot-{THEME}.png\")\ndriver.quit()\n"}