first working version

This commit is contained in:
Meik Hellmund 2022-09-27 14:52:14 +02:00
parent 45f436c040
commit 9ac9d909c2
8 changed files with 828 additions and 7 deletions

2
.gitignore vendored
View File

@ -1 +1,3 @@
*~
/.luarc.json

View File

@ -1,7 +0,0 @@
title: Julia color support
author: Meik Hellmund
version: 0.0.1
contributes:
filter:
- ansi2htmltex.lua

View File

@ -0,0 +1,17 @@
title: Julia color support
author: Meik Hellmund
version: 0.0.1
contributes:
format:
common:
filters:
- ansi2htmltex.lua
ipynb-filters:
- escfilter.py
pdf:
pdf-engine: xelatex
html:
monofont: "JuliaMono-Regular"
ipynb-outputt: all

View File

@ -0,0 +1,373 @@
-- this is essentially
-- https://github.com/jupyter/nbconvert/blob/main/nbconvert/filters/ansi.py
-- converted to lua
-- good list of ANSI escape sequences:
-- https://gist.github.com/fnky/458719343aabd01cfb17a3a4f7296797
local latexpreamble = [[
\setmonofont{JuliaMono}[
Scale = MatchLowercase,
UprightFont = *-Regular,
BoldFont = *-Bold,
ItalicFont = *-RegularItalic,
BoldItalicFont = *-BoldItalic,
]
\definecolor{ansi-black}{HTML}{3E424D}
\definecolor{ansi-black-intense}{HTML}{282C36}
\definecolor{ansi-red}{HTML}{E75C58}
\definecolor{ansi-red-intense}{HTML}{B22B31}
\definecolor{ansi-green}{HTML}{00A250}
\definecolor{ansi-green-intense}{HTML}{007427}
\definecolor{ansi-yellow}{HTML}{DDB62B}
\definecolor{ansi-yellow-intense}{HTML}{B27D12}
\definecolor{ansi-blue}{HTML}{208FFB}
\definecolor{ansi-blue-intense}{HTML}{0065CA}
\definecolor{ansi-magenta}{HTML}{D160C4}
\definecolor{ansi-magenta-intense}{HTML}{A03196}
\definecolor{ansi-cyan}{HTML}{60C6C8}
\definecolor{ansi-cyan-intense}{HTML}{258F8F}
\definecolor{ansi-white}{HTML}{C5C1B4}
\definecolor{ansi-white-intense}{HTML}{A1A6B2}
\definecolor{ansi-default-inverse-fg}{HTML}{FFFFFF}
\definecolor{ansi-default-inverse-bg}{HTML}{000000}
]]
local ANSI_COLORS = {
"ansi-black",
"ansi-red",
"ansi-green",
"ansi-yellow",
"ansi-blue",
"ansi-magenta",
"ansi-cyan",
"ansi-white",
"ansi-black-intense",
"ansi-red-intense",
"ansi-green-intense",
"ansi-yellow-intense",
"ansi-blue-intense",
"ansi-magenta-intense",
"ansi-cyan-intense",
"ansi-white-intense"
}
local flag = false -- set to true if we find ANSI sequences, used by Meta
local function get_extended_color(numbers)
local n = table.remove(numbers, 1)
local r,g,b,idx
if n == 2 and #numbers >=3 then
-- 24bit RGB
r = table.remove(numbers, 1)
g = table.remove(numbers, 1)
b = table.remove(numbers, 1)
elseif n == 5 and #numbers >= 1 then
-- 256 colors
idx = table.remove(numbers, 1)
if idx < 16 then
-- 16 default terminal colors
return idx
elseif idx < 232 then
-- 6x6x6 color cube, see http://stackoverflow.com/a/27165165/500098
r = (idx - 16) // 36
r = 55 + r * 40
if r < 0 then r = 0 end
g = ((idx - 16) % 36) // 6
g = 55 + g * 40
if g < 0 then g = 0 end
b = (idx - 16) % 6
b = 55 + b * 40
if b < 0 then b = 0 end
elseif idx < 256 then
-- grayscale, see http://stackoverflow.com/a/27165165/500098
r = (idx - 232) * 10 + 8
g = r
b = r
end
end
return {r, g, b}
end
--[=[
local re = require "re"
local ANSI = re.compile [[
'\x1b%[' {.*?} {[@-~]}
]]
--]=]
local function LaTeXconverter(fg, bg, bold, underline, inverse)
if not (fg or bg or bold or underline or inverse) then
return "",""
end
local starttag = ""
local endtag = ""
if inverse then
fg, bg = bg, fg
end
if type(fg) == "number" then
starttag = starttag .. [[\textcolor{]] .. ANSI_COLORS[fg+1] .. "}{"
endtag = "}" .. endtag
elseif type(fg) == "table" then
-- See http://tex.stackexchange.com/a/291102/13684
starttag = starttag .. [[\def\tcRGB{\textcolor[RGB]}\expandafter]]
starttag = starttag .. string.format([[\tcRGB\expandafter{\detokenize{%d,%d,%d}}{]], fg[1], fg[2], fg[3])
endtag = "}" .. endtag
elseif inverse then
starttag = starttag .. [[\textcolor{ansi-default-inverse-fg}{]]
endtag = "}" .. endtag
end
if type(bg) == "number" then
starttag = starttag .. [[\setlength{\fboxsep}{0pt}]]
starttag = starttag .. [[\colorbox{]] .. ANSI_COLORS[bg+1] .. "}{"
endtag = [[\strut}]] .. endtag
elseif type(bg) == "table" then
-- See http://tex.stackexchange.com/a/291102/13684
starttag = starttag .. [[\setlength{\fboxsep}{0pt}]]
starttag = starttag .. [[\def\cbRGB{\colorbox[RGB]}\expandafter]]
starttag = starttag .. string.format([[\cbRGB\expandafter{\detokenize{%d,%d,%d}}{]], bg[1], bg[2], bg[3])
endtag = [[\strut}]] .. endtag
elseif inverse then
starttag = starttag .. [[\setlength{\fboxsep}{0pt}]]
starttag = starttag .. [[\colorbox{ansi-default-inverse-bg}{]]
endtag = [[\strut}]] .. endtag
end
if bold then
starttag = starttag .. [[\textbf{]]
endtag = "}" .. endtag
end
if underline then
starttag = starttag .. [[\underline{]]
endtag = "}" .. endtag
end
return starttag, endtag
end
local function HTMLconverter(fg, bg, bold, underline, inverse)
if not (fg or bg or bold or underline or inverse) then
return "",""
end
local classes = {}
local styles = {}
local type = type -- more efficient?
local next = next
if inverse then
fg, bg = bg, fg
end
if type(fg) == "number" then
table.insert(classes, ANSI_COLORS[fg+1] .. "-fg")
elseif type(fg) == "table" then
table.insert(styles, string.format("color: rgb(%d,%d,%d)", fg[1], fg[2], fg[3]))
elseif inverse then
table.insert(classes, "ansi-default-inverse-fg")
end
if type(bg) == "number" then
table.insert(classes, ANSI_COLORS[bg+1] .. "-bg")
elseif type(bg) == "table" then
table.insert(styles, string.format("background-color: rgb(%d,%d,%d)",
bg[1], bg[2], bg[3]))
elseif inverse then
table.insert(classes, "ansi-default-inverse-bg")
end
if bold then
table.insert(classes, "ansi-bold")
end
if underline then
table.insert(classes, "ansi-underline")
end
local starttag = "<span"
if next(classes) ~= nil then
starttag = starttag .. ' class="' .. table.concat(classes, " ") .. '"'
end
if next(styles) ~= nil then
starttag = starttag .. ' style="' .. table.concat(styles, " ") .. '"'
end
return starttag..">","</span>"
end
local function codeBlockTrans(e)
local converter, fmt
if quarto.doc.isFormat('latex') then
converter = LaTeXconverter
fmt = 'latex'
elseif quarto.doc.isFormat('html') then
converter = HTMLconverter
fmt = 'html'
else
return
end
local texverbstart = [==[\begin{Verbatim}[commandchars=\\\{\}]]==]
local texverbend = [[\end{Verbatim}]]
local out=""
-- if string.find(e.text, "\x1b%[") then
if string.find(e.text, "\u{a35f}\u{a31a}\u{2983}") then
flag = true
local bold = false
local underline = false
local inverse = false
local text = e.text
local chunk = ""
local fg = nil
local bg = nil
local starttag = ""
local endtag = ""
local numbers={}
while text ~= "" do
numbers = {}
-- local s1, e1, c1, d1 = string.find(text, "\x1b%[(.-)([@-~])")
local s1, e1, c1, d1 = string.find(text, "\u{a35f}\u{a31a}\u{2983}(.-)([@-~])")
if s1 then
if d1 == "m" then
for i in string.gmatch(c1, "([^;]*)") do
table.insert(numbers, tonumber(i))
end
else
quarto.log.warning("Unsupported ANSI sequence ESC["..c1..d1.." ignored\n" )
end
chunk, text = text:sub(1, s1-1), text:sub(e1+1)
else
chunk, text = text, ""
end
if chunk ~= "" then
if bold and type(fg)=="number" and fg<8 then
starttag, endtag = converter(fg+8, bg, bold, underline, inverse)
else
starttag, endtag = converter(fg, bg, bold, underline, inverse)
end
out = out .. starttag .. chunk .. endtag
end
while next(numbers) ~= nil do
local n = table.remove(numbers, 1)
if n == 0 then
fg = nil
bg = nil
bold = false
inverse = false
underline = false
elseif n == 1 then
bold = true
elseif n == 4 then
underline = true
elseif n == 5 then
bold = true -- 'blinking'
elseif n == 7 then
inverse = true
elseif n == 21 or n == 22 then
bold = false
elseif n == 24 then
underline = false
elseif n == 27 then
inverse = false
elseif n >= 30 and n <= 37 then
fg = n - 30
elseif n == 38 then
fg = get_extended_color(numbers)
elseif n == 39 then
fg = nil
elseif n >= 40 and n <= 47 then
bg = n - 40
elseif n == 48 then
bg = get_extended_color(numbers)
elseif n == 49 then
bg = nil
elseif n >= 90 and n <= 97 then
fg = n + 8 - 90
elseif n >= 100 and n <= 107 then
bg = n + 8 - 100
else
quarto.log.warning(string.format("ESC sequence with unknown code %d before:\n",n))
quarto.log.warning(chunk.."\n")
end
end
end
if fmt == 'html' then
return pandoc.RawBlock(fmt, '<pre class="ansi"><code class="ansi">'..out..'</code></pre>')
end
if fmt == 'latex' then
return pandoc.RawBlock(fmt, texverbstart.."\n"..out.."\n"..texverbend)
end
end
end
-- algo from https://github.com/jgm/pandoc/commit/77faccb505992c944cd1b92f50e4e00d2927682b
-- simulate --ipynb-outbut=best, but w/o removing ANSI colors
-- consider only formats html and latex
local function divTrans(e)
local fmt
if FORMAT:match 'latex' then
fmt = 'latex'
elseif FORMAT:match 'html' then
fmt = 'html'
else
return
end
local function cmp(a,b)
return a["rank"] < b["rank"]
end
if e.classes[1] == "output" then
local c = e.content
local ranks = {}
for i, el in pairs(c) do
if el.t == "RawBlock" then
if el.format == fmt then
table.insert(ranks, {rank = 1, el})
else
table.insert(ranks, {rank = 3, el})
end
else
table.insert(ranks, {rank = 2, el})
end
end
table.sort(ranks, cmp)
local winner = ranks[1][1]
e.content = pandoc.List:new()
table.insert(e.content, winner)
return e
end
end
local function metaAdd(meta)
--for key, val in pairs(PANDOC_READER_OPTIONS) do
-- quarto.log.warning(key, val)
--end
if flag then
quarto.doc.addHtmlDependency({name='ansicolors',
stylesheets = {'resources/css/ansicolor.css'}})
quarto.doc.useLatexPackage('fancyvrb')
quarto.doc.useLatexPackage('xcolor')
quarto.doc.useLatexPackage('fontspec') -- eigtl for julia font
if quarto.doc.isFormat('latex') then
quarto.doc.includeText("in-header", latexpreamble)
end
end
end
return {
{Div = divTrans},
{CodeBlock = codeBlockTrans},
{Meta = metaAdd}
}

4
_extensions/julia/escfilter.py Executable file
View File

@ -0,0 +1,4 @@
import fileinput
for line in fileinput.input():
print(line.replace('\\u001b[','ꍟꌚ⦃').rstrip('\n'))

View File

@ -0,0 +1,44 @@
/* CSS added by ANSI escape sequences filter */
.ansi {
line-height:1;
overflow:auto;
}
/* console foregrounds and backgrounds */
pre .ansi-black-fg { color: #3e424d; }
pre .ansi-red-fg { color: #e75c58; }
pre .ansi-green-fg { color: #00a250; }
pre .ansi-yellow-fg { color: #ddb62b; }
pre .ansi-blue-fg { color: #208ffb; }
pre .ansi-magenta-fg { color: #d160c4; }
pre .ansi-cyan-fg { color: #60c6c8; }
pre .ansi-white-fg { color: #c5c1b4; }
pre .ansi-black-bg { background-color: #3e424d; }
pre .ansi-red-bg { background-color: #e75c58; }
pre .ansi-green-bg { background-color: #00a250; }
pre .ansi-yellow-bg { background-color: #ddb62b; }
pre .ansi-blue-bg { background-color: #208ffb; }
pre .ansi-magenta-bg { background-color: #d160c4; }
pre .ansi-cyan-bg { background-color: #60c6c8; }
pre .ansi-white-bg { background-color: #c5c1b4; }
pre .ansi-black-intense-fg { color: #282c36; }
pre .ansi-red-intense-fg { color: #b22b31; }
pre .ansi-green-intense-fg { color: #007427; }
pre .ansi-yellow-intense-fg { color: #b27d12; }
pre .ansi-blue-intense-fg { color: #0065ca; }
pre .ansi-magenta-intense-fg { color: #a03196; }
pre .ansi-cyan-intense-fg { color: #258f8f; }
pre .ansi-white-intense-fg { color: #a1a6b2; }
pre .ansi-black-intense-bg { background-color: #282c36; }
pre .ansi-red-intense-bg { background-color: #b22b31; }
pre .ansi-green-intense-bg { background-color: #007427; }
pre .ansi-yellow-intense-bg { background-color: #b27d12; }
pre .ansi-blue-intense-bg { background-color: #0065ca; }
pre .ansi-magenta-intense-bg { background-color: #a03196; }
pre .ansi-cyan-intense-bg { background-color: #258f8f; }
pre .ansi-white-intense-bg { background-color: #a1a6b2; }
pre .ansi-default-inverse-fg { color: rgba(255, 255, 255, 1); }
pre .ansi-default-inverse-bg { background-color: #111111; }
pre .ansi-bold { font-weight: bold; }
pre .ansi-underline { text-decoration: underline; }

388
example.html Normal file
View File

@ -0,0 +1,388 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"><head>
<meta charset="utf-8">
<meta name="generator" content="quarto-99.9.9">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
<title>Some Julia Code</title>
<style>
code{white-space: pre-wrap;}
span.smallcaps{font-variant: small-caps;}
div.columns{display: flex; gap: min(4vw, 1.5em);}
div.column{flex: auto; overflow-x: auto;}
div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
ul.task-list{list-style: none;}
ul.task-list li input[type="checkbox"] {
width: 0.8em;
margin: 0 0.8em 0.2em -1.6em;
vertical-align: middle;
}
pre > code.sourceCode { white-space: pre; position: relative; }
pre > code.sourceCode > span { display: inline-block; line-height: 1.25; }
pre > code.sourceCode > span:empty { height: 1.2em; }
.sourceCode { overflow: visible; }
code.sourceCode > span { color: inherit; text-decoration: inherit; }
div.sourceCode { margin: 1em 0; }
pre.sourceCode { margin: 0; }
@media screen {
div.sourceCode { overflow: auto; }
}
@media print {
pre > code.sourceCode { white-space: pre-wrap; }
pre > code.sourceCode > span { text-indent: -5em; padding-left: 5em; }
}
pre.numberSource code
{ counter-reset: source-line 0; }
pre.numberSource code > span
{ position: relative; left: -4em; counter-increment: source-line; }
pre.numberSource code > span > a:first-child::before
{ content: counter(source-line);
position: relative; left: -1em; text-align: right; vertical-align: baseline;
border: none; display: inline-block;
-webkit-touch-callout: none; -webkit-user-select: none;
-khtml-user-select: none; -moz-user-select: none;
-ms-user-select: none; user-select: none;
padding: 0 4px; width: 4em;
color: #aaaaaa;
}
pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa; padding-left: 4px; }
div.sourceCode
{ }
@media screen {
pre > code.sourceCode > span > a:first-child::before { text-decoration: underline; }
}
code span.al { color: #ff0000; font-weight: bold; } /* Alert */
code span.an { color: #60a0b0; font-weight: bold; font-style: italic; } /* Annotation */
code span.at { color: #7d9029; } /* Attribute */
code span.bn { color: #40a070; } /* BaseN */
code span.bu { color: #008000; } /* BuiltIn */
code span.cf { color: #007020; font-weight: bold; } /* ControlFlow */
code span.ch { color: #4070a0; } /* Char */
code span.cn { color: #880000; } /* Constant */
code span.co { color: #60a0b0; font-style: italic; } /* Comment */
code span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } /* CommentVar */
code span.do { color: #ba2121; font-style: italic; } /* Documentation */
code span.dt { color: #902000; } /* DataType */
code span.dv { color: #40a070; } /* DecVal */
code span.er { color: #ff0000; font-weight: bold; } /* Error */
code span.ex { } /* Extension */
code span.fl { color: #40a070; } /* Float */
code span.fu { color: #06287e; } /* Function */
code span.im { color: #008000; font-weight: bold; } /* Import */
code span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Information */
code span.kw { color: #007020; font-weight: bold; } /* Keyword */
code span.op { color: #666666; } /* Operator */
code span.ot { color: #007020; } /* Other */
code span.pp { color: #bc7a00; } /* Preprocessor */
code span.sc { color: #4070a0; } /* SpecialChar */
code span.ss { color: #bb6688; } /* SpecialString */
code span.st { color: #4070a0; } /* String */
code span.va { color: #19177c; } /* Variable */
code span.vs { color: #4070a0; } /* VerbatimString */
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
</style>
<script src="example_files/libs/clipboard/clipboard.min.js"></script>
<script src="example_files/libs/quarto-html/quarto.js"></script>
<script src="example_files/libs/quarto-html/popper.min.js"></script>
<script src="example_files/libs/quarto-html/tippy.umd.min.js"></script>
<script src="example_files/libs/quarto-html/anchor.min.js"></script>
<link href="example_files/libs/quarto-html/tippy.css" rel="stylesheet">
<link href="example_files/libs/quarto-html/quarto-syntax-highlighting.css" rel="stylesheet" id="quarto-text-highlighting-styles">
<script src="example_files/libs/bootstrap/bootstrap.min.js"></script>
<link href="example_files/libs/bootstrap/bootstrap-icons.css" rel="stylesheet">
<link href="example_files/libs/bootstrap/bootstrap.min.css" rel="stylesheet" id="quarto-bootstrap" data-mode="light">
<link href="example_files/libs/quarto-contrib/ansicolors/ansicolor.css" rel="stylesheet">
</head>
<body class="fullcontent">
<div id="quarto-content" class="page-columns page-rows-contents page-layout-article">
<main class="content" id="quarto-document-content">
<header id="title-block-header" class="quarto-title-block default">
<div class="quarto-title">
<h1 class="title">Some Julia Code</h1>
</div>
<div class="quarto-title-meta">
</div>
</header>
<section id="colored-console-graphs-produced-by-benchmarktools.jl" class="level2">
<h2 class="anchored" data-anchor-id="colored-console-graphs-produced-by-benchmarktools.jl">colored console graphs produced by <code>Benchmarktools.jl</code></h2>
<div class="cell" data-execution_count="2">
<div class="sourceCode cell-code" id="cb1"><pre class="sourceCode julia code-with-copy"><code class="sourceCode julia"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a><span class="im">using</span> <span class="bu">BenchmarkTools</span></span>
<span id="cb1-2"><a href="#cb1-2" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb1-3"><a href="#cb1-3" aria-hidden="true" tabindex="-1"></a><span class="pp">@benchmark</span> <span class="fu">sum</span>(<span class="fu">rand</span>(<span class="fl">1000</span>))</span></code><button title="Copy to Clipboard" class="code-copy-button"><i class="bi"></i></button></pre></div>
<div class="cell-output cell-output-display" data-execution_count="38">
<pre class="ansi"><code class="ansi">BenchmarkTools.Trial: 10000 samples with 17 evaluations.
Range <span class="ansi-black-intense-fg">(</span><span class="ansi-cyan-intense-fg ansi-bold">min</span><span class="ansi-magenta-fg">max</span><span class="ansi-black-intense-fg">): </span><span class="ansi-cyan-intense-fg ansi-bold">922.412 ns</span><span class="ansi-magenta-fg">62.270 μs</span> <span class="ansi-black-intense-fg"></span> GC <span class="ansi-black-intense-fg">(</span>min … max<span class="ansi-black-intense-fg">): </span>0.00% … 95.68%
Time <span class="ansi-black-intense-fg">(</span><span class="ansi-blue-intense-fg ansi-bold">median</span><span class="ansi-black-intense-fg">): </span><span class="ansi-blue-intense-fg ansi-bold"> 1.006 μs </span><span class="ansi-black-intense-fg"></span> GC <span class="ansi-black-intense-fg">(</span>median<span class="ansi-black-intense-fg">): </span>0.00%
Time <span class="ansi-black-intense-fg">(</span><span class="ansi-green-intense-fg ansi-bold">mean</span> ± <span class="ansi-green-fg">σ</span><span class="ansi-black-intense-fg">): </span><span class="ansi-green-intense-fg ansi-bold"> 1.258 μs</span> ± <span class="ansi-green-fg"> 2.330 μs</span> <span class="ansi-black-intense-fg"></span> GC <span class="ansi-black-intense-fg">(</span>mean ± σ<span class="ansi-black-intense-fg">): </span>9.38% ± 5.03%
▃▇█<span class="ansi-blue-fg"></span>▇▅▂ <span class="ansi-green-fg"> </span> ▁▂▂▄▃▃▂ ▂
███<span class="ansi-blue-fg"></span>███▇▇▇▆▆▄▄<span class="ansi-green-fg"></span>▃▃▃▃▄▃▃▁▃▁▄▁▁▃▁▁▁▁▃▄▄▄▁▃▄▁▄▄▃▁▃▁▄▃▁▇█████████ █
922 ns<span class="ansi-black-intense-fg"> </span><span class="ansi-black-intense-fg">Histogram: </span><span class="ansi-black-intense-fg ansi-bold">log(</span><span class="ansi-black-intense-fg">frequency</span><span class="ansi-black-intense-fg ansi-bold">)</span><span class="ansi-black-intense-fg"> by time</span> 2.41 μs <span class="ansi-bold">&lt;</span>
Memory estimate<span class="ansi-black-intense-fg">: </span><span class="ansi-yellow-fg">7.94 KiB</span>, allocs estimate<span class="ansi-black-intense-fg">: </span><span class="ansi-yellow-fg">1</span>.</code></pre>
</div>
</div>
</section>
<section id="structure-of-floating-point-numbers" class="level2">
<h2 class="anchored" data-anchor-id="structure-of-floating-point-numbers">structure of floating point numbers</h2>
<div class="cell" data-execution_count="3">
<div class="sourceCode cell-code" id="cb2"><pre class="sourceCode julia code-with-copy"><code class="sourceCode julia"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> <span class="fu">printbitsf64</span>(x<span class="op">::</span><span class="dt">Float64</span>)</span>
<span id="cb2-2"><a href="#cb2-2" aria-hidden="true" tabindex="-1"></a> s <span class="op">=</span> <span class="fu">bitstring</span>(x)</span>
<span id="cb2-3"><a href="#cb2-3" aria-hidden="true" tabindex="-1"></a> <span class="fu">printstyled</span>(s[<span class="fl">1</span>], color <span class="op">=</span> <span class="op">:</span>blue, reverse<span class="op">=</span><span class="cn">true</span>)</span>
<span id="cb2-4"><a href="#cb2-4" aria-hidden="true" tabindex="-1"></a> <span class="fu">printstyled</span>(s[<span class="fl">2</span><span class="op">:</span><span class="fl">12</span>], color <span class="op">=</span> <span class="op">:</span>green, reverse<span class="op">=</span><span class="cn">true</span>)</span>
<span id="cb2-5"><a href="#cb2-5" aria-hidden="true" tabindex="-1"></a> <span class="fu">printstyled</span>(s[<span class="fl">13</span><span class="op">:</span><span class="kw">end</span>], color<span class="op">=:</span>red, bold<span class="op">=</span><span class="cn">true</span>, reverse<span class="op">=</span><span class="cn">true</span>)</span>
<span id="cb2-6"><a href="#cb2-6" aria-hidden="true" tabindex="-1"></a> <span class="fu">print</span>(<span class="st">"</span><span class="sc">\n</span><span class="st">"</span>)</span>
<span id="cb2-7"><a href="#cb2-7" aria-hidden="true" tabindex="-1"></a><span class="kw">end</span></span>
<span id="cb2-8"><a href="#cb2-8" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb2-9"><a href="#cb2-9" aria-hidden="true" tabindex="-1"></a><span class="fu">printbitsf64</span>(<span class="fl">27.56640625</span>)</span></code><button title="Copy to Clipboard" class="code-copy-button"><i class="bi"></i></button></pre></div>
<div class="cell-output cell-output-stdout">
<pre class="ansi"><code class="ansi"><span class="ansi-default-inverse-fg ansi-blue-bg">0</span><span class="ansi-default-inverse-fg ansi-green-bg">10000000011</span><span class="ansi-default-inverse-fg ansi-red-intense-bg ansi-bold">1011100100010000000000000000000000000000000000000000</span></code></pre>
</div>
</div>
<section id="illustrate-machine-epsilon" class="level3">
<h3 class="anchored" data-anchor-id="illustrate-machine-epsilon">illustrate machine epsilon…</h3>
<div class="cell" data-execution_count="4">
<div class="sourceCode cell-code" id="cb3"><pre class="sourceCode julia code-with-copy"><code class="sourceCode julia"><span id="cb3-1"><a href="#cb3-1" aria-hidden="true" tabindex="-1"></a>Eps<span class="op">=</span><span class="fl">0.5</span></span>
<span id="cb3-2"><a href="#cb3-2" aria-hidden="true" tabindex="-1"></a><span class="cf">while</span> <span class="fl">1</span> <span class="op">!=</span> <span class="fl">1</span> <span class="op">+</span> Eps</span>
<span id="cb3-3"><a href="#cb3-3" aria-hidden="true" tabindex="-1"></a> Eps <span class="op">/=</span> <span class="fl">2</span></span>
<span id="cb3-4"><a href="#cb3-4" aria-hidden="true" tabindex="-1"></a> <span class="fu">printbitsf64</span>(<span class="fl">1</span><span class="op">+</span>Eps)</span>
<span id="cb3-5"><a href="#cb3-5" aria-hidden="true" tabindex="-1"></a><span class="cf">end</span></span></code><button title="Copy to Clipboard" class="code-copy-button"><i class="bi"></i></button></pre></div>
<div class="cell-output cell-output-stdout">
<pre class="ansi"><code class="ansi"><span class="ansi-default-inverse-fg ansi-blue-bg">0</span><span class="ansi-default-inverse-fg ansi-green-bg">01111111111</span><span class="ansi-default-inverse-fg ansi-red-intense-bg ansi-bold">0100000000000000000000000000000000000000000000000000</span>
<span class="ansi-default-inverse-fg ansi-blue-bg">0</span><span class="ansi-default-inverse-fg ansi-green-bg">01111111111</span><span class="ansi-default-inverse-fg ansi-red-intense-bg ansi-bold">0010000000000000000000000000000000000000000000000000</span>
<span class="ansi-default-inverse-fg ansi-blue-bg">0</span><span class="ansi-default-inverse-fg ansi-green-bg">01111111111</span><span class="ansi-default-inverse-fg ansi-red-intense-bg ansi-bold">0001000000000000000000000000000000000000000000000000</span>
<span class="ansi-default-inverse-fg ansi-blue-bg">0</span><span class="ansi-default-inverse-fg ansi-green-bg">01111111111</span><span class="ansi-default-inverse-fg ansi-red-intense-bg ansi-bold">0000100000000000000000000000000000000000000000000000</span>
<span class="ansi-default-inverse-fg ansi-blue-bg">0</span><span class="ansi-default-inverse-fg ansi-green-bg">01111111111</span><span class="ansi-default-inverse-fg ansi-red-intense-bg ansi-bold">0000010000000000000000000000000000000000000000000000</span>
<span class="ansi-default-inverse-fg ansi-blue-bg">0</span><span class="ansi-default-inverse-fg ansi-green-bg">01111111111</span><span class="ansi-default-inverse-fg ansi-red-intense-bg ansi-bold">0000001000000000000000000000000000000000000000000000</span>
<span class="ansi-default-inverse-fg ansi-blue-bg">0</span><span class="ansi-default-inverse-fg ansi-green-bg">01111111111</span><span class="ansi-default-inverse-fg ansi-red-intense-bg ansi-bold">0000000100000000000000000000000000000000000000000000</span>
<span class="ansi-default-inverse-fg ansi-blue-bg">0</span><span class="ansi-default-inverse-fg ansi-green-bg">01111111111</span><span class="ansi-default-inverse-fg ansi-red-intense-bg ansi-bold">0000000010000000000000000000000000000000000000000000</span>
<span class="ansi-default-inverse-fg ansi-blue-bg">0</span><span class="ansi-default-inverse-fg ansi-green-bg">01111111111</span><span class="ansi-default-inverse-fg ansi-red-intense-bg ansi-bold">0000000001000000000000000000000000000000000000000000</span>
<span class="ansi-default-inverse-fg ansi-blue-bg">0</span><span class="ansi-default-inverse-fg ansi-green-bg">01111111111</span><span class="ansi-default-inverse-fg ansi-red-intense-bg ansi-bold">0000000000100000000000000000000000000000000000000000</span>
<span class="ansi-default-inverse-fg ansi-blue-bg">0</span><span class="ansi-default-inverse-fg ansi-green-bg">01111111111</span><span class="ansi-default-inverse-fg ansi-red-intense-bg ansi-bold">0000000000010000000000000000000000000000000000000000</span>
<span class="ansi-default-inverse-fg ansi-blue-bg">0</span><span class="ansi-default-inverse-fg ansi-green-bg">01111111111</span><span class="ansi-default-inverse-fg ansi-red-intense-bg ansi-bold">0000000000001000000000000000000000000000000000000000</span>
<span class="ansi-default-inverse-fg ansi-blue-bg">0</span><span class="ansi-default-inverse-fg ansi-green-bg">01111111111</span><span class="ansi-default-inverse-fg ansi-red-intense-bg ansi-bold">0000000000000100000000000000000000000000000000000000</span>
<span class="ansi-default-inverse-fg ansi-blue-bg">0</span><span class="ansi-default-inverse-fg ansi-green-bg">01111111111</span><span class="ansi-default-inverse-fg ansi-red-intense-bg ansi-bold">0000000000000010000000000000000000000000000000000000</span>
<span class="ansi-default-inverse-fg ansi-blue-bg">0</span><span class="ansi-default-inverse-fg ansi-green-bg">01111111111</span><span class="ansi-default-inverse-fg ansi-red-intense-bg ansi-bold">0000000000000001000000000000000000000000000000000000</span>
<span class="ansi-default-inverse-fg ansi-blue-bg">0</span><span class="ansi-default-inverse-fg ansi-green-bg">01111111111</span><span class="ansi-default-inverse-fg ansi-red-intense-bg ansi-bold">0000000000000000100000000000000000000000000000000000</span>
<span class="ansi-default-inverse-fg ansi-blue-bg">0</span><span class="ansi-default-inverse-fg ansi-green-bg">01111111111</span><span class="ansi-default-inverse-fg ansi-red-intense-bg ansi-bold">0000000000000000010000000000000000000000000000000000</span>
<span class="ansi-default-inverse-fg ansi-blue-bg">0</span><span class="ansi-default-inverse-fg ansi-green-bg">01111111111</span><span class="ansi-default-inverse-fg ansi-red-intense-bg ansi-bold">0000000000000000001000000000000000000000000000000000</span>
<span class="ansi-default-inverse-fg ansi-blue-bg">0</span><span class="ansi-default-inverse-fg ansi-green-bg">01111111111</span><span class="ansi-default-inverse-fg ansi-red-intense-bg ansi-bold">0000000000000000000100000000000000000000000000000000</span>
<span class="ansi-default-inverse-fg ansi-blue-bg">0</span><span class="ansi-default-inverse-fg ansi-green-bg">01111111111</span><span class="ansi-default-inverse-fg ansi-red-intense-bg ansi-bold">0000000000000000000010000000000000000000000000000000</span>
<span class="ansi-default-inverse-fg ansi-blue-bg">0</span><span class="ansi-default-inverse-fg ansi-green-bg">01111111111</span><span class="ansi-default-inverse-fg ansi-red-intense-bg ansi-bold">0000000000000000000001000000000000000000000000000000</span>
<span class="ansi-default-inverse-fg ansi-blue-bg">0</span><span class="ansi-default-inverse-fg ansi-green-bg">01111111111</span><span class="ansi-default-inverse-fg ansi-red-intense-bg ansi-bold">0000000000000000000000100000000000000000000000000000</span>
<span class="ansi-default-inverse-fg ansi-blue-bg">0</span><span class="ansi-default-inverse-fg ansi-green-bg">01111111111</span><span class="ansi-default-inverse-fg ansi-red-intense-bg ansi-bold">0000000000000000000000010000000000000000000000000000</span>
<span class="ansi-default-inverse-fg ansi-blue-bg">0</span><span class="ansi-default-inverse-fg ansi-green-bg">01111111111</span><span class="ansi-default-inverse-fg ansi-red-intense-bg ansi-bold">0000000000000000000000001000000000000000000000000000</span>
<span class="ansi-default-inverse-fg ansi-blue-bg">0</span><span class="ansi-default-inverse-fg ansi-green-bg">01111111111</span><span class="ansi-default-inverse-fg ansi-red-intense-bg ansi-bold">0000000000000000000000000100000000000000000000000000</span>
<span class="ansi-default-inverse-fg ansi-blue-bg">0</span><span class="ansi-default-inverse-fg ansi-green-bg">01111111111</span><span class="ansi-default-inverse-fg ansi-red-intense-bg ansi-bold">0000000000000000000000000010000000000000000000000000</span>
<span class="ansi-default-inverse-fg ansi-blue-bg">0</span><span class="ansi-default-inverse-fg ansi-green-bg">01111111111</span><span class="ansi-default-inverse-fg ansi-red-intense-bg ansi-bold">0000000000000000000000000001000000000000000000000000</span>
<span class="ansi-default-inverse-fg ansi-blue-bg">0</span><span class="ansi-default-inverse-fg ansi-green-bg">01111111111</span><span class="ansi-default-inverse-fg ansi-red-intense-bg ansi-bold">0000000000000000000000000000100000000000000000000000</span>
<span class="ansi-default-inverse-fg ansi-blue-bg">0</span><span class="ansi-default-inverse-fg ansi-green-bg">01111111111</span><span class="ansi-default-inverse-fg ansi-red-intense-bg ansi-bold">0000000000000000000000000000010000000000000000000000</span>
<span class="ansi-default-inverse-fg ansi-blue-bg">0</span><span class="ansi-default-inverse-fg ansi-green-bg">01111111111</span><span class="ansi-default-inverse-fg ansi-red-intense-bg ansi-bold">0000000000000000000000000000001000000000000000000000</span>
<span class="ansi-default-inverse-fg ansi-blue-bg">0</span><span class="ansi-default-inverse-fg ansi-green-bg">01111111111</span><span class="ansi-default-inverse-fg ansi-red-intense-bg ansi-bold">0000000000000000000000000000000100000000000000000000</span>
<span class="ansi-default-inverse-fg ansi-blue-bg">0</span><span class="ansi-default-inverse-fg ansi-green-bg">01111111111</span><span class="ansi-default-inverse-fg ansi-red-intense-bg ansi-bold">0000000000000000000000000000000010000000000000000000</span>
<span class="ansi-default-inverse-fg ansi-blue-bg">0</span><span class="ansi-default-inverse-fg ansi-green-bg">01111111111</span><span class="ansi-default-inverse-fg ansi-red-intense-bg ansi-bold">0000000000000000000000000000000001000000000000000000</span>
<span class="ansi-default-inverse-fg ansi-blue-bg">0</span><span class="ansi-default-inverse-fg ansi-green-bg">01111111111</span><span class="ansi-default-inverse-fg ansi-red-intense-bg ansi-bold">0000000000000000000000000000000000100000000000000000</span>
<span class="ansi-default-inverse-fg ansi-blue-bg">0</span><span class="ansi-default-inverse-fg ansi-green-bg">01111111111</span><span class="ansi-default-inverse-fg ansi-red-intense-bg ansi-bold">0000000000000000000000000000000000010000000000000000</span>
<span class="ansi-default-inverse-fg ansi-blue-bg">0</span><span class="ansi-default-inverse-fg ansi-green-bg">01111111111</span><span class="ansi-default-inverse-fg ansi-red-intense-bg ansi-bold">0000000000000000000000000000000000001000000000000000</span>
<span class="ansi-default-inverse-fg ansi-blue-bg">0</span><span class="ansi-default-inverse-fg ansi-green-bg">01111111111</span><span class="ansi-default-inverse-fg ansi-red-intense-bg ansi-bold">0000000000000000000000000000000000000100000000000000</span>
<span class="ansi-default-inverse-fg ansi-blue-bg">0</span><span class="ansi-default-inverse-fg ansi-green-bg">01111111111</span><span class="ansi-default-inverse-fg ansi-red-intense-bg ansi-bold">0000000000000000000000000000000000000010000000000000</span>
<span class="ansi-default-inverse-fg ansi-blue-bg">0</span><span class="ansi-default-inverse-fg ansi-green-bg">01111111111</span><span class="ansi-default-inverse-fg ansi-red-intense-bg ansi-bold">0000000000000000000000000000000000000001000000000000</span>
<span class="ansi-default-inverse-fg ansi-blue-bg">0</span><span class="ansi-default-inverse-fg ansi-green-bg">01111111111</span><span class="ansi-default-inverse-fg ansi-red-intense-bg ansi-bold">0000000000000000000000000000000000000000100000000000</span>
<span class="ansi-default-inverse-fg ansi-blue-bg">0</span><span class="ansi-default-inverse-fg ansi-green-bg">01111111111</span><span class="ansi-default-inverse-fg ansi-red-intense-bg ansi-bold">0000000000000000000000000000000000000000010000000000</span>
<span class="ansi-default-inverse-fg ansi-blue-bg">0</span><span class="ansi-default-inverse-fg ansi-green-bg">01111111111</span><span class="ansi-default-inverse-fg ansi-red-intense-bg ansi-bold">0000000000000000000000000000000000000000001000000000</span>
<span class="ansi-default-inverse-fg ansi-blue-bg">0</span><span class="ansi-default-inverse-fg ansi-green-bg">01111111111</span><span class="ansi-default-inverse-fg ansi-red-intense-bg ansi-bold">0000000000000000000000000000000000000000000100000000</span>
<span class="ansi-default-inverse-fg ansi-blue-bg">0</span><span class="ansi-default-inverse-fg ansi-green-bg">01111111111</span><span class="ansi-default-inverse-fg ansi-red-intense-bg ansi-bold">0000000000000000000000000000000000000000000010000000</span>
<span class="ansi-default-inverse-fg ansi-blue-bg">0</span><span class="ansi-default-inverse-fg ansi-green-bg">01111111111</span><span class="ansi-default-inverse-fg ansi-red-intense-bg ansi-bold">0000000000000000000000000000000000000000000001000000</span>
<span class="ansi-default-inverse-fg ansi-blue-bg">0</span><span class="ansi-default-inverse-fg ansi-green-bg">01111111111</span><span class="ansi-default-inverse-fg ansi-red-intense-bg ansi-bold">0000000000000000000000000000000000000000000000100000</span>
<span class="ansi-default-inverse-fg ansi-blue-bg">0</span><span class="ansi-default-inverse-fg ansi-green-bg">01111111111</span><span class="ansi-default-inverse-fg ansi-red-intense-bg ansi-bold">0000000000000000000000000000000000000000000000010000</span>
<span class="ansi-default-inverse-fg ansi-blue-bg">0</span><span class="ansi-default-inverse-fg ansi-green-bg">01111111111</span><span class="ansi-default-inverse-fg ansi-red-intense-bg ansi-bold">0000000000000000000000000000000000000000000000001000</span>
<span class="ansi-default-inverse-fg ansi-blue-bg">0</span><span class="ansi-default-inverse-fg ansi-green-bg">01111111111</span><span class="ansi-default-inverse-fg ansi-red-intense-bg ansi-bold">0000000000000000000000000000000000000000000000000100</span>
<span class="ansi-default-inverse-fg ansi-blue-bg">0</span><span class="ansi-default-inverse-fg ansi-green-bg">01111111111</span><span class="ansi-default-inverse-fg ansi-red-intense-bg ansi-bold">0000000000000000000000000000000000000000000000000010</span>
<span class="ansi-default-inverse-fg ansi-blue-bg">0</span><span class="ansi-default-inverse-fg ansi-green-bg">01111111111</span><span class="ansi-default-inverse-fg ansi-red-intense-bg ansi-bold">0000000000000000000000000000000000000000000000000001</span>
<span class="ansi-default-inverse-fg ansi-blue-bg">0</span><span class="ansi-default-inverse-fg ansi-green-bg">01111111111</span><span class="ansi-default-inverse-fg ansi-red-intense-bg ansi-bold">0000000000000000000000000000000000000000000000000000</span></code></pre>
</div>
</div>
</section>
<section id="some-ugly-colors" class="level3">
<h3 class="anchored" data-anchor-id="some-ugly-colors">… some ugly colors</h3>
<div class="cell" data-execution_count="5">
<div class="sourceCode cell-code" id="cb4"><pre class="sourceCode julia code-with-copy"><code class="sourceCode julia"><span id="cb4-1"><a href="#cb4-1" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> <span class="fu">printbits2f64</span>(x<span class="op">::</span><span class="dt">Float64</span>)</span>
<span id="cb4-2"><a href="#cb4-2" aria-hidden="true" tabindex="-1"></a> s <span class="op">=</span> <span class="fu">bitstring</span>(x)</span>
<span id="cb4-3"><a href="#cb4-3" aria-hidden="true" tabindex="-1"></a> <span class="fu">printstyled</span>(s[<span class="fl">1</span>], color <span class="op">=</span> <span class="fl">142</span>, reverse<span class="op">=</span><span class="cn">true</span>)</span>
<span id="cb4-4"><a href="#cb4-4" aria-hidden="true" tabindex="-1"></a> <span class="fu">printstyled</span>(s[<span class="fl">2</span><span class="op">:</span><span class="fl">12</span>], color <span class="op">=</span> <span class="fl">190</span>, reverse<span class="op">=</span><span class="cn">false</span>, underline<span class="op">=</span><span class="cn">true</span>)</span>
<span id="cb4-5"><a href="#cb4-5" aria-hidden="true" tabindex="-1"></a> <span class="fu">printstyled</span>(s[<span class="fl">13</span><span class="op">:</span><span class="kw">end</span>], color<span class="op">=</span> <span class="fl">27</span>, bold<span class="op">=</span><span class="cn">true</span>, reverse<span class="op">=</span><span class="cn">true</span>)</span>
<span id="cb4-6"><a href="#cb4-6" aria-hidden="true" tabindex="-1"></a> <span class="fu">print</span>(<span class="st">"</span><span class="sc">\n</span><span class="st">"</span>)</span>
<span id="cb4-7"><a href="#cb4-7" aria-hidden="true" tabindex="-1"></a><span class="kw">end</span></span>
<span id="cb4-8"><a href="#cb4-8" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb4-9"><a href="#cb4-9" aria-hidden="true" tabindex="-1"></a><span class="fu">printbits2f64</span>(<span class="fl">27.56640625</span>)</span></code><button title="Copy to Clipboard" class="code-copy-button"><i class="bi"></i></button></pre></div>
<div class="cell-output cell-output-stdout">
<pre class="ansi"><code class="ansi"><span class="ansi-default-inverse-fg" style="background-color: rgb(175,175,55)">0</span><span class="ansi-underline" style="color: rgb(215,255,55)">10000000011</span><span class="ansi-default-inverse-fg ansi-bold" style="background-color: rgb(55,95,255)">1011100100010000000000000000000000000000000000000000</span></code></pre>
</div>
</div>
</section>
</section>
</main>
<!-- /main column -->
<script id="quarto-html-after-body" type="application/javascript">
window.document.addEventListener("DOMContentLoaded", function (event) {
const toggleBodyColorMode = (bsSheetEl) => {
const mode = bsSheetEl.getAttribute("data-mode");
const bodyEl = window.document.querySelector("body");
if (mode === "dark") {
bodyEl.classList.add("quarto-dark");
bodyEl.classList.remove("quarto-light");
} else {
bodyEl.classList.add("quarto-light");
bodyEl.classList.remove("quarto-dark");
}
}
const toggleBodyColorPrimary = () => {
const bsSheetEl = window.document.querySelector("link#quarto-bootstrap");
if (bsSheetEl) {
toggleBodyColorMode(bsSheetEl);
}
}
toggleBodyColorPrimary();
const icon = "";
const anchorJS = new window.AnchorJS();
anchorJS.options = {
placement: 'right',
icon: icon
};
anchorJS.add('.anchored');
const clipboard = new window.ClipboardJS('.code-copy-button', {
target: function(trigger) {
return trigger.previousElementSibling;
}
});
clipboard.on('success', function(e) {
// button target
const button = e.trigger;
// don't keep focus
button.blur();
// flash "checked"
button.classList.add('code-copy-button-checked');
var currentTitle = button.getAttribute("title");
button.setAttribute("title", "Copied!");
let tooltip;
if (window.bootstrap) {
button.setAttribute("data-bs-toggle", "tooltip");
button.setAttribute("data-bs-placement", "left");
button.setAttribute("data-bs-title", "Copied!");
tooltip = new bootstrap.Tooltip(button,
{ trigger: "manual",
customClass: "code-copy-button-tooltip",
offset: [0, -8]});
tooltip.show();
}
setTimeout(function() {
if (tooltip) {
tooltip.hide();
button.removeAttribute("data-bs-title");
button.removeAttribute("data-bs-toggle");
button.removeAttribute("data-bs-placement");
}
button.setAttribute("title", currentTitle);
button.classList.remove('code-copy-button-checked');
}, 1000);
// clear code selection
e.clearSelection();
});
function tippyHover(el, contentFn) {
const config = {
allowHTML: true,
content: contentFn,
maxWidth: 500,
delay: 100,
arrow: false,
appendTo: function(el) {
return el.parentElement;
},
interactive: true,
interactiveBorder: 10,
theme: 'quarto',
placement: 'bottom-start'
};
window.tippy(el, config);
}
const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]');
for (var i=0; i<noterefs.length; i++) {
const ref = noterefs[i];
tippyHover(ref, function() {
// use id or data attribute instead here
let href = ref.getAttribute('data-footnote-href') || ref.getAttribute('href');
try { href = new URL(href).hash; } catch {}
const id = href.replace(/^#\/?/, "");
const note = window.document.getElementById(id);
return note.innerHTML;
});
}
const findCites = (el) => {
const parentEl = el.parentElement;
if (parentEl) {
const cites = parentEl.dataset.cites;
if (cites) {
return {
el,
cites: cites.split(' ')
};
} else {
return findCites(el.parentElement)
}
} else {
return undefined;
}
};
var bibliorefs = window.document.querySelectorAll('a[role="doc-biblioref"]');
for (var i=0; i<bibliorefs.length; i++) {
const ref = bibliorefs[i];
const citeInfo = findCites(ref);
if (citeInfo) {
tippyHover(citeInfo.el, function() {
var popup = window.document.createElement('div');
citeInfo.cites.forEach(function(cite) {
var citeDiv = window.document.createElement('div');
citeDiv.classList.add('hanging-indent');
citeDiv.classList.add('csl-entry');
var biblioDiv = window.document.getElementById('ref-' + cite);
if (biblioDiv) {
citeDiv.innerHTML = biblioDiv.innerHTML;
}
popup.appendChild(citeDiv);
});
return popup.innerHTML;
});
}
}
});
</script>
</div> <!-- /content -->
</body></html>

BIN
example.pdf Normal file

Binary file not shown.