summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/lualatex
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/lualatex')
-rw-r--r--Master/texmf-dist/tex/lualatex/ideavault/ideavault-lua.lua355
-rw-r--r--Master/texmf-dist/tex/lualatex/ideavault/ideavault.sty67
2 files changed, 422 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/lualatex/ideavault/ideavault-lua.lua b/Master/texmf-dist/tex/lualatex/ideavault/ideavault-lua.lua
new file mode 100644
index 00000000000..6d4de1e383a
--- /dev/null
+++ b/Master/texmf-dist/tex/lualatex/ideavault/ideavault-lua.lua
@@ -0,0 +1,355 @@
+-- ideavault-lua.lua
+-- Copyright 2024 Tomasz M. Czarkowski
+--
+-- This work may be distributed and/or modified under the
+-- conditions of the LaTeX Project Public License, either version 1.3c
+-- of this license or any later version.
+-- The latest version of this license is in
+-- https://www.latex-project.org/lppl.txt
+-- and version 1.3c or later is part of all distributions of LaTeX
+-- version 2008 or later.
+--
+-- This work has the LPPL maintenance status `maintained'.
+--
+-- The Current Maintainer of this work is Tomasz M. Czarkowski
+--
+-- This work consists of the files ideavault.sty and ideavault-lua.lua
+
+IdeaVaultClass = {}
+IdeaVaultClass.__index = IdeaVaultClass
+
+setmetatable(IdeaVaultClass, {
+ __call = function (cls, ...)
+ return cls.new(...)
+ end,
+})
+
+function IdeaVaultClass.new()
+ local self = setmetatable({}, IdeaVaultClass)
+ self.all = {}
+ return self
+end
+
+function IdeaVaultClass:addPrefix(prefix)
+ if (self.all[prefix] == nil)
+ then
+ self.all[prefix] = {}
+ end
+end
+
+function IdeaVaultClass:set(prefix, key, value)
+ self:addPrefix(prefix)
+ self.all[prefix][key] = value
+end
+
+function IdeaVaultClass:contains(prefix, key)
+ if (self.all[prefix] == nil or self.all[prefix][key] == nil)
+ then
+ return false
+ end
+ return true
+end
+
+function IdeaVaultClass:get(prefix, key)
+ if (self.all[prefix] == nil)
+ then
+ die("Prefix: '" .. prefix .. "' does not exist!")
+ end
+ if (self.all[prefix][key] == nil)
+ then
+ die("Key: '" .. key .. "' not found in prefix: '" .. prefix .. "'!")
+ end
+
+ return self.all[prefix][key]
+end
+
+function IdeaVaultClass:getAllWithPrefix(prefix)
+ ideas = {}
+ pr = self.all[prefix]
+ for _, value in pairs(pr)
+ do
+ table.insert(ideas, value)
+ end
+ table.sort(ideas, function(a,b)
+ if b:isGreaterThan(a) then return true end
+ end)
+ return ideas
+end
+
+function IdeaVaultClass:getAllWithTag(prefix, tag)
+ ideas = {}
+ pr = self.all[prefix]
+ for _, value in pairs(pr)
+ do
+ if (value:hasTag(tag))
+ then
+ table.insert(ideas, value)
+ end
+ end
+ table.sort(ideas, function(a,b)
+ if b:isGreaterThan(a) then return true end
+ end)
+ return ideas
+end
+
+function IdeaVaultClass:printIdea(prefix, key, style)
+ idea = self:get(prefix, key)
+ idea:printSelf(style)
+end
+
+function IdeaVaultClass:printAllWithTag(prefix, tag, style)
+ ideas = self:getAllWithTag(prefix, tag)
+ for _, idea in ipairs(ideas)
+ do
+ idea:printSelf(style)
+ end
+end
+
+function IdeaVaultClass:printAllWithPrefix(prefix, style)
+ ideas = self:getAllWithPrefix(prefix)
+ for _, idea in ipairs(ideas)
+ do
+ idea:printSelf(style)
+ end
+end
+
+IdeaClass = {}
+IdeaClass.__index = IdeaClass
+
+setmetatable(IdeaClass, {
+ __call = function (cls, ...)
+ return cls.new(...)
+ end,
+})
+
+function IdeaClass.new(title, content, dependencies, tags, value)
+ local self = setmetatable({}, IdeaClass)
+ self.title = title
+ self.content = content
+ self.dependencies = dependencies or {}
+ self.tags = tags or {}
+ self.value = value or 0
+ return self
+end
+
+function IdeaClass:getTitle()
+ return self.title
+end
+
+function IdeaClass:getContent()
+ return self.content
+end
+
+function IdeaClass:getTags()
+ return self.tags
+end
+
+function IdeaClass:getDependencies()
+ return self.dependencies
+end
+
+function IdeaClass:getValue()
+ return self.value
+end
+
+function IdeaClass:isGreaterThan(idea)
+ if self:getValue() > idea:getValue()
+ then
+ return true
+ else
+ if self:getValue() == idea:getValue()
+ then
+ if self:getTitle() > idea:getTitle()
+ then
+ return true
+ else
+ return false
+ end
+ else
+ return false
+ end
+ end
+end
+
+function IdeaClass:hasTag(tag)
+ for _, value in pairs(self:getTags())
+ do
+ if (value == tag)
+ then
+ return true
+ end
+ end
+ return false
+end
+
+bookmark_counter = 0
+
+function IdeaClass:printSelf(style)
+ style = style or ""
+ texio.write("Printing idea. Title: '" .. self:getTitle() .. "', style: '" .. style .. "'.\n")
+
+ local frame = false
+ local center = false
+ local bookmark = false
+ local large = false
+ local needSpace = false
+ local emph = false
+ local quiet = false
+ for c in style:gmatch"."
+ do
+ if (c == "f") then
+ frame = true
+ elseif (c == "c") then
+ center = true
+ elseif (c == "b") then
+ bookmark = true
+ elseif (c == "l") then
+ large = true
+ elseif (c == "s") then
+ needSpace = true
+ elseif (c == "e") then
+ emph = true
+ elseif (c == "q") then
+ quiet = true
+ else
+ die("Unknown style: '" .. c .. "'")
+ end
+ end
+ if (needSpace)
+ then
+ tex.sprint("\\needspace{5cm}%")
+ end
+ if (bookmark)
+ then
+ tex.sprint("\\hypertarget{" .. bookmark_counter .. "}{}%")
+ tex.sprint("\\bookmark[dest=" .. bookmark_counter .. ", level=\\bookDepth]{" .. self:getTitle() .. "}%")
+ --tex.sprint("\\subpdfbookmark{" .. self:getTitle() .. "}{" .. bookmark_counter .. "}%")
+ bookmark_counter = bookmark_counter + 1
+ tex.sprint("\\bookDown%")
+ end
+ if (frame)
+ then
+ tex.sprint("\\begin{mdframed}%")
+ end
+ if (center)
+ then
+ tex.sprint("\\begin{center}%")
+ end
+ if (not quiet)
+ then
+ if (large)
+ then
+ tex.sprint("{\\Large%")
+ end
+ if (emph)
+ then
+ tex.sprint("\\emph{,,")
+ end
+ tex.sprint(self:getTitle())
+ if (emph)
+ then
+ tex.sprint("''}%")
+ end
+ if (large)
+ then
+ tex.sprint("}%")
+ end
+ end
+ if (center)
+ then
+ tex.sprint("\\end{center}%")
+ end
+ tex.sprint(self:getContent() .. "%")
+ if (not quiet)
+ then
+ self:printDependencies()
+ end
+ if (frame)
+ then
+ tex.sprint("\\end{mdframed}%")
+ end
+ if (bookmark)
+ then
+ tex.sprint("\\bookUp%")
+ end
+end
+
+function IdeaClass:printDependencies()
+ for _, dependency in ipairs(self:getDependencies())
+ do
+ dependency:resolve():printSelf("lcf")
+ end
+end
+
+DependencyClass = {}
+DependencyClass.__index = DependencyClass
+
+setmetatable(DependencyClass, {
+ __call = function (cls, ...)
+ return cls.new(...)
+ end,
+})
+
+function DependencyClass.new(prefix, title)
+ local self = setmetatable({}, DependencyClass)
+ self.prefix = prefix or "default"
+ self.title = title or ""
+ if (not ideaVault:contains(self.prefix, self.title))
+ then
+ die("Broken dependency! Title: '" .. self.title .. "'. Prefix: '" .. self.prefix .. "'.")
+ end
+ return self
+end
+
+function DependencyClass:getPrefix()
+ return self.prefix
+end
+
+function DependencyClass:getTitle()
+ return self.title
+end
+
+function DependencyClass:resolve()
+ return ideaVault:get(self:getPrefix(), self:getTitle())
+end
+
+function DependencyClass:isGreaterThan(idea)
+ if self:getTitle() > idea:getTitle()
+ then
+ return true
+ else
+ return false
+ end
+end
+ideaVault = IdeaVaultClass()
+
+function createIdea(prefix, key, content, dependencies, tags, value)
+ t = "["
+ for _, a in pairs(tags)
+ do
+ t = t .. a .. ", "
+ end
+ t = t .. "]"
+ texio.write("Creating idea. Title: '" .. key .. "'. Prefix: '" .. prefix .. "', tags: " .. t .. ".\n")
+ deps = {}
+ for _, val in pairs(dependencies)
+ do
+ d = DependencyClass(val[1], val[2])
+ table.insert(deps, d)
+ end
+ table.sort(deps, function(a,b)
+ if b:isGreaterThan(a) then return true end
+ end)
+ idea = IdeaClass(key, content, deps, tags, value)
+ ideaVault:set(prefix, key, idea)
+end
+
+function die(reason)
+ reason = reason or "nil"
+ texio.write_nl("Critical error: " .. reason)
+ tex.error("Critical error: " .. reason)
+end
+
+function startsWith(text, prefix)
+ return text:find(prefix, 1, true) == 1
+end
diff --git a/Master/texmf-dist/tex/lualatex/ideavault/ideavault.sty b/Master/texmf-dist/tex/lualatex/ideavault/ideavault.sty
new file mode 100644
index 00000000000..07d60006457
--- /dev/null
+++ b/Master/texmf-dist/tex/lualatex/ideavault/ideavault.sty
@@ -0,0 +1,67 @@
+% ideavault.sty
+% Copyright 2024 Tomasz M. Czarkowski
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or any later version.
+% The latest version of this license is in
+% https://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2008 or later.
+%
+% This work has the LPPL maintenance status `maintained'.
+%
+% The Current Maintainer of this work is Tomasz M. Czarkowski
+%
+% This work consists of the files ideavault.sty and ideavault-lua.lua
+
+
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{ideavault}[1.0.1]
+\RequirePackage[open,openlevel=2,atend]{bookmark}
+\RequirePackage{xargs}
+\RequirePackage{luacode}
+\RequirePackage{xpatch}
+\RequirePackage{mdframed}
+% Magic that lets mdframed nest more than 3 times
+\makeatletter
+\xpatchcmd{\mdf@preenvsetting}
+ {\mdf@envdepth >\tw@}
+ {\mdf@envdepth >20}
+ {}
+ {}
+\makeatother
+\RequirePackage{needspace}
+
+\directlua{require("ideavault-lua")}
+
+% #1: prefix
+% #2: name
+% #3: content
+% #4: dependencies
+% #5: tags
+% #6: weight
+\newcommandx{\createIdea}[6][1=default, 4=,5=,6=-1]{\luadirect{createIdea(\luastringN{#1}, \luastringN{#2}, \luastringN{#3}, {#4}, {#5}, #6)}}
+
+% #1: prefix
+% #2: style
+% #3: name
+\newcommandx{\printIdea}[3][1=default, 2=lcf]{\luadirect{ideaVault:printIdea(\luastringN{#1}, \luastringN{#3}, \luastringN{#2})}}
+
+% #1: prefix
+% #2: style
+\newcommandx{\printAllWithPrefix}[2][1=default, 2=lcf]{\luadirect{ideaVault:printAllWithPrefix(\luastringN{#1}, \luastringN{#2})}}
+
+% #1: prefix
+% #2: style
+% #3: tag
+\newcommandx{\printAllWithTag}[3][1=default, 2=lcf]{\luadirect{ideaVault:printAllWithTag(\luastringN{#1}, \luastringN{#3}, \luastringN{#2})}}
+
+% Internal commands for managing bookmark depth
+\newcounter{bookmarkDepth}
+\newcommand{\bookDown}{\stepcounter{bookmarkDepth}}
+\newcommand{\bookUp}{\addtocounter{bookmarkDepth}{-1}}
+\newcommand{\bookSet}[1]{\setcounter{bookmarkDepth}{#1}}
+\newcommand{\bookDepth}{\arabic{bookmarkDepth}}
+
+\endinput