diff options
Diffstat (limited to 'Master/texmf-dist/tex/lualatex')
-rw-r--r-- | Master/texmf-dist/tex/lualatex/ideavault/ideavault-lua.lua | 355 | ||||
-rw-r--r-- | Master/texmf-dist/tex/lualatex/ideavault/ideavault.sty | 67 |
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 |