update .gitignore
308
.gitignore
vendored
Normal file
@ -0,0 +1,308 @@
|
||||
## Core latex/pdflatex auxiliary files:
|
||||
*.aux
|
||||
*.lof
|
||||
*.log
|
||||
*.lot
|
||||
*.fls
|
||||
*.out
|
||||
*.toc
|
||||
*.fmt
|
||||
*.fot
|
||||
*.cb
|
||||
*.cb2
|
||||
.*.lb
|
||||
|
||||
## Intermediate documents:
|
||||
*.dvi
|
||||
*.xdv
|
||||
*-converted-to.*
|
||||
# these rules might exclude image files for figures etc.
|
||||
# *.ps
|
||||
# *.eps
|
||||
# *.pdf
|
||||
|
||||
## Generated if empty string is given at "Please type another file name for output:"
|
||||
.pdf
|
||||
|
||||
## Bibliography auxiliary files (bibtex/biblatex/biber):
|
||||
*.bbl
|
||||
*.bbl-SAVE-ERROR
|
||||
*.bcf
|
||||
*.bcf-SAVE-ERROR
|
||||
*.blg
|
||||
*-blx.aux
|
||||
*-blx.bib
|
||||
*.run.xml
|
||||
|
||||
## Build tool auxiliary files:
|
||||
*.fdb_latexmk
|
||||
*.synctex
|
||||
*.synctex(busy)
|
||||
*.synctex.gz
|
||||
*.synctex.gz(busy)
|
||||
*.pdfsync
|
||||
*.rubbercache
|
||||
rubber.cache
|
||||
|
||||
## Build tool directories for auxiliary files
|
||||
# latexrun
|
||||
latex.out/
|
||||
|
||||
## Auxiliary and intermediate files from other packages:
|
||||
# algorithms
|
||||
*.alg
|
||||
*.loa
|
||||
|
||||
# achemso
|
||||
acs-*.bib
|
||||
|
||||
# amsthm
|
||||
*.thm
|
||||
|
||||
# beamer
|
||||
*.nav
|
||||
*.pre
|
||||
*.snm
|
||||
*.vrb
|
||||
|
||||
# changes
|
||||
*.soc
|
||||
|
||||
# comment
|
||||
*.cut
|
||||
|
||||
# cprotect
|
||||
*.cpt
|
||||
|
||||
# elsarticle (documentclass of Elsevier journals)
|
||||
*.spl
|
||||
|
||||
# endnotes
|
||||
*.ent
|
||||
|
||||
# fixme
|
||||
*.lox
|
||||
|
||||
# feynmf/feynmp
|
||||
*.mf
|
||||
*.mp
|
||||
*.t[1-9]
|
||||
*.t[1-9][0-9]
|
||||
*.tfm
|
||||
|
||||
#(r)(e)ledmac/(r)(e)ledpar
|
||||
*.end
|
||||
*.?end
|
||||
*.[1-9]
|
||||
*.[1-9][0-9]
|
||||
*.[1-9][0-9][0-9]
|
||||
*.[1-9]R
|
||||
*.[1-9][0-9]R
|
||||
*.[1-9][0-9][0-9]R
|
||||
*.eledsec[1-9]
|
||||
*.eledsec[1-9]R
|
||||
*.eledsec[1-9][0-9]
|
||||
*.eledsec[1-9][0-9]R
|
||||
*.eledsec[1-9][0-9][0-9]
|
||||
*.eledsec[1-9][0-9][0-9]R
|
||||
|
||||
# glossaries
|
||||
*.acn
|
||||
*.acr
|
||||
*.glg
|
||||
*.glo
|
||||
*.gls
|
||||
*.glsdefs
|
||||
*.lzo
|
||||
*.lzs
|
||||
*.slg
|
||||
*.slo
|
||||
*.sls
|
||||
|
||||
# uncomment this for glossaries-extra (will ignore makeindex's style files!)
|
||||
# *.ist
|
||||
|
||||
# gnuplot
|
||||
*.gnuplot
|
||||
*.table
|
||||
|
||||
# gnuplottex
|
||||
*-gnuplottex-*
|
||||
|
||||
# gregoriotex
|
||||
*.gaux
|
||||
*.glog
|
||||
*.gtex
|
||||
|
||||
# htlatex
|
||||
*.4ct
|
||||
*.4tc
|
||||
*.idv
|
||||
*.lg
|
||||
*.trc
|
||||
*.xref
|
||||
|
||||
# hypdoc
|
||||
*.hd
|
||||
|
||||
# hyperref
|
||||
*.brf
|
||||
|
||||
# knitr
|
||||
*-concordance.tex
|
||||
# TODO Uncomment the next line if you use knitr and want to ignore its generated tikz files
|
||||
# *.tikz
|
||||
*-tikzDictionary
|
||||
|
||||
# listings
|
||||
*.lol
|
||||
|
||||
# luatexja-ruby
|
||||
*.ltjruby
|
||||
|
||||
# makeidx
|
||||
*.idx
|
||||
*.ilg
|
||||
*.ind
|
||||
|
||||
# minitoc
|
||||
*.maf
|
||||
*.mlf
|
||||
*.mlt
|
||||
*.mtc[0-9]*
|
||||
*.slf[0-9]*
|
||||
*.slt[0-9]*
|
||||
*.stc[0-9]*
|
||||
|
||||
# minted
|
||||
_minted*
|
||||
*.pyg
|
||||
|
||||
# morewrites
|
||||
*.mw
|
||||
|
||||
# newpax
|
||||
*.newpax
|
||||
|
||||
# nomencl
|
||||
*.nlg
|
||||
*.nlo
|
||||
*.nls
|
||||
|
||||
# pax
|
||||
*.pax
|
||||
|
||||
# pdfpcnotes
|
||||
*.pdfpc
|
||||
|
||||
# sagetex
|
||||
*.sagetex.sage
|
||||
*.sagetex.py
|
||||
*.sagetex.scmd
|
||||
|
||||
# scrwfile
|
||||
*.wrt
|
||||
|
||||
# svg
|
||||
svg-inkscape/
|
||||
|
||||
# sympy
|
||||
*.sout
|
||||
*.sympy
|
||||
sympy-plots-for-*.tex/
|
||||
|
||||
# pdfcomment
|
||||
*.upa
|
||||
*.upb
|
||||
|
||||
# pythontex
|
||||
*.pytxcode
|
||||
pythontex-files-*/
|
||||
|
||||
# tcolorbox
|
||||
*.listing
|
||||
|
||||
# thmtools
|
||||
*.loe
|
||||
|
||||
# TikZ & PGF
|
||||
*.dpth
|
||||
*.md5
|
||||
*.auxlock
|
||||
|
||||
# titletoc
|
||||
*.ptc
|
||||
|
||||
# todonotes
|
||||
*.tdo
|
||||
|
||||
# vhistory
|
||||
*.hst
|
||||
*.ver
|
||||
|
||||
# easy-todo
|
||||
*.lod
|
||||
|
||||
# xcolor
|
||||
*.xcp
|
||||
|
||||
# xmpincl
|
||||
*.xmpi
|
||||
|
||||
# xindy
|
||||
*.xdy
|
||||
|
||||
# xypic precompiled matrices and outlines
|
||||
*.xyc
|
||||
*.xyd
|
||||
|
||||
# endfloat
|
||||
*.ttt
|
||||
*.fff
|
||||
|
||||
# Latexian
|
||||
TSWLatexianTemp*
|
||||
|
||||
## Editors:
|
||||
# WinEdt
|
||||
*.bak
|
||||
*.sav
|
||||
|
||||
# Texpad
|
||||
.texpadtmp
|
||||
|
||||
# LyX
|
||||
*.lyx~
|
||||
|
||||
# Kile
|
||||
*.backup
|
||||
|
||||
# gummi
|
||||
.*.swp
|
||||
|
||||
# KBibTeX
|
||||
*~[0-9]*
|
||||
|
||||
# TeXnicCenter
|
||||
*.tps
|
||||
|
||||
# auto folder when using emacs and auctex
|
||||
./auto/*
|
||||
*.el
|
||||
|
||||
# expex forward references with \gathertags
|
||||
*-tags.tex
|
||||
|
||||
# standalone packages
|
||||
*.sta
|
||||
|
||||
# Makeindex log files
|
||||
*.lpz
|
||||
|
||||
# xwatermark package
|
||||
*.xwm
|
||||
|
||||
# REVTeX puts footnotes in the bibliography by default, unless the nofootinbib
|
||||
# option is specified. Footnotes are the stored in a file with suffix Notes.bib.
|
||||
# Uncomment the next line to have this generated file ignored.
|
||||
#*Notes.bib
|
||||
10
Chapters/Abstract.tex
Normal file
@ -0,0 +1,10 @@
|
||||
% A B S T R A C T
|
||||
% ---------------
|
||||
|
||||
\section*{Abstract}
|
||||
The abstract should not exceed 500 words or 2 pages. The abstract should explain the domain of the thesis, identify topic area, include the hypothesis or problem statement, provide a general overview of the methodology, and identify research benefits and key findings and/or contributions.
|
||||
|
||||
|
||||
|
||||
\cleardoublepage
|
||||
%\newpage
|
||||
159
Chapters/Chapter_01.tex
Normal file
@ -0,0 +1,159 @@
|
||||
%======================================================================
|
||||
|
||||
\chapter{Introduction}
|
||||
%======================================================================
|
||||
|
||||
%----------------------------------------------------------------------
|
||||
\section{Background}
|
||||
%----------------------------------------------------------------------
|
||||
|
||||
The global real estate market shows positive growth trends despite various challenges.
|
||||
Real estate market remains a key sector for people like homebuyers and investors,
|
||||
influenced by complex characteristics with heterogeneous nature and affected by numerous elements like policies and consumer trends.
|
||||
The market is projected to grow from \$4,143.71 billion in 2024 to \$4,466.58 billion in 2025, and global real estate investment volumes continue to increase in 2024\cite{JLL2025}.
|
||||
|
||||
Thailand's real estate market faces both challenges and opportunities in the current economic climate. The real estate market in Thailand,
|
||||
especially in Bangkok in 2024-2025, faces challenges such as high household debt, strict credit conditions, and rising costs causing market contraction,
|
||||
decreasing project launches by 43.72\% in 2024\cite{nationthailand1}. However, it also presents opportunities for recovery through foreign investment driven by tourism recovery,
|
||||
government incentives, and technological advancements. Condominiums remain attractive for rental yields and foreign buyers, while the housing market has moderate growth supported by infrastructure development.
|
||||
|
||||
% Additionally, Thailand's real estate information ecosystem suffers from several structural limitations,
|
||||
% including outdated listings, lack of official transaction data, and data
|
||||
% fragmentation\cite{bangkokpost1}. Addressing these issues is important for improving Thailand's
|
||||
% market accessibility and decision-making for both homebuyers and investors.
|
||||
|
||||
Crucially, these market opportunities can significantly undermined by Thailand's real estate information ecosystem, which suffers from several structural limitations, including outdated listings,
|
||||
lack of official transaction data, and data fragmentation\cite{bangkokpost1}. Addressing these issues is essential for maximizing Thailand's market potential and enabling effective decision-making
|
||||
for both homebuyers and investors seeking to capitalize on the available opportunities.
|
||||
|
||||
%----------------------------------------------------------------------
|
||||
\section{Problem Statement}
|
||||
%----------------------------------------------------------------------
|
||||
|
||||
Even with large amounts of real estate data available through various channels including
|
||||
property listings, historical transaction records, and news, investors still
|
||||
face challenges in aggregating, contextualizing, and deriving action from these
|
||||
sources. Additionally, the Thai real estate market has different characteristics
|
||||
from other countries because of the limited availability of official property
|
||||
transaction records, listing duplication across platforms, and less standardized
|
||||
data compared to more mature markets.
|
||||
|
||||
Current platforms in Thailand like DDProperty, Hipflat, and Baania lack many
|
||||
important contextual factors such as climate risk assessments, neighborhood-specific
|
||||
news, and local beliefs that influence property valuation and real estate
|
||||
investment in the long term.
|
||||
|
||||
While platforms like Zillow and House Canary have advanced and comprehensive
|
||||
real estate analytics, predictive analytics, and user-friendly interfaces, they do
|
||||
not operate in Thailand. Even if these advanced platforms were to enter the Thai
|
||||
market, they would face challenges adapting their algorithms to the local context.
|
||||
Their models are calibrated to markets with standardized property
|
||||
classifications, valuations that vary by developers, and consistent transaction
|
||||
data—elements that are limited in Thailand's real estate ecosystem.
|
||||
|
||||
The BorBann platform addresses these challenges and aims to help users by
|
||||
creating a real estate data platform integrated with artificial intelligence, geospatial
|
||||
analytics, and data aggregation by focusing on analytics rather than transaction
|
||||
facilitation.
|
||||
|
||||
%----------------------------------------------------------------------
|
||||
\section{Solution Overview}
|
||||
%----------------------------------------------------------------------
|
||||
|
||||
BorBann will function as real estate data platform to users, integrating multiple
|
||||
data sources with advanced analytics. Below are the features and their details.
|
||||
|
||||
\subsection{Customizable Automated Data Integration Pipeline}
|
||||
\begin{itemize}
|
||||
\item \textbf{Automated schema inference:} Analyze website structures to identify and extract key data elements
|
||||
\item \textbf{Field mapping:} Recognize equivalent fields across different sources (e.g., "price" vs "cost")
|
||||
\item \textbf{Integration framework:} Seamless connection with data export systems
|
||||
\item \textbf{Multi-source support:} Process data from websites, APIs, and uploaded files
|
||||
\end{itemize}
|
||||
|
||||
\subsection{Retrain Model with Data from Pipeline}
|
||||
\begin{itemize}
|
||||
\item \textbf{Custom prediction model:} Create custom prediction models by combining their pipeline data with platform data sources
|
||||
\end{itemize}
|
||||
|
||||
\subsection{Local Contextual Analytics}
|
||||
\begin{itemize}
|
||||
\item \textbf{Environmental risk assessment:} Evaluate flood risk, natural disaster vulnerability, and air quality
|
||||
\item \textbf{Facility proximity analysis:} Calculate accessibility to schools, hospitals, transit, and commercial centers
|
||||
\item \textbf{Neighborhood quality scoring:} Generate composite metrics for area evaluation
|
||||
\end{itemize}
|
||||
|
||||
\subsection{Explainable Price Prediction Model}
|
||||
\begin{itemize}
|
||||
\item \textbf{Feature importance analysis:} Quantify and rank factors influencing property prices
|
||||
\item \textbf{Adjustable characteristics modeling:} Adjust property characteristics to visualize price impacts
|
||||
\item \textbf{Confidence intervals:} Provide lower/upper price bounds for realistic expectations
|
||||
\item \textbf{Factor categorization:} Group influences by type (property features, location, market trends)
|
||||
\item \textbf{Natural language explanations:} Generate readable summaries of price determinants
|
||||
\item \textbf{Visual breakdowns:} Display contribution percentages and relationship graphs
|
||||
\end{itemize}
|
||||
|
||||
\subsection{Geospatial Visualization}
|
||||
\begin{itemize}
|
||||
\item \textbf{Heatmap generation:} Create density visualizations for environmental factors, pricing, and metrics
|
||||
\item \textbf{Geospatial analytics:} Calculate analytics for custom geographic areas
|
||||
\end{itemize}
|
||||
\newpage
|
||||
|
||||
%----------------------------------------------------------------------
|
||||
\section{Target User}
|
||||
%----------------------------------------------------------------------
|
||||
|
||||
\begin{table}[htbp]
|
||||
\centering
|
||||
\renewcommand{\arraystretch}{1.3}
|
||||
\begin{tabular}{>{\raggedright\arraybackslash}p{0.25\textwidth}>{\raggedright\arraybackslash}p{0.35\textwidth}>{\raggedright\arraybackslash}p{0.3\textwidth}}
|
||||
\toprule \rowcolor[gray]{0.9} \textbf{User Type} & \textbf{Description} & \textbf{Needs} \\
|
||||
\midrule \textbf{Real Estate Investors} & Individuals focused on maximizing long-term investment, including foreign investors & \begin{itemize}\item Investment analysis
|
||||
|
||||
\item Supporting data for decision making
|
||||
\end{itemize} \\
|
||||
\addlinespace \rowcolor[gray]{0.95} \textbf{Homebuyers} & First-time purchasers, residents looking to relocate within Thailand, and expats seeking housing & \begin{itemize}\item Property comparisons
|
||||
|
||||
\item Neighborhood insights
|
||||
|
||||
\item Pricing guidance\end{itemize} \\
|
||||
\bottomrule
|
||||
\end{tabular}
|
||||
\caption{Target Users and Their Needs}
|
||||
\label{tab:users}
|
||||
\end{table}
|
||||
|
||||
%----------------------------------------------------------------------
|
||||
\section{Benefit}
|
||||
%----------------------------------------------------------------------
|
||||
|
||||
The BorBann platform will provide numerous benefits to the Thai real estate market.
|
||||
It improves market transparency by enhancing accessibility to market information.
|
||||
It also helps both homebuyers and investors reduce research time, achieve lower
|
||||
transaction risks, and discover overlooked investment opportunities.
|
||||
Additionally, the platform will effectively represent the unique characteristics
|
||||
of the Thai real estate market.
|
||||
|
||||
\newpage
|
||||
|
||||
%----------------------------------------------------------------------
|
||||
\section{Terminology}
|
||||
%----------------------------------------------------------------------
|
||||
|
||||
\begin{table}[htbp]
|
||||
\centering
|
||||
\renewcommand{\arraystretch}{1.3}
|
||||
\begin{tabular}{>{\raggedright\arraybackslash}p{0.3\textwidth}>{\raggedright\arraybackslash}p{0.6\textwidth}}
|
||||
\toprule \rowcolor[gray]{0.9} \textbf{Term} & \textbf{Definition} \\
|
||||
\addlinespace \textbf{Local Analytics} & Analysis focused on extremely specific geographic areas, such as neighborhoods or even individual streets, to provide highly relevant insights. \\
|
||||
\addlinespace \rowcolor[gray]{0.95} \textbf{Price Prediction Model} & An algorithm or statistical model that forecasts property values based on historical data, market trends, and various property characteristics. \\
|
||||
\addlinespace \textbf{Proximity Analysis} & The study of spatial relationships between geographic features, typically to evaluate the distance between properties and amenities or services. \\
|
||||
\addlinespace \rowcolor[gray]{0.95} \textbf{Geospatial Visualization} & The graphical representation of data with a geographic or spatial component, often through maps and interactive displays. \\
|
||||
\bottomrule
|
||||
\end{tabular}
|
||||
\caption{Terminology}
|
||||
\label{tab:terminology}
|
||||
\end{table}
|
||||
|
||||
|
||||
82
Chapters/Chapter_02.tex
Normal file
@ -0,0 +1,82 @@
|
||||
% Some LaTeX commands I define for my own nomenclature.
|
||||
% If you have to, it's better to change nomenclature once here than in a
|
||||
% million places throughout your thesis!
|
||||
\newcommand{\package}[1]{\textbf{#1}} % package names in bold text
|
||||
\newcommand{\cmmd}[1]{\textbackslash\texttt{#1}} % command name in tt font
|
||||
|
||||
|
||||
%======================================================================
|
||||
\chapter{Literature Review and Related Work}
|
||||
%======================================================================
|
||||
|
||||
% This is Chapter 02!
|
||||
% Author \cite{al2020generalizing} presented....
|
||||
% Author \cite{elayan2021digital} proposed...
|
||||
% Author \cite{10223206} implemented...
|
||||
|
||||
This chapter presents a review of existing platforms in the domain of real estate analytics and information systems.
|
||||
This review includes both international and Thai platforms, their features, strengths, and limitations.
|
||||
The analysis establishes the current state of real estate information platforms and identifies opportunities
|
||||
for the BorBann platform to address unmet needs in the Thai market.
|
||||
|
||||
\section{Competitor Analysis}
|
||||
|
||||
Many real estate platforms primarily function as property listing aggregators rather than comprehensive information systems.
|
||||
Their features support transaction facilitation through showcasing available properties, while offering limited analytical tools for market understanding.
|
||||
However, platforms like House Canary represent exceptions, operating specifically as information systems that provide investors with
|
||||
data analytics and market insights to support evidence-based decision-making in real estate investments.
|
||||
|
||||
\begin{table}[htbp]
|
||||
\centering
|
||||
\renewcommand{\arraystretch}{1.3}
|
||||
\resizebox{0.9\textwidth}{!}{ % Adjust width to 90% of text width
|
||||
\begin{tabular}{>{\raggedright\arraybackslash}p{0.35\textwidth}>{\centering\arraybackslash}p{0.15\textwidth}>{\centering\arraybackslash}p{0.15\textwidth}>{\centering\arraybackslash}p{0.15\textwidth}>{\centering\arraybackslash}p{0.15\textwidth}>{\centering\arraybackslash}p{0.15\textwidth}}
|
||||
\toprule \rowcolor[gray]{0.9}
|
||||
\textbf{Feature} & \textbf{BorBann (Proposed)} & \textbf{DDProperty} & \textbf{Hipflat} & \textbf{House Canary} & \textbf{Zillow} \\
|
||||
\midrule
|
||||
\textbf{Customizable Automated Data Integration Pipeline} & \textbf{Yes} & No & No & No & No \\
|
||||
\addlinespace \textbf{Retrain Model with Data from Pipeline} & \textbf{Yes} & No & No & No & No \\
|
||||
\addlinespace \textbf{Local Contextual Analytics} & \textbf{Yes} & No & No & Yes (Not optimized for Thailand) & Yes (Not optimized for Thailand) \\
|
||||
\addlinespace \textbf{Explainable Price Prediction Model} & \textbf{Yes} & No & No & No & No \\
|
||||
\addlinespace \textbf{Geospatial Visualization} & \textbf{Yes} & Yes & Yes & Yes & Yes \\
|
||||
\bottomrule
|
||||
\end{tabular}
|
||||
}
|
||||
\caption{Feature Comparison: BorBann vs Other Platforms}
|
||||
\label{tab:feature-comparison}
|
||||
\end{table}
|
||||
|
||||
Table \ref{tab:feature-comparison} demonstrates BorBann's technical advantages in the real estate analytics market. While all platforms offer geospatial visualization,
|
||||
BorBann's implementation includes advanced analytics like climate assessment, matching international platforms but surpassing local Thai competitors.
|
||||
BorBann's automated data integration pipeline collects analytics-ready data automatically, unlike Thai platforms that rely on user inputs. Also, user can use that data to create their custom models.
|
||||
For local contextual analytics, BorBann provides Thailand-optimized insights including weather patterns and population density,
|
||||
whereas DDProperty/Hipflat only show basic nearby facilities, and international platforms lack Thailand-specific optimization.
|
||||
Most distinctively, BorBann's price prediction model prioritizes explainability and interpretability,
|
||||
revealing the reasoning behind valuations rather than presenting opaque predictions like competing platforms.
|
||||
|
||||
|
||||
\begin{table}[htbp]
|
||||
\centering
|
||||
\renewcommand{\arraystretch}{1.3}
|
||||
\resizebox{0.9\textwidth}{!}{
|
||||
\begin{tabular}{>{\raggedright\arraybackslash}p{0.25\textwidth}>{\centering\arraybackslash}p{0.15\textwidth}>{\centering\arraybackslash}p{0.15\textwidth}>{\centering\arraybackslash}p{0.15\textwidth}>{\centering\arraybackslash}p{0.15\textwidth}>{\centering\arraybackslash}p{0.15\textwidth}}
|
||||
\toprule \rowcolor[gray]{0.9}
|
||||
\textbf{Technical Aspect} & \textbf{DDProperty} & \textbf{Hipflat} & \textbf{House Canary} & \textbf{Zillow} & \textbf{BorBann (Proposed)} \\
|
||||
\midrule
|
||||
\textbf{Data Sources} & User-submitted, Proprietary & User-submitted, Proprietary & Proprietary & Multiple Sources, Proprietary & Open Data, User-submitted \\
|
||||
\addlinespace \rowcolor[gray]{0.95} \textbf{ML Implementation} & Basic Prediction & None & Black-box Models & Black-box Models & Explainable Models \\
|
||||
\bottomrule
|
||||
\end{tabular}
|
||||
}
|
||||
\caption{Comprehensive Technical Comparison}
|
||||
\label{tab:competitor-analysis}
|
||||
\end{table}
|
||||
|
||||
Table \ref{tab:competitor-analysis} highlights key technical differences between BorBann and competing platforms.
|
||||
For data sources, while competitors rely heavily on government or user-submitted data, BorBann uniquely leverages open data combined with
|
||||
APIs to build a more comprehensive dataset. Regarding machine learning, BorBann distinguishes itself by implementing explainable models,
|
||||
providing transparency in its predictions. This contrasts with DDProperty's basic prediction capabilities, Hipflat's complete lack of ML features,
|
||||
and the black-box approaches of House Canary and Zillow where prediction logic remains hidden from users.
|
||||
|
||||
% \section{Literature Review}
|
||||
|
||||
894
Chapters/Chapter_03.tex
Normal file
@ -0,0 +1,894 @@
|
||||
%======================================================================
|
||||
\chapter{Requirement Analysis}
|
||||
%======================================================================
|
||||
|
||||
% %----------------------------------------------------------------------
|
||||
% \section{Stakeholder Analysis}
|
||||
% %----------------------------------------------------------------------
|
||||
|
||||
% The successful implementation of the BorBann platform requires a understanding of all parties who may influence or be affected by the system. This stakeholder analysis identifies key individuals and groups, their interests, influence levels, and specific requirements.
|
||||
|
||||
%----------------------------------------------------------------------
|
||||
\section{Stakeholder Analysis}
|
||||
%----------------------------------------------------------------------
|
||||
|
||||
The stakeholder landscape for BorBann includes primary stakeholders who directly interact with the platform and secondary stakeholders who indirectly influence its adoption and effectiveness. Recognizing these groups' specific needs helps develop a platform that delivers value across the real estate ecosystem.
|
||||
|
||||
\begin{table}[htbp]
|
||||
\centering
|
||||
\renewcommand{\arraystretch}{1.3}
|
||||
\resizebox{0.95\textwidth}{!}{
|
||||
\begin{tabular}{>{\raggedright\arraybackslash}p{0.2\textwidth}>{\raggedright\arraybackslash}p{0.2\textwidth}>{\raggedright\arraybackslash}p{0.3\textwidth}>{\raggedright\arraybackslash}p{0.3\textwidth}}
|
||||
\toprule \rowcolor[gray]{0.9}
|
||||
\textbf{Stakeholder Category} & \textbf{Stakeholder Group} & \textbf{Key Interests} & \textbf{Primary Requirements} \\
|
||||
\midrule
|
||||
\textbf{Primary} & Real Estate Investors & Environment risk assessment & Advanced analytics, predictive modeling, risk scoring \\
|
||||
\addlinespace \rowcolor[gray]{0.95} \textbf{Primary} & Homebuyers & Affordability, area quality, lifestyle alignment, environmental factors & User-friendly interface, neighborhood insights, price comparisons, risk assessments \\
|
||||
\addlinespace \textbf{Secondary} & Real Estate Agencies & Market positioning, client advisement, property valuation & Property data, reliable market insights \\
|
||||
\bottomrule
|
||||
\end{tabular}
|
||||
}
|
||||
\caption{BorBann Platform Stakeholder Summary}
|
||||
\label{tab:stakeholder-summary}
|
||||
\end{table}
|
||||
|
||||
The primary stakeholders are direct users who rely on BorBann's capabilities for informed real estate decisions. Their requirements range from investment analytics to intuitive neighborhood quality assessments. Secondary stakeholders like real estate agencies can influence platform adoption and serve as valuable data partners.
|
||||
|
||||
|
||||
\subsection{Primary Stakeholders}
|
||||
|
||||
Primary stakeholders are those who directly use or are significantly affected by the BorBann platform. They rely on its capabilities to make informed decisions about real estate investments, purchases, and market trends.
|
||||
|
||||
\subsubsection{Real Estate Investors}
|
||||
Real estate investors use BorBann to identify profitable investment, assess risks, and make data-driven decisions.
|
||||
|
||||
\textbf{Interests and Concerns:}
|
||||
\begin{itemize}
|
||||
\item Maximizing return on investment
|
||||
\item Identifying growth areas
|
||||
\item Risk assessment
|
||||
\item Diversification across neighborhoods and property classes
|
||||
\end{itemize}
|
||||
|
||||
\textbf{Requirements:}
|
||||
\begin{itemize}
|
||||
\item Advanced analytics tools that is customizable
|
||||
\item Predictive price modeling with easy to understand explaination
|
||||
\item Risk scores in each area based on multiple factors
|
||||
\end{itemize}
|
||||
|
||||
\subsubsection{Homebuyers}
|
||||
Homebuyers rely on BorBann to find properties that align with their budget, lifestyle, and long-term needs. The platform helps them assess affordability, neighborhood quality, and potential risks.
|
||||
|
||||
\textbf{Interests and Concerns:}
|
||||
\begin{itemize}
|
||||
\item Property affordability and financing options
|
||||
\item Area quality
|
||||
\item Location amenities and lifestyle alignment
|
||||
\item Environmental factors including flood and pollution risks
|
||||
\item Commute time to work, schools, and essential services
|
||||
\item School districts and educational quality
|
||||
\end{itemize}
|
||||
|
||||
\textbf{Requirements:}
|
||||
\begin{itemize}
|
||||
\item Intuitive, user-friendly interface with minimal learning curve
|
||||
\item Comprehensive neighborhood insights including safety metrics
|
||||
\item Price comparison tools with historical context
|
||||
\item Property quality and developer reputation metrics
|
||||
\item Detailed flood risk and environmental quality assessment
|
||||
\item Transit accessibility maps with time-based visualizations
|
||||
\item Education quality indicators and school zone mapping
|
||||
\end{itemize}
|
||||
|
||||
\subsection{Secondary Stakeholders}
|
||||
|
||||
Secondary stakeholders are indirectly impacted by the BorBann platform, influencing its adoption, data availability, and overall market reach.
|
||||
|
||||
\subsubsection{Real Estate Agencies}
|
||||
Real estate agencies act as intermediaries between property buyers and sellers. They use BorBann to improve their advisory services, gain a competitive edge, and provide market insights to clients.
|
||||
|
||||
\textbf{Interests and Concerns:}
|
||||
\begin{itemize}
|
||||
\item Market positioning relative to competitors
|
||||
\item Client advisement based on reliable data
|
||||
\item Access to comprehensive property information
|
||||
\item Accurate property valuation to support transactions
|
||||
\end{itemize}
|
||||
|
||||
\textbf{Influence:}
|
||||
\begin{itemize}
|
||||
\item Potential data partners and platform promoters
|
||||
\item Can significantly influence adoption rates among clients
|
||||
\item May provide valuable transaction data not available elsewhere
|
||||
\end{itemize}
|
||||
|
||||
%----------------------------------------------------------------------
|
||||
\section{User Stories}
|
||||
%----------------------------------------------------------------------
|
||||
|
||||
User stories capture the essential needs and goals of the BorBann platform's target users from their perspective. These stories follow the standard format: "As a [user type], I want to [action/feature] so that [benefit/value]."
|
||||
|
||||
\begin{longtable}{>{\raggedright\arraybackslash}p{0.4\textwidth}>{\raggedright\arraybackslash}p{0.6\textwidth}}
|
||||
\caption{User Stories with Acceptance Criteria\label{tab:user-stories}}\\
|
||||
|
||||
\toprule \rowcolor[gray]{0.9}
|
||||
\textbf{User Story} & \textbf{Acceptance Criteria} \\
|
||||
\midrule
|
||||
\endfirsthead
|
||||
|
||||
\multicolumn{2}{c}{\tablename\ \thetable{} -- Continued from previous page} \\
|
||||
\toprule \rowcolor[gray]{0.9}
|
||||
\textbf{User Story} & \textbf{Acceptance Criteria} \\
|
||||
\midrule
|
||||
\endhead
|
||||
|
||||
\midrule
|
||||
\multicolumn{2}{r}{Continued on next page} \\
|
||||
\endfoot
|
||||
|
||||
\bottomrule
|
||||
\endlastfoot
|
||||
|
||||
\multicolumn{2}{l}{\textbf{Customizable Automated Data Integration Pipeline}} \\
|
||||
\midrule
|
||||
As a non-technical user, I want to input a website URL and have the system automatically generate a scraping configuration, so I can collect data without coding skills &
|
||||
\begin{itemize}
|
||||
\item System provides visual confirmation of detected data structure
|
||||
\item Non-technical users can successfully create a working pipeline in under 5 minutes
|
||||
\end{itemize} \\
|
||||
|
||||
\rowcolor[gray]{0.95}
|
||||
As a user, I want to paste multiple URLs from the same website pattern and have the system recognize the common structure, so I can efficiently collect data from similar pages &
|
||||
\begin{itemize}
|
||||
\item System identifies common patterns across multiple URLs from the same website
|
||||
\item A single configuration works for all provided URLs from the same pattern
|
||||
\end{itemize} \\
|
||||
|
||||
As a user, I want to upload data files (CSV, JSON) as alternative data sources to integrate with my scraped data &
|
||||
\begin{itemize}
|
||||
\item System accepts uploads of CSV and JSON files up to 50MB
|
||||
\item Automatic schema detection for uploaded files with 90\% accuracy
|
||||
\end{itemize} \\
|
||||
|
||||
\rowcolor[gray]{0.95}
|
||||
As a user, I want to customize the output format and template via an intuitive UI &
|
||||
\begin{itemize}
|
||||
\item User can select from at least 4 output formats (JSON, CSV, SQLite, YAML)
|
||||
\item UI provides visual preview of output format before confirmation
|
||||
\end{itemize} \\
|
||||
|
||||
As a user, I want to schedule my data pipeline to run automatically at specified intervals &
|
||||
\begin{itemize}
|
||||
\item Interface allows setting schedule frequency (hourly, daily, weekly, monthly)
|
||||
\item Timezone selection is available for scheduling
|
||||
\end{itemize} \\
|
||||
|
||||
\rowcolor[gray]{0.95}
|
||||
As a user, I want a dashboard showing all my data pipelines with their status and last run time &
|
||||
\begin{itemize}
|
||||
\item Dashboard displays all pipelines with status indicators
|
||||
\item Last run time and next scheduled run are clearly shown
|
||||
\end{itemize} \\
|
||||
|
||||
\midrule
|
||||
\multicolumn{2}{l}{\textbf{Local Contextual Analytics}} \\
|
||||
\midrule
|
||||
As a user, I can see all contextual data for specific areas to make informed decisions &
|
||||
\begin{itemize}
|
||||
\item System displays at least 5 contextual data points for any selected area
|
||||
\item Historical trends for environmental factors available for at least 12 months
|
||||
\end{itemize} \\
|
||||
|
||||
\rowcolor[gray]{0.95}
|
||||
As a user, I want to see flood risk assessments for properties with historical flooding data &
|
||||
\begin{itemize}
|
||||
\item Flood risk presented on a 5-point scale with historical context
|
||||
\item System shows flood history for the past 10 years when available
|
||||
\end{itemize} \\
|
||||
|
||||
As a user, I want to see daily air quality metrics around a property with historical trends &
|
||||
\begin{itemize}
|
||||
\item Air quality index displayed with daily updates
|
||||
\item Historical air quality data presented in trend graphs
|
||||
\end{itemize} \\
|
||||
|
||||
\rowcolor[gray]{0.95}
|
||||
As a user, I want to see all schools within a custom radius, including distance, ratings, and types &
|
||||
\begin{itemize}
|
||||
\item System displays all schools within user-defined radius
|
||||
\item Each school listing includes distance, type, and quality rating
|
||||
\end{itemize} \\
|
||||
|
||||
As a user, I want to view healthcare facilities near a property with distance and service information &
|
||||
\begin{itemize}
|
||||
\item Healthcare facilities categorized by type (hospital, clinic, etc.)
|
||||
\item Distance and basic service information provided for each facility
|
||||
\end{itemize} \\
|
||||
|
||||
\midrule
|
||||
\multicolumn{2}{l}{\textbf{Explainable Price Prediction Model}} \\
|
||||
\midrule
|
||||
As a user, I want to see how specific contextual factors influence the property's predicted price &
|
||||
\begin{itemize}
|
||||
\item System displays top 5 factors influencing price with percentage contribution
|
||||
\item Visual indicators show positive/negative impact of each factor
|
||||
\end{itemize} \\
|
||||
|
||||
\rowcolor[gray]{0.95}
|
||||
As a user, I want the model to be interpretable so I can understand factors affecting the price &
|
||||
\begin{itemize}
|
||||
\item Plain language explanations accompany each prediction
|
||||
\item Interactive elements allow exploration of factor relationships
|
||||
\end{itemize} \\
|
||||
|
||||
As a user, I want a statement or reason to back the prediction so I can trust the system's valuation &
|
||||
\begin{itemize}
|
||||
\item Each prediction includes at least 3 specific supporting statements
|
||||
\item System indicates confidence level for each prediction
|
||||
\end{itemize} \\
|
||||
|
||||
\rowcolor[gray]{0.95}
|
||||
As a user, I want to see a predicted price range for any property I select &
|
||||
\begin{itemize}
|
||||
\item System shows lower and upper bounds for predicted price
|
||||
\end{itemize} \\
|
||||
|
||||
As a user, I want to understand how the model derives the result so I can explain the valuation to others &
|
||||
\begin{itemize}
|
||||
\item System provides visual breakdown of prediction process
|
||||
\end{itemize} \\
|
||||
|
||||
\midrule
|
||||
\multicolumn{2}{l}{\textbf{Geospatial Visualization}} \\
|
||||
\midrule
|
||||
As a user, I can see property listings on the map and click them to view detailed information &
|
||||
\begin{itemize}
|
||||
\item Property details popup appears within 1 second of clicking a marker
|
||||
\item Popup contains at least 5 key property attributes
|
||||
\end{itemize} \\
|
||||
|
||||
\rowcolor[gray]{0.95}
|
||||
As a user, I can see sections of the same property group to identify properties from the same development &
|
||||
\begin{itemize}
|
||||
\item Properties from same development visually grouped with distinct boundaries
|
||||
\item Group name appears when hovering over grouped properties
|
||||
\end{itemize} \\
|
||||
|
||||
As a user, I can see multiple map visualization types to analyze different environmental factors &
|
||||
\begin{itemize}
|
||||
\item System offers at least 5 different visualization overlays
|
||||
\item Users can toggle between visualizations without page reload
|
||||
\end{itemize} \\
|
||||
|
||||
\rowcolor[gray]{0.95}
|
||||
As a user, I want to pan and zoom on an interactive property map to explore different areas efficiently &
|
||||
\begin{itemize}
|
||||
\item Map responds to standard pan/zoom gestures within 100ms
|
||||
\item Property markers adjust density based on zoom level
|
||||
\end{itemize} \\
|
||||
|
||||
As a user, I want to set a custom radius around a point on the map to analyze the surrounding area &
|
||||
\begin{itemize}
|
||||
\item User can place and adjust analysis radius on any map location
|
||||
\item Contextual analytics update in real-time as radius is moved
|
||||
\end{itemize} \\
|
||||
|
||||
\midrule
|
||||
\multicolumn{2}{l}{\textbf{Retrain Model with Data from Pipeline}} \\
|
||||
\midrule
|
||||
As a non-technical user, I want to select one of my existing data pipelines as a source for model training &
|
||||
\begin{itemize}
|
||||
\item User can select any active pipeline as a data source through a simple dropdown
|
||||
\item System validates data compatibility before starting training process
|
||||
\end{itemize} \\
|
||||
|
||||
\rowcolor[gray]{0.95}
|
||||
As a user, I want to select from recommended model types appropriate for my data &
|
||||
\begin{itemize}
|
||||
\item System suggests optimal model types based on data characteristics
|
||||
\item Each model type includes a simple explanation of its strengths and use cases
|
||||
\end{itemize} \\
|
||||
|
||||
As a user, I want to start the model training process with a single click after selecting my data sources &
|
||||
\begin{itemize}
|
||||
\item Training begins with a single action after configuration
|
||||
\item System provides confirmation that training has started
|
||||
\end{itemize} \\
|
||||
|
||||
\rowcolor[gray]{0.95}
|
||||
As a user, I want to see how accurate my trained model is compared to platform default models &
|
||||
\begin{itemize}
|
||||
\item Performance metrics displayed with comparative benchmark against standard models
|
||||
\item Visualizations show improvement or differences in prediction accuracy
|
||||
\end{itemize} \\
|
||||
|
||||
As a user, I want to activate my newly trained model with a single click to apply it across the platform &
|
||||
\begin{itemize}
|
||||
\item Model activation changes system behavior immediately
|
||||
\item Visual indicator shows which model is currently active
|
||||
\end{itemize} \\
|
||||
|
||||
\rowcolor[gray]{0.95}
|
||||
As a user, I want to see a list of all models I've trained with performance metrics and creation dates &
|
||||
\begin{itemize}
|
||||
\item Management interface displays all user models with key metadata
|
||||
\item Models can be sorted and filtered by different attributes
|
||||
\end{itemize} \\
|
||||
|
||||
As a user, I want to receive clear explanations if my pipeline data is unsuitable for training &
|
||||
\begin{itemize}
|
||||
\item System provides specific feedback about data quality issues
|
||||
\item Suggestions for data improvements are provided when problems are detected
|
||||
\end{itemize} \\
|
||||
|
||||
\end{longtable}
|
||||
|
||||
\pagebreak
|
||||
%======================================================================
|
||||
\section{Use Case Diagram}
|
||||
%======================================================================
|
||||
|
||||
The Use Case Diagram for the BorBann platform, shown in Figure \ref{fig:use-case-diagram}, illustrates the primary interactions between the system and its three main user types: Real Estate Investors, Homebuyers, and Property Developers. The diagram captures the core functionality of the platform and how different users interact with its features.
|
||||
|
||||
\begin{figure}[htbp]
|
||||
\centering
|
||||
\includegraphics[width=0.8\textwidth]{assets/BorBann_Use_Case_Diagram.png}
|
||||
\caption{Use Case Diagram}
|
||||
\label{fig:use-case-diagram}
|
||||
\end{figure}
|
||||
|
||||
|
||||
\subsection{Primary Actors}
|
||||
|
||||
The use case diagram identifies five key actors interacting with the BorBann system:
|
||||
|
||||
\begin{itemize}
|
||||
\item \textbf{Real Estate Investor}
|
||||
Seeks in-depth property analytics, market trends, and investment decision support.
|
||||
|
||||
\item \textbf{Homebuyer}
|
||||
Interested in residential properties, lifestyle factors, and long-term value.
|
||||
|
||||
\item \textbf{Data Analytic Service}
|
||||
Provides analytic capabilities to support prediction and data analysis features.
|
||||
|
||||
\item \textbf{External Data Service}
|
||||
Supplies third-party data inputs via APIs and other integrations.
|
||||
|
||||
\item \textbf{System Scheduler}
|
||||
Automates routine system tasks such as scheduled data refresh operations.
|
||||
\end{itemize}
|
||||
|
||||
\subsection{Core Use Cases}
|
||||
|
||||
The BorBann platform provides the following primary functionalities:
|
||||
|
||||
\begin{itemize}
|
||||
\item \textbf{Analyze Property Data}
|
||||
Allows users to examine detailed property information, metrics, and comparisons.
|
||||
\begin{itemize}
|
||||
\item \textit{Includes:} Assess Neighborhood
|
||||
\item \textit{Extended by:} Explainable Price Prediction
|
||||
\end{itemize}
|
||||
|
||||
\item \textbf{Geospatial Visualization}
|
||||
Interactive map-based visualization of property and neighborhood data.
|
||||
\begin{itemize}
|
||||
\item \textit{Extended by:} Set Custom Radius, View Proximity Analysis
|
||||
\end{itemize}
|
||||
|
||||
\item \textbf{Assess Neighborhood}
|
||||
Evaluates contextual factors around properties (e.g., schools, amenities).
|
||||
\begin{itemize}
|
||||
\item \textit{Includes:} View Factor Influence
|
||||
\item \textit{Extended by:} Check Environmental Risks
|
||||
\end{itemize}
|
||||
|
||||
\item \textbf{Explainable Price Prediction}
|
||||
AI-generated pricing insights with interpretable influencing factors.
|
||||
\begin{itemize}
|
||||
\item \textit{Includes:} View Factor Influence
|
||||
\end{itemize}
|
||||
|
||||
\item \textbf{Configure Data Pipeline}
|
||||
Enables setup of automated ingestion of external data from APIs and sources.
|
||||
\begin{itemize}
|
||||
\item \textit{Includes:} Process External Data Sources
|
||||
\item \textit{Extended by:} Schedule Data Updates
|
||||
\end{itemize}
|
||||
\end{itemize}
|
||||
|
||||
\subsection{Extended Functionality}
|
||||
|
||||
The following optional use cases extend the platform’s functionality:
|
||||
|
||||
\begin{itemize}
|
||||
\item \textbf{View Proximity Analysis}
|
||||
Triggered when users want detailed proximity-based data (e.g., nearby schools, transport).
|
||||
|
||||
\item \textbf{Set Custom Radius}
|
||||
Adds user-defined range settings for map-based filtering and analysis.
|
||||
|
||||
\item \textbf{Schedule Data Updates}
|
||||
Automates periodic refreshes of data pipelines using system scheduler logic.
|
||||
|
||||
\item \textbf{Check Environmental Risks}
|
||||
Enables users to access data on environmental threats (e.g., flood zones, pollution).
|
||||
\end{itemize}
|
||||
|
||||
\subsection{Actor-System Interactions}
|
||||
|
||||
Each actor interacts with the system in distinct ways, as shown in the diagram:
|
||||
|
||||
\begin{itemize}
|
||||
\item \textbf{Real Estate Investor}
|
||||
\begin{itemize}
|
||||
\item Initiates \textit{Analyze Property Data}, \textit{Geospatial Visualization}, and \textit{Configure Data Pipeline}
|
||||
\item Benefits from extended insights like \textit{Set Custom Radius}, \textit{View Proximity Analysis}, and \textit{Explainable Price Prediction}
|
||||
\end{itemize}
|
||||
|
||||
\item \textbf{Homebuyer}
|
||||
\begin{itemize}
|
||||
\item Accesses \textit{Analyze Property Data}, \textit{Geospatial Visualization}, \textit{Assess Neighborhood}, and \textit{Explainable Price Prediction}
|
||||
\item Makes use of neighborhood-specific features like \textit{View Factor Influence} and \textit{Check Environmental Risks}
|
||||
\end{itemize}
|
||||
|
||||
\item \textbf{Data Analytic Service}
|
||||
\begin{itemize}
|
||||
\item Collaborates with the system to enable \textit{Explainable Price Prediction}
|
||||
\end{itemize}
|
||||
|
||||
\item \textbf{External Data Service}
|
||||
\begin{itemize}
|
||||
\item Supports \textit{Process External Data Sources} as part of the data ingestion workflow
|
||||
\end{itemize}
|
||||
|
||||
\item \textbf{System Scheduler}
|
||||
\begin{itemize}
|
||||
\item Triggers \textit{Schedule Data Updates} as an automated background process
|
||||
\end{itemize}
|
||||
\end{itemize}
|
||||
|
||||
\subsection{Use Case Relationships}
|
||||
|
||||
\begin{itemize}
|
||||
\item \textbf{\textless{}\textless{}include\textgreater{}\textgreater{}}
|
||||
Represents mandatory sub-functions:
|
||||
\begin{itemize}
|
||||
\item \textit{View Factor Influence} is included in both \textit{Assess Neighborhood} and \textit{Explainable Price Prediction}
|
||||
\item \textit{Process External Data Sources} is included in \textit{Configure Data Pipeline}
|
||||
\end{itemize}
|
||||
|
||||
\item \textbf{\textless{}\textless{}extend\textgreater{}\textgreater{}}
|
||||
Represents optional or conditional behavior:
|
||||
\begin{itemize}
|
||||
\item \textit{Set Custom Radius} and \textit{View Proximity Analysis} extend \textit{Geospatial Visualization}
|
||||
\item \textit{Check Environmental Risks} extends \textit{Assess Neighborhood}
|
||||
\item \textit{Schedule Data Updates} extends \textit{Configure Data Pipeline}
|
||||
\end{itemize}
|
||||
\end{itemize}
|
||||
|
||||
%----------------------------------------------------------------------
|
||||
\section{Use Case Model}
|
||||
%----------------------------------------------------------------------
|
||||
|
||||
The Use Case Model details the interactions depicted in the Use Case Diagram, describing each use case within BorBann's core features.
|
||||
|
||||
% \begin{table}[htbp]
|
||||
% \centering
|
||||
% \renewcommand{\arraystretch}{1.3}
|
||||
% \begin{tabular}{|>{\columncolor[gray]{0.95}}p{0.25\textwidth}|p{0.65\textwidth}|}
|
||||
% \hline
|
||||
% \rowcolor[gray]{0.9} \textbf{Use Case Name} & \textbf{Search Properties \& Listings} \\
|
||||
% \hline
|
||||
% \textbf{Actors} & Real Estate Investor, Homebuyer, Property Developer \\
|
||||
% \hline
|
||||
% \textbf{Description} & Allows users to search for properties based on various criteria and view results in a structured format \\
|
||||
% \hline
|
||||
% \textbf{Preconditions} & User is logged into the system \\
|
||||
% \hline
|
||||
% \textbf{Basic Flow} &
|
||||
% \begin{enumerate}
|
||||
% \item User accesses the search interface
|
||||
% \item System presents search filters (included use case)
|
||||
% \item User enters search criteria
|
||||
% \item System processes the search query
|
||||
% \item System displays matching properties
|
||||
% \item User browses through results
|
||||
% \end{enumerate} \\
|
||||
% \hline
|
||||
% \textbf{Alternative Flows} &
|
||||
% \begin{itemize}
|
||||
% \item User can refine search criteria if results are unsatisfactory
|
||||
% \item User can extend to compare properties
|
||||
% \item User can save search criteria for future use
|
||||
% \end{itemize} \\
|
||||
% \hline
|
||||
% \textbf{Postconditions} & User views a list of properties matching their criteria \\
|
||||
% \hline
|
||||
% \textbf{Associated Feature} & Automated Data Integration Pipeline - providing deduplicated listings from multiple sources \\
|
||||
% \hline
|
||||
% \end{tabular}
|
||||
% \caption{Search Properties \& Listings Use Case}
|
||||
% \label{tab:search-use-case}
|
||||
% \end{table}
|
||||
|
||||
\begin{table}[h]
|
||||
\centering
|
||||
\renewcommand{\arraystretch}{1.3}
|
||||
\begin{tabular}{|>{\columncolor[gray]{0.95}}p{0.25\textwidth}|p{0.65\textwidth}|}
|
||||
\hline
|
||||
\rowcolor[gray]{0.9} \textbf{Use Case Name} & \textbf{View Property Insights} \\
|
||||
\hline
|
||||
\textbf{Actors} & Real Estate Investor, Homebuyer, Property Developer \\
|
||||
\hline
|
||||
\textbf{Description} & Provides users with comprehensive analytics and contextual information about specific properties \\
|
||||
\hline
|
||||
\textbf{Preconditions} & User has selected a property from search results \\
|
||||
\hline
|
||||
\textbf{Basic Flow} &
|
||||
\begin{enumerate}
|
||||
\item User selects a property for detailed viewing
|
||||
\item System retrieves comprehensive property data
|
||||
\item System presents property details with analytics
|
||||
\item System displays neighborhood characteristics
|
||||
\item System shows historical performance metrics
|
||||
\item User reviews information
|
||||
\end{enumerate} \\
|
||||
\hline
|
||||
\textbf{Alternative Flows} &
|
||||
\begin{itemize}
|
||||
\item User can extend to save the property as a favorite
|
||||
\item User can extend to view explainable price predictions
|
||||
\item User can request additional specific analytics
|
||||
\end{itemize} \\
|
||||
\hline
|
||||
\textbf{Postconditions} & User gains comprehensive insights about the property \\
|
||||
\hline
|
||||
\textbf{Associated Feature} & Local Contextual Analytics - providing trend analysis and neighborhood-specific insights \\
|
||||
\hline
|
||||
\end{tabular}
|
||||
\caption{View Property Insights Use Case}
|
||||
\label{tab:insights-use-case}
|
||||
\end{table}
|
||||
|
||||
\begin{table}[h]
|
||||
\centering
|
||||
\renewcommand{\arraystretch}{1.3}
|
||||
\begin{tabular}{|>{\columncolor[gray]{0.95}}p{0.25\textwidth}|p{0.65\textwidth}|}
|
||||
\hline
|
||||
\rowcolor[gray]{0.9} \textbf{Use Case Name} & \textbf{Explainable Price Prediction} \\
|
||||
\hline
|
||||
\textbf{Actors} & Real Estate Investor, Homebuyer \\
|
||||
\hline
|
||||
\textbf{Description} & Provides transparent, interpretable price predictions with detailed explanations of contributing factors \\
|
||||
\hline
|
||||
\textbf{Preconditions} & User is viewing property insights \\
|
||||
\hline
|
||||
\textbf{Basic Flow} &
|
||||
\begin{enumerate}
|
||||
\item User requests price prediction for a property
|
||||
\item System calculates predicted price using its models
|
||||
\item System generates explanation of factors influencing the prediction
|
||||
\item System presents prediction with confidence interval
|
||||
\item System displays factor weights and their impact
|
||||
\item User reviews prediction and explanation
|
||||
\end{enumerate} \\
|
||||
\hline
|
||||
\textbf{Alternative Flows} &
|
||||
\begin{itemize}
|
||||
\item User can adjust factors to see impact on prediction
|
||||
\item User can compare prediction with market averages
|
||||
\item User can save prediction for future reference
|
||||
\end{itemize} \\
|
||||
\hline
|
||||
\textbf{Postconditions} & User understands the predicted price and the reasoning behind it \\
|
||||
\hline
|
||||
\textbf{Associated Feature} & Explainable Price Prediction Model - providing transparent explanations for price predictions \\
|
||||
\hline
|
||||
\end{tabular}
|
||||
\caption{Explainable Price Prediction Use Case}
|
||||
\label{tab:prediction-use-case}
|
||||
\end{table}
|
||||
|
||||
% \begin{table}[htbp]
|
||||
% \centering
|
||||
% \renewcommand{\arraystretch}{1.3}
|
||||
% \begin{tabular}{|>{\columncolor[gray]{0.95}}p{0.25\textwidth}|p{0.65\textwidth}|}
|
||||
% \hline
|
||||
% \rowcolor[gray]{0.9} \textbf{Use Case Name} & \textbf{Geospatial Visualization} \\
|
||||
% \hline
|
||||
% \textbf{Actors} & Real Estate Investor, Homebuyer \\
|
||||
% \hline
|
||||
% \textbf{Description} & Enables users to visualize property and market data on interactive maps with various data overlays \\
|
||||
% \hline
|
||||
% \textbf{Preconditions} & User has access to the platform \\
|
||||
% \hline
|
||||
% \textbf{Basic Flow} &
|
||||
% \begin{enumerate}
|
||||
% \item User accesses the map interface
|
||||
% \item System loads the base map with property markers
|
||||
% \item User selects desired data overlays (e.g., price heatmaps, transit lines)
|
||||
% \item System renders the selected overlays
|
||||
% \item User interacts with the map (zoom, pan, click)
|
||||
% \item System provides context-sensitive information based on interaction
|
||||
% \end{enumerate} \\
|
||||
% \hline
|
||||
% \textbf{Alternative Flows} &
|
||||
% \begin{itemize}
|
||||
% \item User can filter properties shown on the map
|
||||
% \item User can measure distances between points
|
||||
% \item User can switch between different base maps
|
||||
% \end{itemize} \\
|
||||
% \hline
|
||||
% \textbf{Postconditions} & User visualizes spatial relationships and patterns relevant to their needs \\
|
||||
% \hline
|
||||
% \textbf{Associated Feature} & Geospatial Visualization - providing interactive maps with data overlays and proximity analysis \\
|
||||
% \hline
|
||||
% \end{tabular}
|
||||
% \caption{Geospatial Visualization Use Case}
|
||||
% \label{tab:geospatial-use-case}
|
||||
% \end{table}
|
||||
|
||||
\clearpage
|
||||
%======================================================================
|
||||
\section{User Interface Design}
|
||||
%======================================================================
|
||||
|
||||
\begin{figure}[htbp]
|
||||
\centering
|
||||
\includegraphics[width=1\textwidth]{assets/sitemap.png}
|
||||
\caption{Sitemap - Platform Structure Overview}
|
||||
\label{fig:sitemap}
|
||||
\end{figure}
|
||||
|
||||
\noindent Figure \ref{fig:sitemap} shows the structure of the BorBann platform. The Home Page acts as the central access point leading to four main sections: Pipeline, Maps, Properties Listing, and Explainable Prediction pages.
|
||||
|
||||
Each main section connects to specific subpages. The Pipeline section includes Creation and Detailed pages. The Maps section features Local Context Analytics, Filters, and Chatbot components. The Properties section provides Analytic Detailed pages with Description, Property Features, and Analytics components. The Explainable Prediction section offers Market Comparison, Feature Analysis, Environmental Factor analysis, and Final Prediction components.
|
||||
|
||||
This structure organizes the platform's key functions in a logical flow, making it easy for users to navigate between data management, visualization, and prediction features.
|
||||
|
||||
\pagebreak
|
||||
%======================================================================
|
||||
|
||||
\begin{figure}[htbp]
|
||||
\centering
|
||||
\includegraphics[width=1\textwidth]{assets/ui/homepage.png}
|
||||
\caption{BorBann Platform Homepage}
|
||||
\label{fig:homepage}
|
||||
\end{figure}
|
||||
|
||||
Figure \ref{fig:homepage} shows the BorBann platform homepage, which provides an intuitive entry point to the system. The page presents the core value proposition with "Property Analytics Simplified" and briefly explains how BorBann helps users make data-driven real estate decisions through analytics, geospatial visualization, and market insights. Two primary action buttons - "Explore Map" and "Browse Properties" - enable quick access to key functionality. The lower section showcases three main analytics tools: Geospatial Visualization for interactive property mapping, Price Prediction with explainable AI features, and Data Pipeline for automated data collection and processing.
|
||||
|
||||
%======================================================================
|
||||
\pagebreak
|
||||
\begin{figure}[h]
|
||||
\centering
|
||||
\includegraphics[width=1\textwidth]{assets/ui/data-pipelines-main.png}
|
||||
\caption{Data Pipeline Management Interface}
|
||||
\label{fig:data-pipelines}
|
||||
\end{figure}
|
||||
|
||||
Figure \ref{fig:data-pipelines} showcases the Data Pipeline management dashboard, providing users with comprehensive control over their automated data collection processes. The interface features intuitive navigation with filtering options for Active, Paused, and All Pipelines, enabling efficient workflow management.
|
||||
|
||||
Each pipeline card presents essential operational metrics including last run timestamp, next scheduled execution, number of data sources, and total records processed. This at-a-glance view allows users to quickly assess data freshness and monitor collection performance across multiple pipelines.
|
||||
|
||||
\begin{figure}[h]
|
||||
\centering
|
||||
\includegraphics[width=1\textwidth]{assets/ui/data-pipelines-detailed-1.png}
|
||||
\caption{Data Integration Pipeline Detail - Overview}
|
||||
\label{fig:data-pipelines-detailed-1}
|
||||
\end{figure}
|
||||
|
||||
Figure \ref{fig:data-pipelines-detailed-1} illustrates the pipeline detail view, highlighting key operational components including current status indicators, connected data sources, and available export formats. This overview provides users with immediate visibility into pipeline configuration and functionality.
|
||||
|
||||
\begin{figure}[h]
|
||||
\centering
|
||||
\includegraphics[width=1\textwidth]{assets/ui/data-pipelines-detailed-2.png}
|
||||
\caption{Data Integration Pipeline Detail - Field Management}
|
||||
\label{fig:data-pipelines-detailed-2}
|
||||
\end{figure}
|
||||
|
||||
Figure \ref{fig:data-pipelines-detailed-2} displays the field management section of the pipeline detail page. This interface empowers users to customize their data structure by managing output fields and creating derived fields through a visual formula builder. Users can transform raw data into meaningful metrics without writing code.
|
||||
|
||||
\begin{figure}[h]
|
||||
\centering
|
||||
\includegraphics[width=1\textwidth]{assets/ui/data-pipelines-detailed-data-preview.png}
|
||||
\caption{Data Integration Pipeline Detail - Output Data Preview}
|
||||
\label{fig:data-pipelines-detailed-data-preview}
|
||||
\end{figure}
|
||||
|
||||
Figure \ref{fig:data-pipelines-detailed-data-preview} presents the data preview tab, where users can examine sample records generated by their pipeline. This real-time preview functionality allows users to validate data quality and structure before export or analysis.
|
||||
|
||||
\pagebreak
|
||||
\begin{figure}[h]
|
||||
\centering
|
||||
\includegraphics[width=1\textwidth]{assets/ui/data-pipelines-detailed-export-data.png}
|
||||
\caption{Data Integration Pipeline Detail - Export Configuration}
|
||||
\label{fig:data-pipelines-detailed-export-data}
|
||||
\end{figure}
|
||||
|
||||
Figure \ref{fig:data-pipelines-detailed-export-data} shows the export configuration interface, where users can precisely define output schemas for their data exports. This tab enables users to select specific fields, customize formatting, and choose from multiple export formats to meet their downstream requirements.
|
||||
|
||||
\begin{figure}[h]
|
||||
\centering
|
||||
\includegraphics[width=1\textwidth]{assets/ui/data-pipelines-detailed-run-history.png}
|
||||
\caption{Data Integration Pipeline Detail - Run History}
|
||||
\label{fig:data-pipelines-detailed-run-history}
|
||||
\end{figure}
|
||||
|
||||
Figure \ref{fig:data-pipelines-detailed-run-history} displays the run history tab, providing a chronological log of pipeline executions. This audit trail includes execution timestamps, duration metrics, and status indicators, enabling users to monitor performance trends and troubleshoot any execution issues.
|
||||
|
||||
\begin{figure}[h]
|
||||
\centering
|
||||
\includegraphics[width=1\textwidth]{assets/ui/data-pipelines-detailed-pipeline-setting.png}
|
||||
\caption{Data Integration Pipeline Detail - Pipeline Settings}
|
||||
\label{fig:data-pipelines-detailed-pipeline-setting}
|
||||
\end{figure}
|
||||
|
||||
\pagebreak
|
||||
Figure \ref{fig:data-pipelines-detailed-pipeline-setting} illustrates the pipeline settings tab, where users can configure automation parameters including execution schedules, notification preferences, and retry policies. These controls allow users to establish reliable data collection routines that align with their operational requirements.
|
||||
|
||||
\begin{figure}[h]
|
||||
\centering
|
||||
\includegraphics[width=1\textwidth]{assets/ui/data-pipelines-create.png}
|
||||
\caption{Data Integration Pipeline - Creation Interface}
|
||||
\label{fig:data-pipelines-create-1}
|
||||
\end{figure}
|
||||
|
||||
Figure \ref{fig:data-pipelines-create-1} shows the pipeline creation interface where users input website URLs for automated data extraction. The form enables non-technical users to configure scraping operations without coding knowledge.
|
||||
|
||||
\begin{figure}[h]
|
||||
\centering
|
||||
\includegraphics[width=1\textwidth]{assets/ui/data-pipelines-create-2.png}
|
||||
\caption{Data Integration Pipeline - Advanced Configuration and Scheduling}
|
||||
\label{fig:data-pipelines-create-2}
|
||||
\end{figure}
|
||||
|
||||
Figure \ref{fig:data-pipelines-create-2} displays automation settings for pipeline execution with scheduling options and AI-assisted extraction configuration. Users can set run frequency and notification preferences to maintain automated data collection.
|
||||
|
||||
\begin{figure}[h]
|
||||
\centering
|
||||
\includegraphics[width=1\textwidth]{assets/ui/models-models-list.png}
|
||||
\caption{Model Management Dashboard}
|
||||
\label{fig:models-models-list}
|
||||
\end{figure}
|
||||
|
||||
Figure \ref{fig:models-models-list} presents the model management dashboard where users can view and control prediction models. The interface displays performance metrics and allows single-click model activation.
|
||||
|
||||
\begin{figure}[h]
|
||||
\centering
|
||||
\includegraphics[width=1\textwidth]{assets/ui/models-new-model.png}
|
||||
\caption{Model Creation Interface}
|
||||
\label{fig:models-new-model}
|
||||
\end{figure}
|
||||
|
||||
Figure \ref{fig:models-new-model} shows the model creation interface for configuring new prediction models. Users can select data pipelines as training sources and choose from recommended algorithms with explanations of their strengths.
|
||||
|
||||
\begin{figure}[h]
|
||||
\centering
|
||||
\includegraphics[width=1\textwidth]{assets/ui/map-page-main.png}
|
||||
\caption{Geospatial Visualization - Main Map Interface}
|
||||
\label{fig:map-page-main}
|
||||
\end{figure}
|
||||
|
||||
Figure \ref{fig:map-page-main} displays the interactive property map with color-coded markers and navigation controls. The interface supports pan/zoom gestures and provides filtering options through the sidebar.
|
||||
|
||||
\begin{figure}[h]
|
||||
\centering
|
||||
\begin{minipage}[b]{0.45\textwidth}
|
||||
\centering
|
||||
\includegraphics[width=\textwidth]{assets/ui/map-page-analytic.png}
|
||||
\caption{Map Analytics Overlay}
|
||||
\label{fig:map-page-analytic}
|
||||
\end{minipage} \hspace{0.05\textwidth}
|
||||
\begin{minipage}[b]{0.45\textwidth}
|
||||
\centering
|
||||
\includegraphics[width=\textwidth]{assets/ui/map-page-property-detail.png}
|
||||
\caption{Property Detail Overlay}
|
||||
\label{fig:map-page-property-detail}
|
||||
\end{minipage}
|
||||
\end{figure}
|
||||
|
||||
\pagebreak
|
||||
Figure \ref{fig:map-page-analytic} shows environmental factor visualization through heat maps and data layers. This overlay helps users analyze contextual factors like pollution levels directly on the map.
|
||||
|
||||
Figure \ref{fig:map-page-property-detail} displays the popup that appears when users click map markers. This overlay provides immediate property information without requiring navigation away from the map.
|
||||
|
||||
\begin{figure}[h]
|
||||
\centering
|
||||
\begin{minipage}[b]{0.45\textwidth}
|
||||
\centering
|
||||
\includegraphics[width=\textwidth]{assets/ui/map-page-property-filter.png}
|
||||
\caption{Property Filter Panel}
|
||||
\label{fig:map-page-property-filter}
|
||||
\end{minipage}
|
||||
\hspace{0.05\textwidth}
|
||||
\begin{minipage}[b]{0.45\textwidth}
|
||||
\centering
|
||||
\includegraphics[width=\textwidth]{assets/ui/map-page-property-filter-advance.png}
|
||||
\caption{Advanced Property Filter Options}
|
||||
\label{fig:map-page-property-filter-advance}
|
||||
\end{minipage}
|
||||
\end{figure}
|
||||
|
||||
\pagebreak
|
||||
Figure \ref{fig:map-page-property-filter} shows basic property filtering controls for price range, type and size parameters. The panel uses sliders and checkboxes for intuitive refinement of map results.
|
||||
|
||||
Figure \ref{fig:map-page-property-filter-advance} displays extended filtering options for specific amenities and neighborhood characteristics. These advanced parameters enable precise property matching based on detailed criteria.
|
||||
|
||||
\begin{figure}[h]
|
||||
\centering
|
||||
\includegraphics[height=0.5\textwidth]{assets/ui/map-page-chatbot.png}
|
||||
\caption{Interactive Chatbot Assistant}
|
||||
\label{fig:map-page-chatbot}
|
||||
\end{figure}
|
||||
|
||||
Figure \ref{fig:map-page-chatbot} shows the conversational assistant for property search and analysis. The chatbot handles natural language queries about properties and market conditions.
|
||||
|
||||
\begin{figure}[h]
|
||||
\centering
|
||||
\includegraphics[width=1\textwidth]{assets/ui/explainable-property-detail.png}
|
||||
\caption{Explainable Price Prediction - Property Overview}
|
||||
\label{fig:explainable-property-detail}
|
||||
\end{figure}
|
||||
|
||||
Figure \ref{fig:explainable-property-detail} displays the initial analysis of property attributes in the prediction model. The interface includes interactive parameter sliders that show how changes to property characteristics affect the predicted price.
|
||||
|
||||
\begin{figure}[h]
|
||||
\centering
|
||||
\includegraphics[width=1\textwidth]{assets/ui/explainable-feature-analysis.png}
|
||||
\caption{Explainable Price Prediction - Feature Importance Visualization}
|
||||
\label{fig:explainable-feature-analysis}
|
||||
\end{figure}
|
||||
|
||||
Figure \ref{fig:explainable-feature-analysis} shows the contribution of different property features to the predicted price. The visualization uses color-coded bars to differentiate positive and negative factors with percentage impact values.
|
||||
|
||||
\begin{figure}[h]
|
||||
\centering
|
||||
\includegraphics[width=1\textwidth]{assets/ui/explainable-market-comparison.png}
|
||||
\caption{Explainable Price Prediction - Comparative Market Analysis}
|
||||
\label{fig:explainable-market-comparison}
|
||||
\end{figure}
|
||||
|
||||
Figure \ref{fig:explainable-market-comparison} presents a comparison of the subject property against similar properties in the area. The table highlights key attributes and pricing metrics with supporting analysis of market positioning.
|
||||
|
||||
\begin{figure}[h]
|
||||
\centering
|
||||
\includegraphics[width=1\textwidth]{assets/ui/explainable-environmental-factors.png}
|
||||
\caption{Explainable Price Prediction - Environmental Impact Analysis}
|
||||
\label{fig:explainable-environmental-factors}
|
||||
\end{figure}
|
||||
|
||||
Figure \ref{fig:explainable-environmental-factors} analyzes environmental conditions and nearby amenities affecting property value. The interface displays flood risk, air quality, and proximity to key facilities with quantified impact on valuation.
|
||||
|
||||
\pagebreak
|
||||
\begin{figure}[h]
|
||||
\centering
|
||||
\includegraphics[width=1\textwidth]{assets/ui/explainable-final-prediction.png}
|
||||
\caption{Explainable Price Prediction - Final Valuation with Confidence Range}
|
||||
\label{fig:explainable-final-prediction}
|
||||
\end{figure}
|
||||
|
||||
Figure \ref{fig:explainable-final-prediction} shows the final price prediction with confidence metrics and range indicators. The summary section explains how the valuation synthesizes insights from all analytical components.
|
||||
|
||||
\begin{figure}[h]
|
||||
\centering
|
||||
\includegraphics[width=1\textwidth]{assets/ui/property-listing-main.png}
|
||||
\caption{Property Listings Page}
|
||||
\label{fig:property-listing-main}
|
||||
\end{figure}
|
||||
|
||||
Figure \ref{fig:property-listing-main} display property listings page with all listing that follow the filter tab the right.
|
||||
|
||||
\pagebreak
|
||||
\begin{figure}[h]
|
||||
\centering
|
||||
\includegraphics[width=1\textwidth]{assets/ui/property-listing-analytics.png}
|
||||
\caption{Property Listings Page - Analytic Tab}
|
||||
\label{fig:property-listing-analytics}
|
||||
\end{figure}
|
||||
|
||||
|
||||
Figure \ref{fig:property-listing-analytics} shows the analytic tab that show local context analytic of that specific listing.
|
||||
180
Chapters/Chapter_04.tex
Normal file
@ -0,0 +1,180 @@
|
||||
%======================================================================
|
||||
\chapter{Software Architecture Design}
|
||||
%======================================================================
|
||||
|
||||
% %----------------------------------------------------------------------
|
||||
% \section{Stakeholder Analysis}
|
||||
% %----------------------------------------------------------------------
|
||||
|
||||
% The successful implementation of the BorBann platform requires a understanding of all parties who may influence or be affected by the system. This stakeholder analysis identifies key individuals and groups, their interests, influence levels, and specific requirements.
|
||||
|
||||
%------------------------------
|
||||
% \section{Domain Model}
|
||||
%------------------------------
|
||||
|
||||
%------------------------------
|
||||
% \section{Design Class Diagram}
|
||||
%------------------------------
|
||||
|
||||
%------------------------------
|
||||
\section{Sequence Diagram}
|
||||
%------------------------------
|
||||
|
||||
\begin{figure}[htbp]
|
||||
\centering
|
||||
\includegraphics[width=\textwidth]{assets/sequence-diagram-pipeline.png}
|
||||
\caption{Sequence Diagram of Customizable Automated Data Integration Pipeline}
|
||||
\label{fig:sequence-diagram-data-pipeline}
|
||||
\end{figure}
|
||||
|
||||
The sequence diagram show the flow of interactions between key components of the customizable automated data integration pipeline. The process begins with the \textbf{User}, who inputs URLs and configuration details via the \textbf{UI}. The \textbf{UI} sends the provided URLs to the \textbf{Scrapy Engine} for scraping.
|
||||
|
||||
Once the data is extracted, the \textbf{Scrapy Engine} forwards the raw data to the \textbf{Schema Inference} module for automatic schema detection. The \textbf{Schema Inference} module analyzes the data and returns a preview, along with field mapping suggestions, to the \textbf{UI}. The \textbf{User} then reviews the suggested schema and field mappings in the \textbf{UI}.
|
||||
|
||||
Upon confirmation by the \textbf{User}, the \textbf{UI} passes the finalized schema and mapped data to the \textbf{Data Processing} pipeline, where further processing and integration of the collected data occur.
|
||||
|
||||
|
||||
% %------------------------------
|
||||
% \section{Algorithm}
|
||||
% %------------------------------
|
||||
|
||||
%------------------------------
|
||||
\section{AI Component}
|
||||
%------------------------------
|
||||
|
||||
The BorBann platform has AI components that enhance its analytical capabilities and user experience. These components work together to provide build a real estate data platform adapt to the Thai market context.
|
||||
Each component integrate with each other to form a comprehensive analytics system:
|
||||
|
||||
\begin{itemize}
|
||||
\item The Data Integration Pipeline feeds data to the Local Contextual Analytics system
|
||||
\item Local Contextual Analytics provides features to the Explainable Price Prediction Model
|
||||
\item The Retraining Model uses data from the pipeline to create customized predictions
|
||||
\item All components share a common data model that enables smooth information flow
|
||||
\end{itemize}
|
||||
|
||||
\subsection{Explainable Price Prediction Model}
|
||||
The price prediction model delivers property price predictions with clear explanations of contributing factors.
|
||||
|
||||
\subsubsection{Model Architecture}
|
||||
|
||||
\begin{figure}[htbp]
|
||||
\centering
|
||||
\includegraphics[width=1\textwidth]{assets/explainable-price-prediction-model.png}
|
||||
\caption{Explainable Price Prediction Data Flow}
|
||||
\label{fig:explainable-price-prediction-model-data-flow}
|
||||
\end{figure}
|
||||
|
||||
\noindent Figure \ref{fig:explainable-price-prediction-model-data-flow} illustrates the architecture of the Explainable Price Prediction Model. The diagram shows how data flows from multiple sources (Baania, DDproperty, hipflat) and local context data into an Aggregator component that organizes information based on a tagging system. The aggregated data then feeds into two distinct prediction models: a Multimodal Graph Attention Network and a Spatial-Temporal Model (ST-RAP). The explainability features are highlighted on the right, showing how the model provides transparency through attention mechanisms, counterfactual analysis, post-hoc methods, and self-interpretable modeling approaches.
|
||||
|
||||
\begin{itemize}
|
||||
\item \textbf{Dual Modeling Approach:}
|
||||
\begin{itemize}
|
||||
\item \textit{Tree-based Model:} With tree-based gradient boosting models (XGBoost\cite{Chen_2016}).
|
||||
\item \textit{Multimodal Graph Attention Network:} With Multimodal Graph Attention Network\cite{veličković2018graphattentionnetworks} that is multi-modal model which can handle large graph.
|
||||
\item \textit{Spatial-Temporal Model:} Using ST-RAP\cite{ST-RAP} for facilities-property graph input and time series of real estate pricing data
|
||||
\end{itemize}
|
||||
\end{itemize}
|
||||
|
||||
\subsubsection{Explainability Framework}
|
||||
\begin{itemize}
|
||||
\item \textbf{In-model Attention:} With attention mechanism, we can look into weighted contributions of nodes, edges, or modalities
|
||||
\item \textbf{Post-hoc Explanation Module:} Uses KernelSHAP\cite{kernelshap} (Algorithm to approximate SHapley Additive exPlanations) value calculation for feature attribution.
|
||||
\item \textbf{Self-Interpretable Components:} Extracts rules from complex models and implements decision tree surrogate models that approximate complex model behavior
|
||||
\end{itemize}
|
||||
|
||||
\subsubsection{User Interface Components}
|
||||
\begin{itemize}
|
||||
\item \textbf{Interactive Visualizations:} Feature importance charts, and price trend projections with confidence intervals
|
||||
\item \textbf{Explanation Generation:} Natural language generation of price explanations and highlighting of key value drivers
|
||||
\end{itemize}
|
||||
|
||||
\subsection{Local Contextual Analytics}
|
||||
This component analyzes environmental conditions and proximity factors to evaluate property context and risk:
|
||||
|
||||
\subsubsection{Model Architecture}
|
||||
|
||||
\begin{figure}[htbp]
|
||||
\centering
|
||||
\includegraphics[width=1\textwidth]{assets/local-contextual-analytic.png}
|
||||
\caption{Local Contextual Analytic Data Flow}
|
||||
\label{fig:local-contextual-analytic-data-flow}
|
||||
\end{figure}
|
||||
|
||||
\noindent Figure \ref{fig:local-contextual-analytic-data-flow} depicts the Local Contextual Analytics system. The diagram shows various data sources including GISTDA, Bangkok Metropolitan Administration, news outlets, and property listing platforms (Baania, hipflat) feeding into an Aggregator Service. This service collects different types of data through web scraping, API fetching, and dataset downloads. The collected data undergoes preprocessing with outlier detection, value imputation, and feature engineering before being stored in specialized databases (Vector, Time-Series, Graph). The Model Module and Analytic Module process this information to provide geospatial analysis and local contextual insights that ultimately feed into the Price Prediction Module.
|
||||
|
||||
\begin{itemize}
|
||||
\item \textbf{Graph Database:} Stores heterogeneous data in Neo4J or other knowledge graph database
|
||||
\item \textbf{Vector Database:} Stores embedding from preprocessing unit within PostGreSQL with pgvector that will provide vector database capabilities
|
||||
\item \textbf{Timeseries Database:} Stores time-series data withtin Timescale
|
||||
\item \textbf{Relational Database:} Stores relational data in PostgreSQL
|
||||
\item \textbf{NoSQL Database:} Stores unstructured data within MongoDB
|
||||
\item \textbf{Model Module:}
|
||||
\begin{itemize}
|
||||
\item Heterogeneous Graph Construction using k-NN or GCN
|
||||
\item GCN models for spatial relationships
|
||||
\item NLP models for news analysis
|
||||
\end{itemize}
|
||||
\item \textbf{Price Prediction Module:} Integrated model consuming all processed features
|
||||
\end{itemize}
|
||||
|
||||
\subsubsection{Analytics Capabilities}
|
||||
\begin{itemize}
|
||||
\item \textbf{Climate and Environmental Analysis:} Evaluates climate risk, pollution levels, and disaster assessment
|
||||
\item \textbf{Proximity Analysis:} Evaluates nearby locations and facilities, analyzing relationships between facilities
|
||||
\item \textbf{News Integration:} Incorporates local news into property assessment
|
||||
\end{itemize}
|
||||
|
||||
\subsection{Customizable Automated Data Integration Pipeline}
|
||||
This pipeline enables non-technical users to connect any data source into a unified system:
|
||||
|
||||
\subsubsection{LLM Module}
|
||||
|
||||
\begin{figure}[htbp]
|
||||
\centering
|
||||
\includegraphics[width=1\textwidth]{assets/customizable-automated-data-integration-pipeline.png}
|
||||
\caption{Customizable Automated Data Pipeline Data Flow}
|
||||
\label{fig:customizable-automated-data-integration-pipeline-data-flow}
|
||||
\end{figure}
|
||||
|
||||
\noindent Figure \ref{fig:customizable-automated-data-integration-pipeline-data-flow} presents the Customizable Automated Data Integration Pipeline. The workflow begins with data sources (API Fetcher, File Schema Parser, Websites) being evaluated. An LLM Module analyzes these sources to find appropriate schemas (step 2), then generates Scrappy spiders for web scraping (step 3). The spiders extract data from websites (step 4), while the Data Aggregator combines information from all sources (step 5). Finally, the aggregated data is returned to clients (step 6). This pipeline enables non-technical users to integrate diverse data sources through an automated, LLM process.
|
||||
|
||||
\begin{itemize}
|
||||
\item Analyzes data sources to find appropriate schemas
|
||||
\item For websites, generates Scrappy spider configurations automatically
|
||||
\item Bridges the gap between unstructured and structured data
|
||||
\end{itemize}
|
||||
|
||||
\subsubsection{Data Processing}
|
||||
\begin{itemize}
|
||||
\item \textbf{Scrappy Spider:} Dynamically generated web scrapers based on LLM analysis that extract targeted data from websites according to the determined schema
|
||||
\item \textbf{Data Aggregator:} Central component that combines data from all sources, harmonizes different schemas into a unified structure, and uses appropriate schema mapping determined by the LLM
|
||||
\end{itemize}
|
||||
|
||||
\subsection{Retraining Model with Pipeline Data}
|
||||
This component allows users to create custom prediction models by combining their pipeline data with platform data:
|
||||
|
||||
\subsubsection{Technical Implementation}
|
||||
|
||||
\begin{figure}[htbp]
|
||||
\centering
|
||||
\includegraphics[width=1\textwidth]{assets/retrain-model-with-data-from-pipeline.png}
|
||||
\caption{Retrain Model with Data from Pipeline Data Flow}
|
||||
\label{fig:retrain-model-with-data-from-pipeline-data-flow}
|
||||
\end{figure}
|
||||
|
||||
\noindent Figure \ref{fig:retrain-model-with-data-from-pipeline-data-flow} shows the Model Retraining Pipeline. The diagram illustrates how users can select pipelines and combine them with platform data to train custom models. The Training Module processes this data and allows users to choose between embed-based or feature-based modeling approaches. The system generates pickle/cloudpickle files of the trained models, which are then stored in a database for future use. This component empowers users to create specialized prediction models tailored to their specific data and requirements.
|
||||
|
||||
\begin{itemize}
|
||||
\item \textbf{Training Engine:} Implements automated training engine that rely on embedding-based models to avoid problem with unmatch input feature and tree-based models (for structured data), and builds parameter tuning system using random search if user doesn't specify ones.
|
||||
\item \textbf{Model Serialization:} Creates versioned model files for persistence and stores serialized models in pickle format in database with metadata
|
||||
\item \textbf{Deployment Framework:} Provides APIs for model inference, enables batch prediction, and implements monitoring for model drift detection
|
||||
\end{itemize}
|
||||
|
||||
% \subsection{Integration Architecture}
|
||||
% Each component integrate with each other to form a comprehensive analytics system:
|
||||
% \begin{itemize}
|
||||
% \item The Data Integration Pipeline feeds data to the Local Contextual Analytics system
|
||||
% \item Local Contextual Analytics provides features to the Explainable Price Prediction Model
|
||||
% \item The Retraining Model uses data from the pipeline to create customized predictions
|
||||
% \item All components share a common data model that enables smooth information flow
|
||||
% \end{itemize}
|
||||
36
Chapters/List_of_Abbreviations.tex
Normal file
@ -0,0 +1,36 @@
|
||||
% L I S T O F S Y M B O L S
|
||||
% -----------------------------
|
||||
% To include a Nomenclature section
|
||||
|
||||
|
||||
%\addcontentsline{toc}{chapter}{\textbf{List of Acronyms}}
|
||||
%\cleardoublepage
|
||||
%\phantomsection
|
||||
|
||||
|
||||
%\renewcommand{\nomname}{List of Acronyms}
|
||||
%\renewcommand{\nomAname}{\textbf{\large Abbreviations}}
|
||||
%\textbf{List of Acronyms}
|
||||
|
||||
|
||||
\addcontentsline{toc}{chapter}{List of Abbreviations}
|
||||
\section*{List of Abbreviations}
|
||||
%\addcontentsline{toc}{chapter}{List of Acronyms}
|
||||
\begin{longtable}{cp{0.8\textwidth}}
|
||||
|
||||
|
||||
AI &Artificial Intelligence.\\
|
||||
|
||||
\end{longtable}
|
||||
|
||||
|
||||
\renewcommand{\nomGname}{\textbf{\large Mathematical Symbols}}
|
||||
%\textbf{List of Symbols}
|
||||
|
||||
\renewcommand{\nomXname}{\textbf{\large Superscripts}}
|
||||
\renewcommand{\nomZname}{\textbf{\large Subscripts}}
|
||||
|
||||
%\printnomenclature
|
||||
%\cleardoublepage
|
||||
%\phantomsection % allows hyperref to link to the correct page
|
||||
% \newpage
|
||||
8374
MBZUAI-Blue.eps
Normal file
BIN
assets/BorBann_Use_Case_Diagram.png
Normal file
|
After Width: | Height: | Size: 376 KiB |
BIN
assets/customizable-automated-data-integration-pipeline.png
Normal file
|
After Width: | Height: | Size: 453 KiB |
BIN
assets/explainable-price-prediction-model.png
Normal file
|
After Width: | Height: | Size: 351 KiB |
BIN
assets/local-contextual-analytic.png
Normal file
|
After Width: | Height: | Size: 1.1 MiB |
BIN
assets/retrain-model-with-data-from-pipeline.png
Normal file
|
After Width: | Height: | Size: 333 KiB |
BIN
assets/sequence-diagram-pipeline.png
Normal file
|
After Width: | Height: | Size: 82 KiB |
BIN
assets/sitemap.png
Normal file
|
After Width: | Height: | Size: 476 KiB |
BIN
assets/ui/data-pipelines-create-2.png
Normal file
|
After Width: | Height: | Size: 161 KiB |
BIN
assets/ui/data-pipelines-create.png
Normal file
|
After Width: | Height: | Size: 153 KiB |
BIN
assets/ui/data-pipelines-detailed-1.png
Normal file
|
After Width: | Height: | Size: 154 KiB |
BIN
assets/ui/data-pipelines-detailed-2.png
Normal file
|
After Width: | Height: | Size: 127 KiB |
BIN
assets/ui/data-pipelines-detailed-data-preview.png
Normal file
|
After Width: | Height: | Size: 36 KiB |
BIN
assets/ui/data-pipelines-detailed-export-data.png
Normal file
|
After Width: | Height: | Size: 64 KiB |
BIN
assets/ui/data-pipelines-detailed-pipeline-setting.png
Normal file
|
After Width: | Height: | Size: 49 KiB |
BIN
assets/ui/data-pipelines-detailed-run-history.png
Normal file
|
After Width: | Height: | Size: 41 KiB |
BIN
assets/ui/data-pipelines-main.png
Normal file
|
After Width: | Height: | Size: 120 KiB |
BIN
assets/ui/explainable-environmental-factors.png
Normal file
|
After Width: | Height: | Size: 182 KiB |
BIN
assets/ui/explainable-feature-analysis.png
Normal file
|
After Width: | Height: | Size: 168 KiB |
BIN
assets/ui/explainable-final-prediction.png
Normal file
|
After Width: | Height: | Size: 165 KiB |
BIN
assets/ui/explainable-market-comparison.png
Normal file
|
After Width: | Height: | Size: 176 KiB |
BIN
assets/ui/explainable-property-detail.png
Normal file
|
After Width: | Height: | Size: 176 KiB |
BIN
assets/ui/homepage.png
Normal file
|
After Width: | Height: | Size: 136 KiB |
BIN
assets/ui/map-page-analytic.png
Normal file
|
After Width: | Height: | Size: 63 KiB |
BIN
assets/ui/map-page-chatbot.png
Normal file
|
After Width: | Height: | Size: 61 KiB |
BIN
assets/ui/map-page-main.png
Normal file
|
After Width: | Height: | Size: 1.1 MiB |
BIN
assets/ui/map-page-property-detail.png
Normal file
|
After Width: | Height: | Size: 205 KiB |
BIN
assets/ui/map-page-property-filter-advance.png
Normal file
|
After Width: | Height: | Size: 74 KiB |
BIN
assets/ui/map-page-property-filter.png
Normal file
|
After Width: | Height: | Size: 51 KiB |
BIN
assets/ui/models-models-list.png
Normal file
|
After Width: | Height: | Size: 152 KiB |
BIN
assets/ui/models-new-model.png
Normal file
|
After Width: | Height: | Size: 164 KiB |
BIN
assets/ui/property-listing-analytics.png
Normal file
|
After Width: | Height: | Size: 76 KiB |
BIN
assets/ui/property-listing-description.png
Normal file
|
After Width: | Height: | Size: 57 KiB |
BIN
assets/ui/property-listing-detailed.png
Normal file
|
After Width: | Height: | Size: 910 KiB |
BIN
assets/ui/property-listing-features.png
Normal file
|
After Width: | Height: | Size: 52 KiB |
BIN
assets/ui/property-listing-location.png
Normal file
|
After Width: | Height: | Size: 54 KiB |
BIN
assets/ui/property-listing-main.png
Normal file
|
After Width: | Height: | Size: 731 KiB |
101
bibliography/keylatex.bib
Normal file
@ -0,0 +1,101 @@
|
||||
|
||||
|
||||
@article{al2020generalizing,
|
||||
title={Generalizing AI: challenges and opportunities for plug and play AI solutions},
|
||||
author={Al Ridhawi, Ismaeel and Otoum, Safa and Aloqaily, Moayad},
|
||||
journal={IEEE Network},
|
||||
volume={35},
|
||||
number={1},
|
||||
pages={372--379},
|
||||
year={2020},
|
||||
publisher={IEEE}
|
||||
}
|
||||
|
||||
@article{elayan2021digital,
|
||||
title={Digital Twin for Intelligent Context-Aware IoT Healthcare Systems},
|
||||
author={Elayan, Haya and Aloqaily, Moayad and Guizani, Mohsen},
|
||||
journal={IEEE Internet of Things Journal},
|
||||
year={2021},
|
||||
publisher={IEEE}
|
||||
}
|
||||
|
||||
@article{10223206,
|
||||
author={Iklassov, Zangir and Sobirov, Ikboljon and Solozabal, Ruben and Takáč, Martin},
|
||||
journal={IEEE Access},
|
||||
title={Reinforcement Learning Approach to Stochastic Vehicle Routing Problem With Correlated Demands},
|
||||
year={2023},
|
||||
volume={11},
|
||||
number={},
|
||||
pages={87958-87969},
|
||||
doi={10.1109/ACCESS.2023.3306076}
|
||||
}
|
||||
|
||||
|
||||
@article{JLL2025,
|
||||
author = {JLL Research},
|
||||
journal = {JLL Global Real Estate Perspective},
|
||||
title = {Global Real Estate Perspective February 2025: A positive but nuanced outlook for 2025},
|
||||
year = {2025},
|
||||
month = {February},
|
||||
publisher = {Jones Lang LaSalle IP, Inc.},
|
||||
url = {https://www.jll.co.th/en/trends-and-insights/research/global/gmp}
|
||||
}
|
||||
|
||||
|
||||
@article{nationthailand1,
|
||||
author = {Nationthailand},
|
||||
journal = {Nationthailand},
|
||||
title = {8 key trends shaping Thai real estate after rollercoaster year},
|
||||
year = {2025},
|
||||
month = {January},
|
||||
url = {https://www.nationthailand.com/business/property/40044774}
|
||||
}
|
||||
|
||||
|
||||
@article{bangkokpost1,
|
||||
author = {Bangkok Post},
|
||||
journal = {Bangkok Post},
|
||||
title = {Real Estate Information Center targets better data gathering to head off crises},
|
||||
year = {2024},
|
||||
month = {Jule},
|
||||
url = {https://www.bangkokpost.com/property/2836667/real-estate-information-center-targets-better-data-gathering-to-head-off-crises}
|
||||
}
|
||||
|
||||
@misc{ST-RAP,
|
||||
title={ST-RAP: A Spatio-Temporal Framework for Real Estate Appraisal},
|
||||
author={Hojoon Lee and Hawon Jeong and Byungkun Lee and Kyungyup Lee and Jaegul Choo},
|
||||
year={2023},
|
||||
eprint={2308.10609},
|
||||
archivePrefix={arXiv},
|
||||
primaryClass={cs.LG},
|
||||
url={https://arxiv.org/abs/2308.10609},
|
||||
}
|
||||
|
||||
@Manual{kernelshap,
|
||||
title = {kernelshap: Kernel SHAP},
|
||||
author = {Michael Mayer and David Watson},
|
||||
year = {2024},
|
||||
note = {R package version 0.7.1},
|
||||
url = {https://github.com/ModelOriented/kernelshap},
|
||||
}
|
||||
|
||||
@misc{veličković2018graphattentionnetworks,
|
||||
title={Graph Attention Networks},
|
||||
author={Petar Veličković and Guillem Cucurull and Arantxa Casanova and Adriana Romero and Pietro Liò and Yoshua Bengio},
|
||||
year={2018},
|
||||
eprint={1710.10903},
|
||||
archivePrefix={arXiv},
|
||||
primaryClass={stat.ML},
|
||||
url={https://arxiv.org/abs/1710.10903},
|
||||
}
|
||||
|
||||
@inproceedings{Chen_2016, series={KDD ’16},
|
||||
title={XGBoost: A Scalable Tree Boosting System},
|
||||
url={http://dx.doi.org/10.1145/2939672.2939785},
|
||||
DOI={10.1145/2939672.2939785},
|
||||
booktitle={Proceedings of the 22nd ACM SIGKDD International Conference on Knowledge Discovery and Data Mining},
|
||||
publisher={ACM},
|
||||
author={Chen, Tianqi and Guestrin, Carlos},
|
||||
year={2016},
|
||||
month=aug, pages={785–794},
|
||||
collection={KDD ’16} }
|
||||
BIN
document.pdf
Normal file
54
document.tex
Normal file
@ -0,0 +1,54 @@
|
||||
\documentclass[12pt,oneside,openany]{memoir}
|
||||
|
||||
\usepackage{ifthen}
|
||||
\newboolean{PrintVersion}
|
||||
\setboolean{PrintVersion}{false}
|
||||
\usepackage{lipsum}
|
||||
\usepackage{tikz}
|
||||
\usepackage{xcolor}
|
||||
\usepackage{graphicx}
|
||||
\usepackage{tabularx}
|
||||
\usepackage{subcaption}
|
||||
|
||||
\input{thesis-preamble}
|
||||
\chapterstyle{titlesec}
|
||||
\input{private/thesis-margins-and-spaces}
|
||||
|
||||
\begin{document}
|
||||
|
||||
\newcommand{\thesisauthor}{Pattadon Loyprasert 6510545608}
|
||||
\newcommand{\thesecondsisauthor}{Sirin Phungkun 6510545730}
|
||||
\newcommand{\thesistitlecoverpage}{BorBann\\ A Real Estate Information Platform\\ (Project Proposal)}
|
||||
\newcommand{\nameofprogram}{01219395 Innovative Software Group Project Preparation}
|
||||
\newcommand{\academicunit}{\nameofprogram}
|
||||
\newcommand{\faculty}{Faculty of Engineering}
|
||||
\newcommand{\graduationyear}{2025}
|
||||
|
||||
\input{private/frontpage}
|
||||
\input{private/approvalpage}
|
||||
% \input{Chapters/Abstract}
|
||||
\input{private/toc-lot-lof}
|
||||
% \input{Chapters/List_of_Abbreviations}
|
||||
|
||||
\newpage
|
||||
\pagenumbering{arabic}
|
||||
\pagestyle{headings}
|
||||
|
||||
\include{Chapters/Chapter_01}
|
||||
\include{Chapters/Chapter_02}
|
||||
\include{Chapters/Chapter_03}
|
||||
\include{Chapters/Chapter_04}
|
||||
|
||||
\renewcommand*{\bibname}{References}
|
||||
\bibliographystyle{IEEEtran}
|
||||
\ifthenelse{\boolean{PrintVersion}}{
|
||||
\cleardoublepage
|
||||
}{
|
||||
\clearpage
|
||||
}
|
||||
\phantomsection
|
||||
\bibliography{bibliography/keylatex}
|
||||
|
||||
\clearpage
|
||||
|
||||
\end{document}
|
||||
16
node_modules/.bin/prettier
generated
vendored
Normal file
@ -0,0 +1,16 @@
|
||||
#!/bin/sh
|
||||
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
|
||||
|
||||
case `uname` in
|
||||
*CYGWIN*|*MINGW*|*MSYS*)
|
||||
if command -v cygpath > /dev/null 2>&1; then
|
||||
basedir=`cygpath -w "$basedir"`
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
|
||||
if [ -x "$basedir/node" ]; then
|
||||
exec "$basedir/node" "$basedir/../prettier/bin/prettier.cjs" "$@"
|
||||
else
|
||||
exec node "$basedir/../prettier/bin/prettier.cjs" "$@"
|
||||
fi
|
||||
17
node_modules/.bin/prettier.cmd
generated
vendored
Normal file
@ -0,0 +1,17 @@
|
||||
@ECHO off
|
||||
GOTO start
|
||||
:find_dp0
|
||||
SET dp0=%~dp0
|
||||
EXIT /b
|
||||
:start
|
||||
SETLOCAL
|
||||
CALL :find_dp0
|
||||
|
||||
IF EXIST "%dp0%\node.exe" (
|
||||
SET "_prog=%dp0%\node.exe"
|
||||
) ELSE (
|
||||
SET "_prog=node"
|
||||
SET PATHEXT=%PATHEXT:;.JS;=;%
|
||||
)
|
||||
|
||||
endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\prettier\bin\prettier.cjs" %*
|
||||
28
node_modules/.bin/prettier.ps1
generated
vendored
Normal file
@ -0,0 +1,28 @@
|
||||
#!/usr/bin/env pwsh
|
||||
$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
|
||||
|
||||
$exe=""
|
||||
if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
|
||||
# Fix case when both the Windows and Linux builds of Node
|
||||
# are installed in the same directory
|
||||
$exe=".exe"
|
||||
}
|
||||
$ret=0
|
||||
if (Test-Path "$basedir/node$exe") {
|
||||
# Support pipeline input
|
||||
if ($MyInvocation.ExpectingInput) {
|
||||
$input | & "$basedir/node$exe" "$basedir/../prettier/bin/prettier.cjs" $args
|
||||
} else {
|
||||
& "$basedir/node$exe" "$basedir/../prettier/bin/prettier.cjs" $args
|
||||
}
|
||||
$ret=$LASTEXITCODE
|
||||
} else {
|
||||
# Support pipeline input
|
||||
if ($MyInvocation.ExpectingInput) {
|
||||
$input | & "node$exe" "$basedir/../prettier/bin/prettier.cjs" $args
|
||||
} else {
|
||||
& "node$exe" "$basedir/../prettier/bin/prettier.cjs" $args
|
||||
}
|
||||
$ret=$LASTEXITCODE
|
||||
}
|
||||
exit $ret
|
||||
525
node_modules/.package-lock.json
generated
vendored
Normal file
@ -0,0 +1,525 @@
|
||||
{
|
||||
"name": "srs",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"node_modules/@types/unist": {
|
||||
"version": "2.0.11",
|
||||
"resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz",
|
||||
"integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@unified-latex/unified-latex-builder": {
|
||||
"version": "1.8.0",
|
||||
"resolved": "https://registry.npmjs.org/@unified-latex/unified-latex-builder/-/unified-latex-builder-1.8.0.tgz",
|
||||
"integrity": "sha512-1s5MIan/qaYeqJI1Tk3bfUwdkk0jIrQXRJt0dF0j3JWT9RG60WbiXp+593eOJgFYJtn+h3FdM0bvalfa+ZzTXg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@unified-latex/unified-latex-types": "^1.8.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@unified-latex/unified-latex-ctan": {
|
||||
"version": "1.8.2",
|
||||
"resolved": "https://registry.npmjs.org/@unified-latex/unified-latex-ctan/-/unified-latex-ctan-1.8.2.tgz",
|
||||
"integrity": "sha512-VuOEU3Kzed/b+lm+nypYtV1IiqIuFWpwx92WNtBW1w3S+Ba/Ffolx+/LoAd8uuCcyCmygkQi3eZJNHxarzyVIg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@unified-latex/unified-latex-builder": "^1.8.0",
|
||||
"@unified-latex/unified-latex-types": "^1.8.0",
|
||||
"@unified-latex/unified-latex-util-argspec": "^1.8.2",
|
||||
"@unified-latex/unified-latex-util-arguments": "^1.8.2",
|
||||
"@unified-latex/unified-latex-util-comments": "^1.8.2",
|
||||
"@unified-latex/unified-latex-util-match": "^1.8.0",
|
||||
"@unified-latex/unified-latex-util-pegjs": "^1.8.1",
|
||||
"@unified-latex/unified-latex-util-print-raw": "^1.8.0",
|
||||
"@unified-latex/unified-latex-util-render-info": "^1.8.2",
|
||||
"@unified-latex/unified-latex-util-replace": "^1.8.2",
|
||||
"@unified-latex/unified-latex-util-scan": "^1.8.0",
|
||||
"@unified-latex/unified-latex-util-split": "^1.8.0",
|
||||
"@unified-latex/unified-latex-util-trim": "^1.8.2",
|
||||
"@unified-latex/unified-latex-util-visit": "^1.8.2",
|
||||
"color": "^4.2.3"
|
||||
}
|
||||
},
|
||||
"node_modules/@unified-latex/unified-latex-prettier": {
|
||||
"version": "2.4.2",
|
||||
"resolved": "https://registry.npmjs.org/@unified-latex/unified-latex-prettier/-/unified-latex-prettier-2.4.2.tgz",
|
||||
"integrity": "sha512-gMvlKGiGi9zOWVHXPhzeURhPYwPIJ7MBht42et/sVb4Z2wTjhcn+bU7kookT067ywOptVZNBgJw+iAgSORAd+w==",
|
||||
"deprecated": "Incorrect version number",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@unified-latex/unified-latex-ctan": "^1.4.1",
|
||||
"@unified-latex/unified-latex-types": "^1.3.1",
|
||||
"@unified-latex/unified-latex-util-align": "^1.4.0",
|
||||
"@unified-latex/unified-latex-util-match": "^1.4.0",
|
||||
"@unified-latex/unified-latex-util-parse": "^1.4.1",
|
||||
"@unified-latex/unified-latex-util-pgfkeys": "^1.4.0",
|
||||
"@unified-latex/unified-latex-util-print-raw": "^1.4.0",
|
||||
"@unified-latex/unified-latex-util-trim": "^1.4.0",
|
||||
"@unified-latex/unified-latex-util-visit": "^1.4.0",
|
||||
"prettier": "^3.0.3",
|
||||
"unified": "^10.1.2"
|
||||
}
|
||||
},
|
||||
"node_modules/@unified-latex/unified-latex-types": {
|
||||
"version": "1.8.0",
|
||||
"resolved": "https://registry.npmjs.org/@unified-latex/unified-latex-types/-/unified-latex-types-1.8.0.tgz",
|
||||
"integrity": "sha512-GLJbBmmfDOWtdEbpQCLb7++zPxXin36aC9XOVCuiVNMR9VYv3szOJa+ZdTilVCFHpOeFhKh6zRws96vJgz2tGA==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@unified-latex/unified-latex-util-align": {
|
||||
"version": "1.8.1",
|
||||
"resolved": "https://registry.npmjs.org/@unified-latex/unified-latex-util-align/-/unified-latex-util-align-1.8.1.tgz",
|
||||
"integrity": "sha512-csJxLrvziRc5ZkhcRsYI7gSQBGC4fXucPtwNkTscbSIy7PfYF7BfWBPc61sb9jXQg4T4R6MLdG/Tz6Pgb6z1bw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@unified-latex/unified-latex-types": "^1.8.0",
|
||||
"@unified-latex/unified-latex-util-match": "^1.8.0",
|
||||
"@unified-latex/unified-latex-util-pegjs": "^1.8.1"
|
||||
}
|
||||
},
|
||||
"node_modules/@unified-latex/unified-latex-util-argspec": {
|
||||
"version": "1.8.2",
|
||||
"resolved": "https://registry.npmjs.org/@unified-latex/unified-latex-util-argspec/-/unified-latex-util-argspec-1.8.2.tgz",
|
||||
"integrity": "sha512-ts+6Ha9JhcMCt+rbajjiG0srxCz2jHcNrIe3zma2HQzmKNOGxpoTdA7+E4sG2wJgQK1+eQ9MrjGeLBCNXH7fGg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@unified-latex/unified-latex-util-pegjs": "^1.8.1"
|
||||
}
|
||||
},
|
||||
"node_modules/@unified-latex/unified-latex-util-arguments": {
|
||||
"version": "1.8.2",
|
||||
"resolved": "https://registry.npmjs.org/@unified-latex/unified-latex-util-arguments/-/unified-latex-util-arguments-1.8.2.tgz",
|
||||
"integrity": "sha512-81OqsLoVUhVFgp64z7Jrtndgl5fJGvZKV1eipNWH4IH2hFEM8RZ0fmLxyOn7S/NjYuqWeOJ3WhjOvRHtmLLf2Q==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@unified-latex/unified-latex-builder": "^1.8.0",
|
||||
"@unified-latex/unified-latex-types": "^1.8.0",
|
||||
"@unified-latex/unified-latex-util-argspec": "^1.8.2",
|
||||
"@unified-latex/unified-latex-util-match": "^1.8.0",
|
||||
"@unified-latex/unified-latex-util-render-info": "^1.8.2",
|
||||
"@unified-latex/unified-latex-util-scan": "^1.8.0",
|
||||
"@unified-latex/unified-latex-util-visit": "^1.8.2",
|
||||
"unified": "^10.1.2"
|
||||
}
|
||||
},
|
||||
"node_modules/@unified-latex/unified-latex-util-catcode": {
|
||||
"version": "1.8.2",
|
||||
"resolved": "https://registry.npmjs.org/@unified-latex/unified-latex-util-catcode/-/unified-latex-util-catcode-1.8.2.tgz",
|
||||
"integrity": "sha512-zChzwfcXufJ5tMkBNC06GdMFj3ldWnlL1eLszFNtcWPvB6KyXHjOPRSZ9aILjbZEd2ogBc8lOKc5ug+iBFBVxA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@unified-latex/unified-latex-types": "^1.8.0",
|
||||
"@unified-latex/unified-latex-util-match": "^1.8.0",
|
||||
"@unified-latex/unified-latex-util-visit": "^1.8.2"
|
||||
}
|
||||
},
|
||||
"node_modules/@unified-latex/unified-latex-util-comments": {
|
||||
"version": "1.8.2",
|
||||
"resolved": "https://registry.npmjs.org/@unified-latex/unified-latex-util-comments/-/unified-latex-util-comments-1.8.2.tgz",
|
||||
"integrity": "sha512-OGeT3BYzLT6hRgyRrPqXTJBpD/JaJl5yIcpQfm5wpcDFBVfcDOCZ8/Xc7UwosOvCjM5EHVTJIxmDQ1epZg3IzA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@unified-latex/unified-latex-types": "^1.8.0",
|
||||
"@unified-latex/unified-latex-util-match": "^1.8.0",
|
||||
"@unified-latex/unified-latex-util-replace": "^1.8.2"
|
||||
}
|
||||
},
|
||||
"node_modules/@unified-latex/unified-latex-util-environments": {
|
||||
"version": "1.8.2",
|
||||
"resolved": "https://registry.npmjs.org/@unified-latex/unified-latex-util-environments/-/unified-latex-util-environments-1.8.2.tgz",
|
||||
"integrity": "sha512-ZaL28+sUtVOSsWv2LfcGXmOJoQJ0Vu4se/7R83awutr2cS3YIZsyCIRFfhz1jYyedWfGLtq+a/2MWJfcIcd7Jg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@unified-latex/unified-latex-types": "^1.8.0",
|
||||
"@unified-latex/unified-latex-util-arguments": "^1.8.2",
|
||||
"@unified-latex/unified-latex-util-match": "^1.8.0",
|
||||
"@unified-latex/unified-latex-util-print-raw": "^1.8.0",
|
||||
"@unified-latex/unified-latex-util-render-info": "^1.8.2",
|
||||
"@unified-latex/unified-latex-util-visit": "^1.8.2",
|
||||
"unified": "^10.1.2"
|
||||
}
|
||||
},
|
||||
"node_modules/@unified-latex/unified-latex-util-match": {
|
||||
"version": "1.8.0",
|
||||
"resolved": "https://registry.npmjs.org/@unified-latex/unified-latex-util-match/-/unified-latex-util-match-1.8.0.tgz",
|
||||
"integrity": "sha512-fjuLI1KVhWTHkfWn0kR8/RhM2oD2hxWhzgskUMLJ/IZMye9ESvVo8ItG4y+BtpwGFWpTmCtpMNXHjknIQxza9Q==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@unified-latex/unified-latex-types": "^1.8.0",
|
||||
"@unified-latex/unified-latex-util-print-raw": "^1.8.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@unified-latex/unified-latex-util-parse": {
|
||||
"version": "1.8.2",
|
||||
"resolved": "https://registry.npmjs.org/@unified-latex/unified-latex-util-parse/-/unified-latex-util-parse-1.8.2.tgz",
|
||||
"integrity": "sha512-PyHQTZWS7/BCVa8ojBEmVl5a3iXs5ZSOqhp2R/bbroe7+OEmQbqULPq4GigHA6ClEbPmP8uxmgHZDFGH2cfR7A==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@unified-latex/unified-latex-ctan": "^1.8.2",
|
||||
"@unified-latex/unified-latex-types": "^1.8.0",
|
||||
"@unified-latex/unified-latex-util-arguments": "^1.8.2",
|
||||
"@unified-latex/unified-latex-util-catcode": "^1.8.2",
|
||||
"@unified-latex/unified-latex-util-environments": "^1.8.2",
|
||||
"@unified-latex/unified-latex-util-match": "^1.8.0",
|
||||
"@unified-latex/unified-latex-util-pegjs": "^1.8.1",
|
||||
"@unified-latex/unified-latex-util-print-raw": "^1.8.0",
|
||||
"@unified-latex/unified-latex-util-trim": "^1.8.2",
|
||||
"@unified-latex/unified-latex-util-visit": "^1.8.2",
|
||||
"unified": "^10.1.2"
|
||||
}
|
||||
},
|
||||
"node_modules/@unified-latex/unified-latex-util-pegjs": {
|
||||
"version": "1.8.1",
|
||||
"resolved": "https://registry.npmjs.org/@unified-latex/unified-latex-util-pegjs/-/unified-latex-util-pegjs-1.8.1.tgz",
|
||||
"integrity": "sha512-1N6WknnzKGACFCmgaEZ2j89j5C2dKhmAOCfy6moD+AMm6nUb69Xp9pJ1jDfqz+Uz9+zRo5I6ksr6q5GgmAJvtw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@unified-latex/unified-latex-types": "^1.8.0",
|
||||
"@unified-latex/unified-latex-util-match": "^1.8.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@unified-latex/unified-latex-util-pgfkeys": {
|
||||
"version": "1.8.1",
|
||||
"resolved": "https://registry.npmjs.org/@unified-latex/unified-latex-util-pgfkeys/-/unified-latex-util-pgfkeys-1.8.1.tgz",
|
||||
"integrity": "sha512-VwZeUzmPgKwO2sZ9xx4Ul0Mp82DVdWg32krOlH9dzW4ZQDOBTnRtvx6LQmg9b7Iz3F2pHLYU0LCCaJlvFNBm1A==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@unified-latex/unified-latex-types": "^1.8.0",
|
||||
"@unified-latex/unified-latex-util-match": "^1.8.0",
|
||||
"@unified-latex/unified-latex-util-pegjs": "^1.8.1",
|
||||
"@unified-latex/unified-latex-util-print-raw": "^1.8.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@unified-latex/unified-latex-util-print-raw": {
|
||||
"version": "1.8.0",
|
||||
"resolved": "https://registry.npmjs.org/@unified-latex/unified-latex-util-print-raw/-/unified-latex-util-print-raw-1.8.0.tgz",
|
||||
"integrity": "sha512-lMuLqnHXCDNqrjslf6hBAA2McEI+oaaxvjA9zfeAeWZyZh+DUJjkmwiuxYejwHHKbQvqzregNP4wtb9OvaC21g==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@unified-latex/unified-latex-types": "^1.8.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@unified-latex/unified-latex-util-render-info": {
|
||||
"version": "1.8.2",
|
||||
"resolved": "https://registry.npmjs.org/@unified-latex/unified-latex-util-render-info/-/unified-latex-util-render-info-1.8.2.tgz",
|
||||
"integrity": "sha512-Hjqt8Kx2/pYWwd/S3H397zyenLFwoZsmo7BL/Q7mJfj5wNs35ZMdoHQa0O8tLeZjezkWB2eejODVBsu5xDDCjw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@unified-latex/unified-latex-types": "^1.8.0",
|
||||
"@unified-latex/unified-latex-util-visit": "^1.8.2"
|
||||
}
|
||||
},
|
||||
"node_modules/@unified-latex/unified-latex-util-replace": {
|
||||
"version": "1.8.2",
|
||||
"resolved": "https://registry.npmjs.org/@unified-latex/unified-latex-util-replace/-/unified-latex-util-replace-1.8.2.tgz",
|
||||
"integrity": "sha512-89GNj4p5wJmSUGAmdFlGnb/SaV4WykroK85bYbY3Fwppp7kO6sVYSRGfrTEIFob1S4HGL6xrYYUnCueI0+ZzhQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@unified-latex/unified-latex-types": "^1.8.0",
|
||||
"@unified-latex/unified-latex-util-match": "^1.8.0",
|
||||
"@unified-latex/unified-latex-util-split": "^1.8.0",
|
||||
"@unified-latex/unified-latex-util-trim": "^1.8.2",
|
||||
"@unified-latex/unified-latex-util-visit": "^1.8.2",
|
||||
"unified": "^10.1.2"
|
||||
}
|
||||
},
|
||||
"node_modules/@unified-latex/unified-latex-util-scan": {
|
||||
"version": "1.8.0",
|
||||
"resolved": "https://registry.npmjs.org/@unified-latex/unified-latex-util-scan/-/unified-latex-util-scan-1.8.0.tgz",
|
||||
"integrity": "sha512-4WWDTcLOhlkZsGmGl/IZA0Jg2rTitVwGf6ktxs57AyuCEdzHA5ZeNwzSewW8wpHQdLfnPX+LNEnaukwEdWfF1g==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@unified-latex/unified-latex-types": "^1.8.0",
|
||||
"@unified-latex/unified-latex-util-match": "^1.8.0",
|
||||
"@unified-latex/unified-latex-util-print-raw": "^1.8.0",
|
||||
"trie-prefix-tree": "^1.5.1"
|
||||
}
|
||||
},
|
||||
"node_modules/@unified-latex/unified-latex-util-split": {
|
||||
"version": "1.8.0",
|
||||
"resolved": "https://registry.npmjs.org/@unified-latex/unified-latex-util-split/-/unified-latex-util-split-1.8.0.tgz",
|
||||
"integrity": "sha512-gRlRge72wcvLRs6bEoVbh0fDACbkioEPDJOr7XaCuQqjNNu1VTXlcvImZQVXCdMG6CJ4lqiaJRwnUupK4rsmsA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@unified-latex/unified-latex-types": "^1.8.0",
|
||||
"@unified-latex/unified-latex-util-match": "^1.8.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@unified-latex/unified-latex-util-trim": {
|
||||
"version": "1.8.2",
|
||||
"resolved": "https://registry.npmjs.org/@unified-latex/unified-latex-util-trim/-/unified-latex-util-trim-1.8.2.tgz",
|
||||
"integrity": "sha512-zshEykIuLvngWNl7RnMP86KE3yieVLK2u+byPioh6JVQCwkHoz/UiPzl+fuPw/u+93LPNSJBRa16a03sviqyBA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@unified-latex/unified-latex-types": "^1.8.0",
|
||||
"@unified-latex/unified-latex-util-match": "^1.8.0",
|
||||
"@unified-latex/unified-latex-util-visit": "^1.8.2",
|
||||
"unified": "^10.1.2"
|
||||
}
|
||||
},
|
||||
"node_modules/@unified-latex/unified-latex-util-visit": {
|
||||
"version": "1.8.2",
|
||||
"resolved": "https://registry.npmjs.org/@unified-latex/unified-latex-util-visit/-/unified-latex-util-visit-1.8.2.tgz",
|
||||
"integrity": "sha512-Xq8516ZTKCfjB/txSIbUWtdIR2NdWO8/LlhjMLljFCEO4IE1KfhCCgKgwxNa7uuCkGG0e0BwVEHQIjH4TQZARQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@unified-latex/unified-latex-types": "^1.8.0",
|
||||
"@unified-latex/unified-latex-util-match": "^1.8.0"
|
||||
}
|
||||
},
|
||||
"node_modules/bail": {
|
||||
"version": "2.0.2",
|
||||
"resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz",
|
||||
"integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"funding": {
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/wooorm"
|
||||
}
|
||||
},
|
||||
"node_modules/color": {
|
||||
"version": "4.2.3",
|
||||
"resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz",
|
||||
"integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"color-convert": "^2.0.1",
|
||||
"color-string": "^1.9.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=12.5.0"
|
||||
}
|
||||
},
|
||||
"node_modules/color-convert": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
|
||||
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"color-name": "~1.1.4"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=7.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/color-name": {
|
||||
"version": "1.1.4",
|
||||
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
|
||||
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/color-string": {
|
||||
"version": "1.9.1",
|
||||
"resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz",
|
||||
"integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"color-name": "^1.0.0",
|
||||
"simple-swizzle": "^0.2.2"
|
||||
}
|
||||
},
|
||||
"node_modules/extend": {
|
||||
"version": "3.0.2",
|
||||
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
|
||||
"integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/is-arrayish": {
|
||||
"version": "0.3.2",
|
||||
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
|
||||
"integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/is-buffer": {
|
||||
"version": "2.0.5",
|
||||
"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz",
|
||||
"integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==",
|
||||
"dev": true,
|
||||
"funding": [
|
||||
{
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/feross"
|
||||
},
|
||||
{
|
||||
"type": "patreon",
|
||||
"url": "https://www.patreon.com/feross"
|
||||
},
|
||||
{
|
||||
"type": "consulting",
|
||||
"url": "https://feross.org/support"
|
||||
}
|
||||
],
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=4"
|
||||
}
|
||||
},
|
||||
"node_modules/is-plain-obj": {
|
||||
"version": "4.1.0",
|
||||
"resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
|
||||
"integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/prettier": {
|
||||
"version": "3.5.3",
|
||||
"resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz",
|
||||
"integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"bin": {
|
||||
"prettier": "bin/prettier.cjs"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=14"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/prettier/prettier?sponsor=1"
|
||||
}
|
||||
},
|
||||
"node_modules/prettier-plugin-latex": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/prettier-plugin-latex/-/prettier-plugin-latex-2.0.1.tgz",
|
||||
"integrity": "sha512-xIKGN0uWU+JwGHI92ixohngGLpy2nGQhYnmTtVue/jbw+K0fFPddQ3pMXx3fjtmmUhlbZisYXehJtcJ9Ford0g==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@unified-latex/unified-latex-prettier": "^2.4.2",
|
||||
"prettier": "^3.0.3"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 18.0"
|
||||
}
|
||||
},
|
||||
"node_modules/simple-swizzle": {
|
||||
"version": "0.2.2",
|
||||
"resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
|
||||
"integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"is-arrayish": "^0.3.1"
|
||||
}
|
||||
},
|
||||
"node_modules/trie-prefix-tree": {
|
||||
"version": "1.5.1",
|
||||
"resolved": "https://registry.npmjs.org/trie-prefix-tree/-/trie-prefix-tree-1.5.1.tgz",
|
||||
"integrity": "sha512-Jjvj/dA97wXnabG/NLJUgo4IQMj6vucH+Qxm7of/omfWSmZlPqdRU6Ta4GmQqCZH+n3/iYZUwfvUoEhB0Hs83Q==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/trough": {
|
||||
"version": "2.2.0",
|
||||
"resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz",
|
||||
"integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"funding": {
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/wooorm"
|
||||
}
|
||||
},
|
||||
"node_modules/unified": {
|
||||
"version": "10.1.2",
|
||||
"resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz",
|
||||
"integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@types/unist": "^2.0.0",
|
||||
"bail": "^2.0.0",
|
||||
"extend": "^3.0.0",
|
||||
"is-buffer": "^2.0.0",
|
||||
"is-plain-obj": "^4.0.0",
|
||||
"trough": "^2.0.0",
|
||||
"vfile": "^5.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/unified"
|
||||
}
|
||||
},
|
||||
"node_modules/unist-util-stringify-position": {
|
||||
"version": "3.0.3",
|
||||
"resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz",
|
||||
"integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@types/unist": "^2.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/unified"
|
||||
}
|
||||
},
|
||||
"node_modules/vfile": {
|
||||
"version": "5.3.7",
|
||||
"resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz",
|
||||
"integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@types/unist": "^2.0.0",
|
||||
"is-buffer": "^2.0.0",
|
||||
"unist-util-stringify-position": "^3.0.0",
|
||||
"vfile-message": "^3.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/unified"
|
||||
}
|
||||
},
|
||||
"node_modules/vfile-message": {
|
||||
"version": "3.1.4",
|
||||
"resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz",
|
||||
"integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@types/unist": "^2.0.0",
|
||||
"unist-util-stringify-position": "^3.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/unified"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
21
node_modules/@types/unist/LICENSE
generated
vendored
Normal file
@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) Microsoft Corporation.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE
|
||||
122
node_modules/@types/unist/README.md
generated
vendored
Normal file
@ -0,0 +1,122 @@
|
||||
# Installation
|
||||
> `npm install --save @types/unist`
|
||||
|
||||
# Summary
|
||||
This package contains type definitions for unist (https://github.com/syntax-tree/unist).
|
||||
|
||||
# Details
|
||||
Files were exported from https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/unist/v2.
|
||||
## [index.d.ts](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/unist/v2/index.d.ts)
|
||||
````ts
|
||||
/**
|
||||
* Syntactic units in unist syntax trees are called nodes.
|
||||
*
|
||||
* @typeParam TData Information from the ecosystem. Useful for more specific {@link Node.data}.
|
||||
*/
|
||||
export interface Node<TData extends object = Data> {
|
||||
/**
|
||||
* The variant of a node.
|
||||
*/
|
||||
type: string;
|
||||
|
||||
/**
|
||||
* Information from the ecosystem.
|
||||
*/
|
||||
data?: TData | undefined;
|
||||
|
||||
/**
|
||||
* Location of a node in a source document.
|
||||
* Must not be present if a node is generated.
|
||||
*/
|
||||
position?: Position | undefined;
|
||||
}
|
||||
|
||||
/**
|
||||
* Information associated by the ecosystem with the node.
|
||||
* Space is guaranteed to never be specified by unist or specifications
|
||||
* implementing unist.
|
||||
*/
|
||||
export interface Data {
|
||||
[key: string]: unknown;
|
||||
}
|
||||
|
||||
/**
|
||||
* Location of a node in a source file.
|
||||
*/
|
||||
export interface Position {
|
||||
/**
|
||||
* Place of the first character of the parsed source region.
|
||||
*/
|
||||
start: Point;
|
||||
|
||||
/**
|
||||
* Place of the first character after the parsed source region.
|
||||
*/
|
||||
end: Point;
|
||||
|
||||
/**
|
||||
* Start column at each index (plus start line) in the source region,
|
||||
* for elements that span multiple lines.
|
||||
*/
|
||||
indent?: number[] | undefined;
|
||||
}
|
||||
|
||||
/**
|
||||
* One place in a source file.
|
||||
*/
|
||||
export interface Point {
|
||||
/**
|
||||
* Line in a source file (1-indexed integer).
|
||||
*/
|
||||
line: number;
|
||||
|
||||
/**
|
||||
* Column in a source file (1-indexed integer).
|
||||
*/
|
||||
column: number;
|
||||
/**
|
||||
* Character in a source file (0-indexed integer).
|
||||
*/
|
||||
offset?: number | undefined;
|
||||
}
|
||||
|
||||
/**
|
||||
* Util for extracting type of {@link Node.data}
|
||||
*
|
||||
* @typeParam TNode Specific node type such as {@link Node} with {@link Data}, {@link Literal}, etc.
|
||||
*
|
||||
* @example `NodeData<Node<{ key: string }>>` -> `{ key: string }`
|
||||
*/
|
||||
export type NodeData<TNode extends Node<object>> = TNode extends Node<infer TData> ? TData : never;
|
||||
|
||||
/**
|
||||
* Nodes containing other nodes.
|
||||
*
|
||||
* @typeParam ChildNode Node item of {@link Parent.children}
|
||||
*/
|
||||
export interface Parent<ChildNode extends Node<object> = Node, TData extends object = NodeData<ChildNode>>
|
||||
extends Node<TData>
|
||||
{
|
||||
/**
|
||||
* List representing the children of a node.
|
||||
*/
|
||||
children: ChildNode[];
|
||||
}
|
||||
|
||||
/**
|
||||
* Nodes containing a value.
|
||||
*
|
||||
* @typeParam Value Specific value type of {@link Literal.value} such as `string` for `Text` node
|
||||
*/
|
||||
export interface Literal<Value = unknown, TData extends object = Data> extends Node<TData> {
|
||||
value: Value;
|
||||
}
|
||||
|
||||
````
|
||||
|
||||
### Additional Details
|
||||
* Last updated: Thu, 15 Aug 2024 02:18:53 GMT
|
||||
* Dependencies: none
|
||||
|
||||
# Credits
|
||||
These definitions were written by [bizen241](https://github.com/bizen241), [Jun Lu](https://github.com/lujun2), [Hernan Rajchert](https://github.com/hrajchert), [Titus Wormer](https://github.com/wooorm), [Junyoung Choi](https://github.com/rokt33r), [Ben Moon](https://github.com/GuiltyDolphin), and [JounQin](https://github.com/JounQin).
|
||||
103
node_modules/@types/unist/index.d.ts
generated
vendored
Normal file
@ -0,0 +1,103 @@
|
||||
/**
|
||||
* Syntactic units in unist syntax trees are called nodes.
|
||||
*
|
||||
* @typeParam TData Information from the ecosystem. Useful for more specific {@link Node.data}.
|
||||
*/
|
||||
export interface Node<TData extends object = Data> {
|
||||
/**
|
||||
* The variant of a node.
|
||||
*/
|
||||
type: string;
|
||||
|
||||
/**
|
||||
* Information from the ecosystem.
|
||||
*/
|
||||
data?: TData | undefined;
|
||||
|
||||
/**
|
||||
* Location of a node in a source document.
|
||||
* Must not be present if a node is generated.
|
||||
*/
|
||||
position?: Position | undefined;
|
||||
}
|
||||
|
||||
/**
|
||||
* Information associated by the ecosystem with the node.
|
||||
* Space is guaranteed to never be specified by unist or specifications
|
||||
* implementing unist.
|
||||
*/
|
||||
export interface Data {
|
||||
[key: string]: unknown;
|
||||
}
|
||||
|
||||
/**
|
||||
* Location of a node in a source file.
|
||||
*/
|
||||
export interface Position {
|
||||
/**
|
||||
* Place of the first character of the parsed source region.
|
||||
*/
|
||||
start: Point;
|
||||
|
||||
/**
|
||||
* Place of the first character after the parsed source region.
|
||||
*/
|
||||
end: Point;
|
||||
|
||||
/**
|
||||
* Start column at each index (plus start line) in the source region,
|
||||
* for elements that span multiple lines.
|
||||
*/
|
||||
indent?: number[] | undefined;
|
||||
}
|
||||
|
||||
/**
|
||||
* One place in a source file.
|
||||
*/
|
||||
export interface Point {
|
||||
/**
|
||||
* Line in a source file (1-indexed integer).
|
||||
*/
|
||||
line: number;
|
||||
|
||||
/**
|
||||
* Column in a source file (1-indexed integer).
|
||||
*/
|
||||
column: number;
|
||||
/**
|
||||
* Character in a source file (0-indexed integer).
|
||||
*/
|
||||
offset?: number | undefined;
|
||||
}
|
||||
|
||||
/**
|
||||
* Util for extracting type of {@link Node.data}
|
||||
*
|
||||
* @typeParam TNode Specific node type such as {@link Node} with {@link Data}, {@link Literal}, etc.
|
||||
*
|
||||
* @example `NodeData<Node<{ key: string }>>` -> `{ key: string }`
|
||||
*/
|
||||
export type NodeData<TNode extends Node<object>> = TNode extends Node<infer TData> ? TData : never;
|
||||
|
||||
/**
|
||||
* Nodes containing other nodes.
|
||||
*
|
||||
* @typeParam ChildNode Node item of {@link Parent.children}
|
||||
*/
|
||||
export interface Parent<ChildNode extends Node<object> = Node, TData extends object = NodeData<ChildNode>>
|
||||
extends Node<TData>
|
||||
{
|
||||
/**
|
||||
* List representing the children of a node.
|
||||
*/
|
||||
children: ChildNode[];
|
||||
}
|
||||
|
||||
/**
|
||||
* Nodes containing a value.
|
||||
*
|
||||
* @typeParam Value Specific value type of {@link Literal.value} such as `string` for `Text` node
|
||||
*/
|
||||
export interface Literal<Value = unknown, TData extends object = Data> extends Node<TData> {
|
||||
value: Value;
|
||||
}
|
||||
55
node_modules/@types/unist/package.json
generated
vendored
Normal file
@ -0,0 +1,55 @@
|
||||
{
|
||||
"name": "@types/unist",
|
||||
"version": "2.0.11",
|
||||
"description": "TypeScript definitions for unist",
|
||||
"homepage": "https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/unist",
|
||||
"license": "MIT",
|
||||
"contributors": [
|
||||
{
|
||||
"name": "bizen241",
|
||||
"githubUsername": "bizen241",
|
||||
"url": "https://github.com/bizen241"
|
||||
},
|
||||
{
|
||||
"name": "Jun Lu",
|
||||
"githubUsername": "lujun2",
|
||||
"url": "https://github.com/lujun2"
|
||||
},
|
||||
{
|
||||
"name": "Hernan Rajchert",
|
||||
"githubUsername": "hrajchert",
|
||||
"url": "https://github.com/hrajchert"
|
||||
},
|
||||
{
|
||||
"name": "Titus Wormer",
|
||||
"githubUsername": "wooorm",
|
||||
"url": "https://github.com/wooorm"
|
||||
},
|
||||
{
|
||||
"name": "Junyoung Choi",
|
||||
"githubUsername": "rokt33r",
|
||||
"url": "https://github.com/rokt33r"
|
||||
},
|
||||
{
|
||||
"name": "Ben Moon",
|
||||
"githubUsername": "GuiltyDolphin",
|
||||
"url": "https://github.com/GuiltyDolphin"
|
||||
},
|
||||
{
|
||||
"name": "JounQin",
|
||||
"githubUsername": "JounQin",
|
||||
"url": "https://github.com/JounQin"
|
||||
}
|
||||
],
|
||||
"main": "",
|
||||
"types": "index.d.ts",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/DefinitelyTyped/DefinitelyTyped.git",
|
||||
"directory": "types/unist"
|
||||
},
|
||||
"scripts": {},
|
||||
"dependencies": {},
|
||||
"typesPublisherContentHash": "6e36525a6db49ae5517fe0751796ca8f6c65099098415046d4f1ad6c2ef1a33c",
|
||||
"typeScriptVersion": "4.8"
|
||||
}
|
||||
178
node_modules/@unified-latex/unified-latex-builder/README.md
generated
vendored
Normal file
@ -0,0 +1,178 @@
|
||||
<!-- DO NOT MODIFY -->
|
||||
<!-- This file was autogenerated by build-docs.ts -->
|
||||
<!-- Edit the docstring in index.ts and regenerate -->
|
||||
<!-- rather than editing this file directly. -->
|
||||
# unified-latex-builder
|
||||
|
||||
## What is this?
|
||||
|
||||
Functions to help build a `unified-latex` Abstract Syntax Tree (AST)
|
||||
with [hyperscript](https://github.com/dominictarr/hyperscript)-like syntax.
|
||||
|
||||
## When should I use this?
|
||||
|
||||
If you want to programmatically create `Ast.Node` nodes.
|
||||
|
||||
## Install
|
||||
|
||||
```bash
|
||||
npm install @unified-latex/unified-latex-builder
|
||||
```
|
||||
|
||||
This package contains both esm and commonjs exports. To explicitly access the esm export,
|
||||
import the `.js` file. To explicitly access the commonjs export, import the `.cjs` file.
|
||||
|
||||
# Functions
|
||||
|
||||
## `arg(args, special)`
|
||||
|
||||
Create an Argument. `special.braces` can optionally specify
|
||||
the signature of the open/close marks that each argument uses. For example
|
||||
|
||||
arg("a", { braces: "[]" });
|
||||
|
||||
will result in arguments `[a]`. Valid braces are `*`, `[`, `{`, `<`, and `(`.
|
||||
|
||||
`null` may be passed as the value of an empty optional argument. If `null` is passed,
|
||||
the `openBrace` and `closeBrace` of the argument will be set to empty strings and the
|
||||
contents will be set to an empty array. For example,
|
||||
|
||||
args([null, "b"], { braces: "[]{}" });
|
||||
|
||||
will produce the same structure as if the the first "optional argument" were omitted in regular parsing.
|
||||
|
||||
```typescript
|
||||
function arg(
|
||||
args: CoercibleArgument | Ast.Node[],
|
||||
special: ArgumentSpecialOptions
|
||||
): Ast.Argument;
|
||||
```
|
||||
|
||||
**Parameters**
|
||||
|
||||
| Param | Type |
|
||||
| :------ | :-------------------------------- |
|
||||
| args | <span color='gray'>Omitted</span> |
|
||||
| special | `ArgumentSpecialOptions` |
|
||||
|
||||
where
|
||||
|
||||
```typescript
|
||||
type ArgumentSpecialOptions = {
|
||||
braces?: string;
|
||||
openMark?: string;
|
||||
closeMark?: string;
|
||||
};
|
||||
```
|
||||
|
||||
## `args(args, special)`
|
||||
|
||||
Create an Argument list. `special.braces` can optionally specify
|
||||
the signature of the open/close marks that each argument uses. For example
|
||||
|
||||
args(["a", "b"], { braces: "[]{}" });
|
||||
|
||||
will result in arguments `[a]{b}`. Valid braces are `*`, `[`, `{`, `(`, and `<`.
|
||||
|
||||
`null` may be passed as the value of an empty optional argument. If `null` is passed,
|
||||
the `openBrace` and `closeBrace` of the argument will be set to empty strings and the
|
||||
contents will be set to an empty array. For example,
|
||||
|
||||
args([null, "b"], { braces: "[]{}" });
|
||||
|
||||
will produce the same structure as if the the first "optional argument" were omitted in regular parsing.
|
||||
|
||||
```typescript
|
||||
function args(
|
||||
args: CoercibleArgument | CoercibleArgument[],
|
||||
special: ArgumentsSpecialOptions
|
||||
): Ast.Argument[];
|
||||
```
|
||||
|
||||
**Parameters**
|
||||
|
||||
| Param | Type |
|
||||
| :------ | :-------------------------------- |
|
||||
| args | <span color='gray'>Omitted</span> |
|
||||
| special | `ArgumentsSpecialOptions` |
|
||||
|
||||
where
|
||||
|
||||
```typescript
|
||||
type ArgumentsSpecialOptions = {
|
||||
braces?: string;
|
||||
defaultOpenMark?: string;
|
||||
defaultCloseMark?: string;
|
||||
};
|
||||
```
|
||||
|
||||
## `env(name, body, envArgs, special)`
|
||||
|
||||
Create an Environment node.
|
||||
|
||||
```typescript
|
||||
function env(
|
||||
name: String,
|
||||
body: CoercibleNode | CoercibleNode[],
|
||||
envArgs: CoercibleArgument | CoercibleArgument[],
|
||||
special: {}
|
||||
): Ast.Environment;
|
||||
```
|
||||
|
||||
**Parameters**
|
||||
|
||||
| Param | Type |
|
||||
| :------ | :-------------------------------- |
|
||||
| name | `String` |
|
||||
| body | <span color='gray'>Omitted</span> |
|
||||
| envArgs | <span color='gray'>Omitted</span> |
|
||||
| special | `{}` |
|
||||
|
||||
## `m(name, marcoArgs, special)`
|
||||
|
||||
Create a Macro with the given `name`. The macro
|
||||
may be followed by any number of arguments.
|
||||
|
||||
```typescript
|
||||
function m(
|
||||
name: String,
|
||||
marcoArgs: CoercibleArgument | CoercibleArgument[],
|
||||
special: MacroSpecialOptions
|
||||
): Ast.Macro;
|
||||
```
|
||||
|
||||
**Parameters**
|
||||
|
||||
| Param | Type |
|
||||
| :-------- | :-------------------------------- |
|
||||
| name | `String` |
|
||||
| marcoArgs | <span color='gray'>Omitted</span> |
|
||||
| special | `MacroSpecialOptions` |
|
||||
|
||||
where
|
||||
|
||||
```typescript
|
||||
type MacroSpecialOptions = {
|
||||
escapeToken?: string;
|
||||
};
|
||||
```
|
||||
|
||||
## `s(value)`
|
||||
|
||||
Create a String node from `value`
|
||||
|
||||
```typescript
|
||||
function s(value: string | Ast.String): Ast.String;
|
||||
```
|
||||
|
||||
**Parameters**
|
||||
|
||||
| Param | Type |
|
||||
| :---- | :--------------------- |
|
||||
| value | `string \| Ast.String` |
|
||||
|
||||
# Constants
|
||||
|
||||
| Name | Type | Description |
|
||||
| :--- | :--------------- | :--------------- |
|
||||
| `SP` | `Ast.Whitespace` | Whitespace node. |
|
||||
142
node_modules/@unified-latex/unified-latex-builder/index.cjs
generated
vendored
Normal file
@ -0,0 +1,142 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
||||
function normalizeNode(node) {
|
||||
if (typeof node === "string") {
|
||||
return s(node);
|
||||
}
|
||||
return node;
|
||||
}
|
||||
function normalizeArgument(arg2, openMark = "{", closeMark = "}") {
|
||||
if (arg2 == null) {
|
||||
return { type: "argument", content: [], openMark: "", closeMark: "" };
|
||||
}
|
||||
if (typeof arg2 === "string") {
|
||||
return {
|
||||
type: "argument",
|
||||
openMark,
|
||||
closeMark,
|
||||
content: [s(arg2)]
|
||||
};
|
||||
}
|
||||
if (arg2.type === "argument") {
|
||||
return arg2;
|
||||
}
|
||||
return { type: "argument", openMark, closeMark, content: [arg2] };
|
||||
}
|
||||
function normalizeArgumentsList(args2, openMark = "{", closeMark = "}") {
|
||||
if (args2 == null) {
|
||||
return [];
|
||||
}
|
||||
if (Array.isArray(args2)) {
|
||||
return args2.map((arg2) => normalizeArgument(arg2, openMark, closeMark));
|
||||
}
|
||||
return [normalizeArgument(args2, openMark, closeMark)];
|
||||
}
|
||||
const BRACES_MAP = {
|
||||
"*": { openMark: "", closeMark: "" },
|
||||
"{": { openMark: "{", closeMark: "}" },
|
||||
"[": { openMark: "[", closeMark: "]" },
|
||||
"(": { openMark: "(", closeMark: ")" },
|
||||
"<": { openMark: "<", closeMark: ">" }
|
||||
};
|
||||
const CLOSE_BRACES = new Set(
|
||||
Object.values(BRACES_MAP).map((x) => x.closeMark).filter((x) => x)
|
||||
);
|
||||
function bracesToOpenAndCloseMarks(braces) {
|
||||
const ret = [];
|
||||
for (const char of braces.split("")) {
|
||||
if (CLOSE_BRACES.has(char)) {
|
||||
continue;
|
||||
}
|
||||
const braces2 = BRACES_MAP[char];
|
||||
if (braces2 == null) {
|
||||
throw new Error(`Unknown open/close mark type "${char}"`);
|
||||
}
|
||||
ret.push(braces2);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
function args(args2, special) {
|
||||
if (!Array.isArray(args2)) {
|
||||
args2 = [args2];
|
||||
}
|
||||
if (special == null ? void 0 : special.braces) {
|
||||
const braces = bracesToOpenAndCloseMarks(special.braces);
|
||||
if (braces.length !== args2.length) {
|
||||
throw new Error(
|
||||
`There is a difference between the number of supplied braces and the number of supplied arguments. ${args2.length} supplied with braces signature ${special.braces}`
|
||||
);
|
||||
}
|
||||
return args2.map(
|
||||
(arg2, i) => normalizeArgument(arg2, braces[i].openMark, braces[i].closeMark)
|
||||
);
|
||||
}
|
||||
const openMark = (special == null ? void 0 : special.defaultOpenMark) ?? "{";
|
||||
const closeMark = (special == null ? void 0 : special.defaultCloseMark) ?? "}";
|
||||
return normalizeArgumentsList(args2, openMark, closeMark);
|
||||
}
|
||||
function arg(args2, special) {
|
||||
if (args2 == null) {
|
||||
return { type: "argument", content: [], openMark: "", closeMark: "" };
|
||||
}
|
||||
if (typeof args2 === "string") {
|
||||
args2 = s(args2);
|
||||
}
|
||||
if (!Array.isArray(args2) && args2.type === "argument") {
|
||||
return args2;
|
||||
}
|
||||
let openMark = (special == null ? void 0 : special.openMark) ?? "{";
|
||||
let closeMark = (special == null ? void 0 : special.closeMark) ?? "}";
|
||||
if (special == null ? void 0 : special.braces) {
|
||||
const braces = bracesToOpenAndCloseMarks(special.braces);
|
||||
if (braces[0]) {
|
||||
openMark = braces[0].openMark;
|
||||
closeMark = braces[0].closeMark;
|
||||
}
|
||||
}
|
||||
if (!Array.isArray(args2)) {
|
||||
args2 = [args2];
|
||||
}
|
||||
return { type: "argument", content: args2, openMark, closeMark };
|
||||
}
|
||||
function m(name, marcoArgs, special) {
|
||||
const args2 = normalizeArgumentsList(marcoArgs);
|
||||
const escapeToken = special == null ? void 0 : special.escapeToken;
|
||||
const ret = { type: "macro", content: name };
|
||||
if (args2.length > 0) {
|
||||
ret.args = args2;
|
||||
}
|
||||
if (escapeToken != null) {
|
||||
ret.escapeToken = escapeToken;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
function s(value) {
|
||||
if (typeof value === "string") {
|
||||
return { type: "string", content: value };
|
||||
}
|
||||
return value;
|
||||
}
|
||||
function env(name, body, envArgs, special) {
|
||||
if (!Array.isArray(body)) {
|
||||
body = [body];
|
||||
}
|
||||
const args2 = normalizeArgumentsList(envArgs, "[", "]");
|
||||
const ret = {
|
||||
type: "environment",
|
||||
env: name,
|
||||
content: body.map(normalizeNode)
|
||||
};
|
||||
if (args2.length > 0) {
|
||||
ret.args = args2;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
const SP = { type: "whitespace" };
|
||||
exports.SP = SP;
|
||||
exports.arg = arg;
|
||||
exports.args = args;
|
||||
exports.env = env;
|
||||
exports.m = m;
|
||||
exports.s = s;
|
||||
//# sourceMappingURL=index.cjs.map
|
||||
1
node_modules/@unified-latex/unified-latex-builder/index.cjs.map
generated
vendored
Normal file
80
node_modules/@unified-latex/unified-latex-builder/index.d.ts
generated
vendored
Normal file
@ -0,0 +1,80 @@
|
||||
import type * as Ast from '@unified-latex/unified-latex-types';
|
||||
|
||||
/**
|
||||
* Create an Argument. `special.braces` can optionally specify
|
||||
* the signature of the open/close marks that each argument uses. For example
|
||||
* ```
|
||||
* arg("a", { braces: "[]" });
|
||||
* ```
|
||||
* will result in arguments `[a]`. Valid braces are `*`, `[`, `{`, `<`, and `(`.
|
||||
*
|
||||
* `null` may be passed as the value of an empty optional argument. If `null` is passed,
|
||||
* the `openBrace` and `closeBrace` of the argument will be set to empty strings and the
|
||||
* contents will be set to an empty array. For example,
|
||||
* ```
|
||||
* args([null, "b"], { braces: "[]{}" });
|
||||
* ```
|
||||
* will produce the same structure as if the the first "optional argument" were omitted in regular parsing.
|
||||
*/
|
||||
export declare function arg(args: CoercibleArgument | Ast.Node[], special?: ArgumentSpecialOptions): Ast.Argument;
|
||||
|
||||
/**
|
||||
* Create an Argument list. `special.braces` can optionally specify
|
||||
* the signature of the open/close marks that each argument uses. For example
|
||||
* ```
|
||||
* args(["a", "b"], { braces: "[]{}" });
|
||||
* ```
|
||||
* will result in arguments `[a]{b}`. Valid braces are `*`, `[`, `{`, `(`, and `<`.
|
||||
*
|
||||
* `null` may be passed as the value of an empty optional argument. If `null` is passed,
|
||||
* the `openBrace` and `closeBrace` of the argument will be set to empty strings and the
|
||||
* contents will be set to an empty array. For example,
|
||||
* ```
|
||||
* args([null, "b"], { braces: "[]{}" });
|
||||
* ```
|
||||
* will produce the same structure as if the the first "optional argument" were omitted in regular parsing.
|
||||
*/
|
||||
export declare function args(args: CoercibleArgument | CoercibleArgument[], special?: ArgumentsSpecialOptions): Ast.Argument[];
|
||||
|
||||
declare type ArgumentSpecialOptions = {
|
||||
braces?: string;
|
||||
openMark?: string;
|
||||
closeMark?: string;
|
||||
};
|
||||
|
||||
declare type ArgumentsSpecialOptions = {
|
||||
braces?: string;
|
||||
defaultOpenMark?: string;
|
||||
defaultCloseMark?: string;
|
||||
};
|
||||
|
||||
declare type CoercibleArgument = null | CoercibleNode | Ast.Argument;
|
||||
|
||||
declare type CoercibleNode = string | Ast.Node;
|
||||
|
||||
/**
|
||||
* Create an Environment node.
|
||||
*/
|
||||
export declare function env(name: string, body: CoercibleNode | CoercibleNode[], envArgs?: CoercibleArgument | CoercibleArgument[], special?: unknown): Ast.Environment;
|
||||
|
||||
/**
|
||||
* Create a Macro with the given `name`. The macro
|
||||
* may be followed by any number of arguments.
|
||||
*/
|
||||
export declare function m(name: string, marcoArgs?: CoercibleArgument | CoercibleArgument[], special?: MacroSpecialOptions): Ast.Macro;
|
||||
|
||||
declare type MacroSpecialOptions = {
|
||||
escapeToken?: string;
|
||||
};
|
||||
|
||||
/**
|
||||
* Create a String node from `value`
|
||||
*/
|
||||
export declare function s(value: string | Ast.String): Ast.String;
|
||||
|
||||
/**
|
||||
* Whitespace node.
|
||||
*/
|
||||
export declare const SP: Ast.Whitespace;
|
||||
|
||||
export { }
|
||||
142
node_modules/@unified-latex/unified-latex-builder/index.js
generated
vendored
Normal file
@ -0,0 +1,142 @@
|
||||
function normalizeNode(node) {
|
||||
if (typeof node === "string") {
|
||||
return s(node);
|
||||
}
|
||||
return node;
|
||||
}
|
||||
function normalizeArgument(arg2, openMark = "{", closeMark = "}") {
|
||||
if (arg2 == null) {
|
||||
return { type: "argument", content: [], openMark: "", closeMark: "" };
|
||||
}
|
||||
if (typeof arg2 === "string") {
|
||||
return {
|
||||
type: "argument",
|
||||
openMark,
|
||||
closeMark,
|
||||
content: [s(arg2)]
|
||||
};
|
||||
}
|
||||
if (arg2.type === "argument") {
|
||||
return arg2;
|
||||
}
|
||||
return { type: "argument", openMark, closeMark, content: [arg2] };
|
||||
}
|
||||
function normalizeArgumentsList(args2, openMark = "{", closeMark = "}") {
|
||||
if (args2 == null) {
|
||||
return [];
|
||||
}
|
||||
if (Array.isArray(args2)) {
|
||||
return args2.map((arg2) => normalizeArgument(arg2, openMark, closeMark));
|
||||
}
|
||||
return [normalizeArgument(args2, openMark, closeMark)];
|
||||
}
|
||||
const BRACES_MAP = {
|
||||
"*": { openMark: "", closeMark: "" },
|
||||
"{": { openMark: "{", closeMark: "}" },
|
||||
"[": { openMark: "[", closeMark: "]" },
|
||||
"(": { openMark: "(", closeMark: ")" },
|
||||
"<": { openMark: "<", closeMark: ">" }
|
||||
};
|
||||
const CLOSE_BRACES = new Set(
|
||||
Object.values(BRACES_MAP).map((x) => x.closeMark).filter((x) => x)
|
||||
);
|
||||
function bracesToOpenAndCloseMarks(braces) {
|
||||
const ret = [];
|
||||
for (const char of braces.split("")) {
|
||||
if (CLOSE_BRACES.has(char)) {
|
||||
continue;
|
||||
}
|
||||
const braces2 = BRACES_MAP[char];
|
||||
if (braces2 == null) {
|
||||
throw new Error(`Unknown open/close mark type "${char}"`);
|
||||
}
|
||||
ret.push(braces2);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
function args(args2, special) {
|
||||
if (!Array.isArray(args2)) {
|
||||
args2 = [args2];
|
||||
}
|
||||
if (special == null ? void 0 : special.braces) {
|
||||
const braces = bracesToOpenAndCloseMarks(special.braces);
|
||||
if (braces.length !== args2.length) {
|
||||
throw new Error(
|
||||
`There is a difference between the number of supplied braces and the number of supplied arguments. ${args2.length} supplied with braces signature ${special.braces}`
|
||||
);
|
||||
}
|
||||
return args2.map(
|
||||
(arg2, i) => normalizeArgument(arg2, braces[i].openMark, braces[i].closeMark)
|
||||
);
|
||||
}
|
||||
const openMark = (special == null ? void 0 : special.defaultOpenMark) ?? "{";
|
||||
const closeMark = (special == null ? void 0 : special.defaultCloseMark) ?? "}";
|
||||
return normalizeArgumentsList(args2, openMark, closeMark);
|
||||
}
|
||||
function arg(args2, special) {
|
||||
if (args2 == null) {
|
||||
return { type: "argument", content: [], openMark: "", closeMark: "" };
|
||||
}
|
||||
if (typeof args2 === "string") {
|
||||
args2 = s(args2);
|
||||
}
|
||||
if (!Array.isArray(args2) && args2.type === "argument") {
|
||||
return args2;
|
||||
}
|
||||
let openMark = (special == null ? void 0 : special.openMark) ?? "{";
|
||||
let closeMark = (special == null ? void 0 : special.closeMark) ?? "}";
|
||||
if (special == null ? void 0 : special.braces) {
|
||||
const braces = bracesToOpenAndCloseMarks(special.braces);
|
||||
if (braces[0]) {
|
||||
openMark = braces[0].openMark;
|
||||
closeMark = braces[0].closeMark;
|
||||
}
|
||||
}
|
||||
if (!Array.isArray(args2)) {
|
||||
args2 = [args2];
|
||||
}
|
||||
return { type: "argument", content: args2, openMark, closeMark };
|
||||
}
|
||||
function m(name, marcoArgs, special) {
|
||||
const args2 = normalizeArgumentsList(marcoArgs);
|
||||
const escapeToken = special == null ? void 0 : special.escapeToken;
|
||||
const ret = { type: "macro", content: name };
|
||||
if (args2.length > 0) {
|
||||
ret.args = args2;
|
||||
}
|
||||
if (escapeToken != null) {
|
||||
ret.escapeToken = escapeToken;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
function s(value) {
|
||||
if (typeof value === "string") {
|
||||
return { type: "string", content: value };
|
||||
}
|
||||
return value;
|
||||
}
|
||||
function env(name, body, envArgs, special) {
|
||||
if (!Array.isArray(body)) {
|
||||
body = [body];
|
||||
}
|
||||
const args2 = normalizeArgumentsList(envArgs, "[", "]");
|
||||
const ret = {
|
||||
type: "environment",
|
||||
env: name,
|
||||
content: body.map(normalizeNode)
|
||||
};
|
||||
if (args2.length > 0) {
|
||||
ret.args = args2;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
const SP = { type: "whitespace" };
|
||||
export {
|
||||
SP,
|
||||
arg,
|
||||
args,
|
||||
env,
|
||||
m,
|
||||
s
|
||||
};
|
||||
//# sourceMappingURL=index.js.map
|
||||
1
node_modules/@unified-latex/unified-latex-builder/index.js.map
generated
vendored
Normal file
51
node_modules/@unified-latex/unified-latex-builder/package.json
generated
vendored
Normal file
@ -0,0 +1,51 @@
|
||||
{
|
||||
"name": "@unified-latex/unified-latex-builder",
|
||||
"version": "1.8.0",
|
||||
"description": "Tools for constructing unified-latex ASTs",
|
||||
"main": "index.js",
|
||||
"type": "module",
|
||||
"dependencies": {
|
||||
"@unified-latex/unified-latex-types": "^1.8.0"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/siefkenj/unified-latex.git"
|
||||
},
|
||||
"keywords": [
|
||||
"pegjs",
|
||||
"latex",
|
||||
"parser",
|
||||
"prettier",
|
||||
"unified-latex",
|
||||
"unified"
|
||||
],
|
||||
"author": "Jason Siefken",
|
||||
"license": "MIT",
|
||||
"bugs": {
|
||||
"url": "https://github.com/siefkenj/unified-latex/issues"
|
||||
},
|
||||
"homepage": "https://github.com/siefkenj/unified-latex#readme",
|
||||
"exports": {
|
||||
".": {
|
||||
"import": "./index.js",
|
||||
"require": "./index.cjs",
|
||||
"types": "./index.d.ts"
|
||||
},
|
||||
"./*js": "./*js",
|
||||
"./*": {
|
||||
"import": "./*/index.js",
|
||||
"require": "./*/index.cjs",
|
||||
"types": "./*/index.d.ts"
|
||||
},
|
||||
"./*/index": {
|
||||
"import": "./*/index.js",
|
||||
"require": "./*/index.cjs"
|
||||
}
|
||||
},
|
||||
"files": [
|
||||
"**/*ts",
|
||||
"**/*js",
|
||||
"**/*.map",
|
||||
"**/*.json"
|
||||
]
|
||||
}
|
||||
46
node_modules/@unified-latex/unified-latex-ctan/README.md
generated
vendored
Normal file
@ -0,0 +1,46 @@
|
||||
<!-- DO NOT MODIFY -->
|
||||
<!-- This file was autogenerated by build-docs.ts -->
|
||||
<!-- Edit the docstring in index.ts and regenerate -->
|
||||
<!-- rather than editing this file directly. -->
|
||||
# unified-latex-ctan
|
||||
|
||||
## What is this?
|
||||
|
||||
Macro/environment definitions and utilities for specific LaTeX packages from CTAN.
|
||||
|
||||
Note: basic LaTeX macro/environment definitions come from the `latex2e` package, even though
|
||||
this is technically not a CTAN "package".
|
||||
|
||||
## When should I use this?
|
||||
|
||||
If you want information about special functions/macros from particular CTAN packages, or
|
||||
you need to parse special environments.
|
||||
|
||||
## Notes
|
||||
|
||||
By default all macros/environments that are exported get processed. If multiple packages
|
||||
export a macro with the same name, then the later-exported one takes precedence. If two packages
|
||||
export a macro/environment of the same name but with conflicting argument signatures, this can
|
||||
cause issues when another unified-latex package processes arguments positionally. For example,
|
||||
by default `\textbf` takes one argument, but the beamer version of `\textbf` takes two arguments.
|
||||
During HTML conversion, if arguments are referenced positionally, this may cause previously-working
|
||||
code to fail with when beamer macro signatures are used. A workaround is provided: `_renderInfo.namedArguments`.
|
||||
If `_renderInfo.namedArguments` is specified on both the original macro/environment definition
|
||||
**and** the conflicting one, other unified-latex commands can reference arguments by name instead
|
||||
of by position.
|
||||
|
||||
## Install
|
||||
|
||||
```bash
|
||||
npm install @unified-latex/unified-latex-ctan
|
||||
```
|
||||
|
||||
This package contains both esm and commonjs exports. To explicitly access the esm export,
|
||||
import the `.js` file. To explicitly access the commonjs export, import the `.cjs` file.
|
||||
|
||||
# Constants
|
||||
|
||||
| Name | Type | Description |
|
||||
| :---------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------- |
|
||||
| `environmentInfo` | `{ amsart: EnvInfoRecord; cleveref: EnvInfoRecord; exam: EnvInfoRecord; geometry: EnvInfoRecord; hyperref: EnvInfoRecord; ... 11 more ...; multicol: EnvInfoRecord; }` | Info about the environments for available ctan packages. `latex2e` contains
the standard environments for LaTeX. |
|
||||
| `macroInfo` | `{ amsart: MacroInfoRecord; cleveref: MacroInfoRecord; exam: MacroInfoRecord; geometry: MacroInfoRecord; hyperref: MacroInfoRecord; ... 11 more ...; multicol: MacroInfoRecord; }` | Info about the macros for available ctan packages. `latex2e` contains
the standard macros for LaTeX. |
|
||||
68
node_modules/@unified-latex/unified-latex-ctan/enumerate-DSh8p1uS.cjs
generated
vendored
Normal file
@ -0,0 +1,68 @@
|
||||
"use strict";
|
||||
const unifiedLatexBuilder = require("@unified-latex/unified-latex-builder");
|
||||
const unifiedLatexUtilMatch = require("@unified-latex/unified-latex-util-match");
|
||||
const unifiedLatexUtilRenderInfo = require("@unified-latex/unified-latex-util-render-info");
|
||||
const unifiedLatexUtilReplace = require("@unified-latex/unified-latex-util-replace");
|
||||
const unifiedLatexUtilSplit = require("@unified-latex/unified-latex-util-split");
|
||||
const unifiedLatexUtilTrim = require("@unified-latex/unified-latex-util-trim");
|
||||
function cleanEnumerateBody(ast, itemName = "item") {
|
||||
let { segments, macros } = unifiedLatexUtilSplit.splitOnMacro(ast, itemName);
|
||||
for (let i = 0; i < segments.length; i++) {
|
||||
const segment = segments[i];
|
||||
if (i === 0) {
|
||||
unifiedLatexUtilTrim.trimEnd(segment);
|
||||
} else {
|
||||
unifiedLatexUtilTrim.trim(segment);
|
||||
}
|
||||
if (segment.length > 0 && i > 0) {
|
||||
segment.unshift({ type: "whitespace" });
|
||||
}
|
||||
}
|
||||
let insertParbreakBefore = /* @__PURE__ */ new WeakSet();
|
||||
let body = macros.flatMap((node, i) => {
|
||||
var _a;
|
||||
const segment = segments[i + 1];
|
||||
const trailingComments = popTrailingComments(segment);
|
||||
node.args = node.args || [];
|
||||
node.args.push(unifiedLatexBuilder.arg(segment, { openMark: "", closeMark: "" }));
|
||||
unifiedLatexUtilRenderInfo.updateRenderInfo(node, { inParMode: true });
|
||||
if (i > 0 || ((_a = segments[0]) == null ? void 0 : _a.length) > 0) {
|
||||
insertParbreakBefore.add(node);
|
||||
}
|
||||
return [node, ...trailingComments];
|
||||
});
|
||||
body = body.flatMap(
|
||||
(node) => insertParbreakBefore.has(node) ? [{ type: "parbreak" }, node] : node
|
||||
);
|
||||
body.unshift(...segments[0]);
|
||||
for (let i = 0; i < body.length - 1; i++) {
|
||||
const node = body[i];
|
||||
const nextNode = body[i + 1];
|
||||
if (!unifiedLatexUtilMatch.match.parbreak(nextNode)) {
|
||||
continue;
|
||||
}
|
||||
if (unifiedLatexUtilMatch.match.comment(node)) {
|
||||
node.suffixParbreak = true;
|
||||
}
|
||||
if (unifiedLatexUtilMatch.match.macro(node) && node.args && node.args[node.args.length - 1].closeMark === "") {
|
||||
const args = node.args[node.args.length - 1].content;
|
||||
const lastArg = args[args.length - 1];
|
||||
if (unifiedLatexUtilMatch.match.comment(lastArg)) {
|
||||
lastArg.suffixParbreak = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return body;
|
||||
}
|
||||
function popTrailingComments(nodes) {
|
||||
let lastNodeIndex = unifiedLatexUtilReplace.lastSignificantNodeIndex(nodes, true);
|
||||
if (lastNodeIndex === nodes.length - 1 || lastNodeIndex == null && nodes.length === 0) {
|
||||
return [];
|
||||
}
|
||||
if (lastNodeIndex == null) {
|
||||
lastNodeIndex = -1;
|
||||
}
|
||||
return nodes.splice(lastNodeIndex + 1);
|
||||
}
|
||||
exports.cleanEnumerateBody = cleanEnumerateBody;
|
||||
//# sourceMappingURL=enumerate-DSh8p1uS.cjs.map
|
||||
1
node_modules/@unified-latex/unified-latex-ctan/enumerate-DSh8p1uS.cjs.map
generated
vendored
Normal file
69
node_modules/@unified-latex/unified-latex-ctan/enumerate-wQeKG6-C.js
generated
vendored
Normal file
@ -0,0 +1,69 @@
|
||||
import { arg } from "@unified-latex/unified-latex-builder";
|
||||
import { match } from "@unified-latex/unified-latex-util-match";
|
||||
import { updateRenderInfo } from "@unified-latex/unified-latex-util-render-info";
|
||||
import { lastSignificantNodeIndex } from "@unified-latex/unified-latex-util-replace";
|
||||
import { splitOnMacro } from "@unified-latex/unified-latex-util-split";
|
||||
import { trimEnd, trim } from "@unified-latex/unified-latex-util-trim";
|
||||
function cleanEnumerateBody(ast, itemName = "item") {
|
||||
let { segments, macros } = splitOnMacro(ast, itemName);
|
||||
for (let i = 0; i < segments.length; i++) {
|
||||
const segment = segments[i];
|
||||
if (i === 0) {
|
||||
trimEnd(segment);
|
||||
} else {
|
||||
trim(segment);
|
||||
}
|
||||
if (segment.length > 0 && i > 0) {
|
||||
segment.unshift({ type: "whitespace" });
|
||||
}
|
||||
}
|
||||
let insertParbreakBefore = /* @__PURE__ */ new WeakSet();
|
||||
let body = macros.flatMap((node, i) => {
|
||||
var _a;
|
||||
const segment = segments[i + 1];
|
||||
const trailingComments = popTrailingComments(segment);
|
||||
node.args = node.args || [];
|
||||
node.args.push(arg(segment, { openMark: "", closeMark: "" }));
|
||||
updateRenderInfo(node, { inParMode: true });
|
||||
if (i > 0 || ((_a = segments[0]) == null ? void 0 : _a.length) > 0) {
|
||||
insertParbreakBefore.add(node);
|
||||
}
|
||||
return [node, ...trailingComments];
|
||||
});
|
||||
body = body.flatMap(
|
||||
(node) => insertParbreakBefore.has(node) ? [{ type: "parbreak" }, node] : node
|
||||
);
|
||||
body.unshift(...segments[0]);
|
||||
for (let i = 0; i < body.length - 1; i++) {
|
||||
const node = body[i];
|
||||
const nextNode = body[i + 1];
|
||||
if (!match.parbreak(nextNode)) {
|
||||
continue;
|
||||
}
|
||||
if (match.comment(node)) {
|
||||
node.suffixParbreak = true;
|
||||
}
|
||||
if (match.macro(node) && node.args && node.args[node.args.length - 1].closeMark === "") {
|
||||
const args = node.args[node.args.length - 1].content;
|
||||
const lastArg = args[args.length - 1];
|
||||
if (match.comment(lastArg)) {
|
||||
lastArg.suffixParbreak = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return body;
|
||||
}
|
||||
function popTrailingComments(nodes) {
|
||||
let lastNodeIndex = lastSignificantNodeIndex(nodes, true);
|
||||
if (lastNodeIndex === nodes.length - 1 || lastNodeIndex == null && nodes.length === 0) {
|
||||
return [];
|
||||
}
|
||||
if (lastNodeIndex == null) {
|
||||
lastNodeIndex = -1;
|
||||
}
|
||||
return nodes.splice(lastNodeIndex + 1);
|
||||
}
|
||||
export {
|
||||
cleanEnumerateBody as c
|
||||
};
|
||||
//# sourceMappingURL=enumerate-wQeKG6-C.js.map
|
||||
1
node_modules/@unified-latex/unified-latex-ctan/enumerate-wQeKG6-C.js.map
generated
vendored
Normal file
21
node_modules/@unified-latex/unified-latex-ctan/index-BuqJUpao.cjs
generated
vendored
Normal file
@ -0,0 +1,21 @@
|
||||
"use strict";
|
||||
(function() {
|
||||
if (typeof globalThis === "object") {
|
||||
return;
|
||||
}
|
||||
Object.defineProperty(Object.prototype, "__magic__", {
|
||||
get: function() {
|
||||
return this;
|
||||
},
|
||||
configurable: true
|
||||
// This makes it possible to `delete` the getter later.
|
||||
});
|
||||
__magic__.globalThis = __magic__;
|
||||
delete Object.prototype.__magic__;
|
||||
})();
|
||||
const clone = typeof globalThis.structuredClone === "function" ? globalThis.structuredClone : (obj) => JSON.parse(JSON.stringify(obj));
|
||||
function structuredClone(obj) {
|
||||
return clone(obj);
|
||||
}
|
||||
exports.structuredClone = structuredClone;
|
||||
//# sourceMappingURL=index-BuqJUpao.cjs.map
|
||||
1
node_modules/@unified-latex/unified-latex-ctan/index-BuqJUpao.cjs.map
generated
vendored
Normal file
@ -0,0 +1 @@
|
||||
{"version":3,"file":"index-BuqJUpao.cjs","sources":["../../structured-clone/index.ts"],"sourcesContent":["// globalThis polyfill from https://mathiasbynens.be/notes/globalthis\n(function () {\n if (typeof globalThis === \"object\") {\n return;\n }\n Object.defineProperty(Object.prototype, \"__magic__\", {\n get: function () {\n return this;\n },\n configurable: true, // This makes it possible to `delete` the getter later.\n });\n __magic__.globalThis = __magic__; // lolwat\n delete Object.prototype.__magic__;\n})();\n\nconst clone =\n typeof globalThis.structuredClone === \"function\"\n ? globalThis.structuredClone\n : (obj: any) => JSON.parse(JSON.stringify(obj));\n\n/**\n * Wrapper around the built-in structured clone. Uses `JSON.parse(JSON.stringify(...))`\n * as a fallback.\n */\nexport function structuredClone<T>(obj: T): T {\n return clone(obj);\n}\n\ndeclare global {\n const __magic__: any;\n interface Object {\n __magic__?: any;\n }\n}\n"],"names":[],"mappings":";CACC,WAAY;AACL,MAAA,OAAO,eAAe,UAAU;AAChC;AAAA,EAAA;AAEG,SAAA,eAAe,OAAO,WAAW,aAAa;AAAA,IACjD,KAAK,WAAY;AACN,aAAA;AAAA,IACX;AAAA,IACA,cAAc;AAAA;AAAA,EAAA,CACjB;AACD,YAAU,aAAa;AACvB,SAAO,OAAO,UAAU;AAC5B,GAAG;AAEH,MAAM,QACF,OAAO,WAAW,oBAAoB,aAChC,WAAW,kBACX,CAAC,QAAa,KAAK,MAAM,KAAK,UAAU,GAAG,CAAC;AAM/C,SAAS,gBAAmB,KAAW;AAC1C,SAAO,MAAM,GAAG;AACpB;;"}
|
||||
22
node_modules/@unified-latex/unified-latex-ctan/index-NHd3tQDq.js
generated
vendored
Normal file
@ -0,0 +1,22 @@
|
||||
(function() {
|
||||
if (typeof globalThis === "object") {
|
||||
return;
|
||||
}
|
||||
Object.defineProperty(Object.prototype, "__magic__", {
|
||||
get: function() {
|
||||
return this;
|
||||
},
|
||||
configurable: true
|
||||
// This makes it possible to `delete` the getter later.
|
||||
});
|
||||
__magic__.globalThis = __magic__;
|
||||
delete Object.prototype.__magic__;
|
||||
})();
|
||||
const clone = typeof globalThis.structuredClone === "function" ? globalThis.structuredClone : (obj) => JSON.parse(JSON.stringify(obj));
|
||||
function structuredClone(obj) {
|
||||
return clone(obj);
|
||||
}
|
||||
export {
|
||||
structuredClone as s
|
||||
};
|
||||
//# sourceMappingURL=index-NHd3tQDq.js.map
|
||||
1
node_modules/@unified-latex/unified-latex-ctan/index-NHd3tQDq.js.map
generated
vendored
Normal file
@ -0,0 +1 @@
|
||||
{"version":3,"file":"index-NHd3tQDq.js","sources":["../../structured-clone/index.ts"],"sourcesContent":["// globalThis polyfill from https://mathiasbynens.be/notes/globalthis\n(function () {\n if (typeof globalThis === \"object\") {\n return;\n }\n Object.defineProperty(Object.prototype, \"__magic__\", {\n get: function () {\n return this;\n },\n configurable: true, // This makes it possible to `delete` the getter later.\n });\n __magic__.globalThis = __magic__; // lolwat\n delete Object.prototype.__magic__;\n})();\n\nconst clone =\n typeof globalThis.structuredClone === \"function\"\n ? globalThis.structuredClone\n : (obj: any) => JSON.parse(JSON.stringify(obj));\n\n/**\n * Wrapper around the built-in structured clone. Uses `JSON.parse(JSON.stringify(...))`\n * as a fallback.\n */\nexport function structuredClone<T>(obj: T): T {\n return clone(obj);\n}\n\ndeclare global {\n const __magic__: any;\n interface Object {\n __magic__?: any;\n }\n}\n"],"names":[],"mappings":"CACC,WAAY;AACL,MAAA,OAAO,eAAe,UAAU;AAChC;AAAA,EAAA;AAEG,SAAA,eAAe,OAAO,WAAW,aAAa;AAAA,IACjD,KAAK,WAAY;AACN,aAAA;AAAA,IACX;AAAA,IACA,cAAc;AAAA;AAAA,EAAA,CACjB;AACD,YAAU,aAAa;AACvB,SAAO,OAAO,UAAU;AAC5B,GAAG;AAEH,MAAM,QACF,OAAO,WAAW,oBAAoB,aAChC,WAAW,kBACX,CAAC,QAAa,KAAK,MAAM,KAAK,UAAU,GAAG,CAAC;AAM/C,SAAS,gBAAmB,KAAW;AAC1C,SAAO,MAAM,GAAG;AACpB;"}
|
||||
71
node_modules/@unified-latex/unified-latex-ctan/index.cjs
generated
vendored
Normal file
@ -0,0 +1,71 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
||||
const index$9 = require("./package/amsart/index.cjs");
|
||||
const index$8 = require("./package/cleveref/index.cjs");
|
||||
const provides$4 = require("./provides-gOjhEUvC.cjs");
|
||||
const index$7 = require("./package/geometry/index.cjs");
|
||||
const index$6 = require("./package/hyperref/index.cjs");
|
||||
const provides$3 = require("./provides-DdQzqlsT.cjs");
|
||||
const provides$2 = require("./provides-BjJALsf_.cjs");
|
||||
const index$5 = require("./package/makeidx/index.cjs");
|
||||
const index$4 = require("./package/mathtools/index.cjs");
|
||||
const provides$1 = require("./provides-Bdw2Aj_V.cjs");
|
||||
const index$3 = require("./package/nicematrix/index.cjs");
|
||||
const provides = require("./provides-CwtnTL9q.cjs");
|
||||
require("@unified-latex/unified-latex-util-match");
|
||||
require("@unified-latex/unified-latex-util-pegjs");
|
||||
require("@unified-latex/unified-latex-util-print-raw");
|
||||
require("@unified-latex/unified-latex-util-split");
|
||||
require("./index-BuqJUpao.cjs");
|
||||
require("@unified-latex/unified-latex-util-comments");
|
||||
require("@unified-latex/unified-latex-util-visit");
|
||||
require("@unified-latex/unified-latex-util-render-info");
|
||||
require("@unified-latex/unified-latex-util-arguments");
|
||||
const parser = require("./parser-9Q3EtimU.cjs");
|
||||
require("@unified-latex/unified-latex-util-trim");
|
||||
const xcolor = require("./xcolor-BEfsW_1K.cjs");
|
||||
require("@unified-latex/unified-latex-builder");
|
||||
const index$2 = require("./package/xparse/index.cjs");
|
||||
const index$1 = require("./package/beamer/index.cjs");
|
||||
const index = require("./package/multicol/index.cjs");
|
||||
const macroInfo = {
|
||||
amsart: index$9.macros,
|
||||
cleveref: index$8.macros,
|
||||
exam: provides$4.macros,
|
||||
geometry: index$7.macros,
|
||||
hyperref: index$6.macros,
|
||||
latex2e: provides$3.macros,
|
||||
listings: provides$2.macros,
|
||||
makeidx: index$5.macros,
|
||||
mathtools: index$4.macros,
|
||||
minted: provides$1.macros,
|
||||
nicematrix: index$3.macros,
|
||||
systeme: provides.macros,
|
||||
tikz: parser.macros,
|
||||
xcolor: xcolor.macros,
|
||||
xparse: index$2.macros,
|
||||
beamer: index$1.macros,
|
||||
multicol: index.macros
|
||||
};
|
||||
const environmentInfo = {
|
||||
amsart: index$9.environments,
|
||||
cleveref: index$8.environments,
|
||||
exam: provides$4.environments,
|
||||
geometry: index$7.environments,
|
||||
hyperref: index$6.environments,
|
||||
latex2e: provides$3.environments,
|
||||
listings: provides$2.environments,
|
||||
makeidx: index$5.environments,
|
||||
mathtools: index$4.environments,
|
||||
minted: provides$1.environments,
|
||||
nicematrix: index$3.environments,
|
||||
systeme: provides.environments,
|
||||
tikz: parser.environments,
|
||||
xcolor: xcolor.environments,
|
||||
xparse: index$2.environments,
|
||||
beamer: index$1.environments,
|
||||
multicol: index.environments
|
||||
};
|
||||
exports.environmentInfo = environmentInfo;
|
||||
exports.macroInfo = macroInfo;
|
||||
//# sourceMappingURL=index.cjs.map
|
||||
1
node_modules/@unified-latex/unified-latex-ctan/index.cjs.map
generated
vendored
Normal file
73
node_modules/@unified-latex/unified-latex-ctan/index.d.ts
generated
vendored
Normal file
@ -0,0 +1,73 @@
|
||||
/**
|
||||
* Info about the macros for available ctan packages. `latex2e` contains
|
||||
* the standard macros for LaTeX.
|
||||
*/
|
||||
export declare const macroInfo: {
|
||||
amsart: import('@unified-latex/unified-latex-types').MacroInfoRecord;
|
||||
cleveref: import('@unified-latex/unified-latex-types').MacroInfoRecord;
|
||||
exam: import('@unified-latex/unified-latex-types').MacroInfoRecord;
|
||||
geometry: import('@unified-latex/unified-latex-types').MacroInfoRecord;
|
||||
hyperref: import('@unified-latex/unified-latex-types').MacroInfoRecord;
|
||||
latex2e: import('@unified-latex/unified-latex-types').MacroInfoRecord;
|
||||
listings: import('@unified-latex/unified-latex-types').MacroInfoRecord;
|
||||
makeidx: import('@unified-latex/unified-latex-types').MacroInfoRecord;
|
||||
mathtools: import('@unified-latex/unified-latex-types').MacroInfoRecord;
|
||||
minted: import('@unified-latex/unified-latex-types').MacroInfoRecord;
|
||||
nicematrix: import('@unified-latex/unified-latex-types').MacroInfoRecord;
|
||||
systeme: import('@unified-latex/unified-latex-types').MacroInfoRecord;
|
||||
tikz: import('@unified-latex/unified-latex-types').MacroInfoRecord;
|
||||
xcolor: import('@unified-latex/unified-latex-types').MacroInfoRecord;
|
||||
xparse: import('@unified-latex/unified-latex-types').MacroInfoRecord;
|
||||
beamer: import('@unified-latex/unified-latex-types').MacroInfoRecord;
|
||||
multicol: import('@unified-latex/unified-latex-types').MacroInfoRecord;
|
||||
};
|
||||
/**
|
||||
* Info about the environments for available ctan packages. `latex2e` contains
|
||||
* the standard environments for LaTeX.
|
||||
*/
|
||||
export declare const environmentInfo: {
|
||||
amsart: import('@unified-latex/unified-latex-types').EnvInfoRecord;
|
||||
cleveref: import('@unified-latex/unified-latex-types').EnvInfoRecord;
|
||||
exam: import('@unified-latex/unified-latex-types').EnvInfoRecord;
|
||||
geometry: import('@unified-latex/unified-latex-types').EnvInfoRecord;
|
||||
hyperref: import('@unified-latex/unified-latex-types').EnvInfoRecord;
|
||||
latex2e: import('@unified-latex/unified-latex-types').EnvInfoRecord;
|
||||
listings: import('@unified-latex/unified-latex-types').EnvInfoRecord;
|
||||
makeidx: import('@unified-latex/unified-latex-types').EnvInfoRecord;
|
||||
mathtools: import('@unified-latex/unified-latex-types').EnvInfoRecord;
|
||||
minted: import('@unified-latex/unified-latex-types').EnvInfoRecord;
|
||||
nicematrix: import('@unified-latex/unified-latex-types').EnvInfoRecord;
|
||||
systeme: import('@unified-latex/unified-latex-types').EnvInfoRecord;
|
||||
tikz: import('@unified-latex/unified-latex-types').EnvInfoRecord;
|
||||
xcolor: import('@unified-latex/unified-latex-types').EnvInfoRecord;
|
||||
xparse: import('@unified-latex/unified-latex-types').EnvInfoRecord;
|
||||
beamer: import('@unified-latex/unified-latex-types').EnvInfoRecord;
|
||||
multicol: import('@unified-latex/unified-latex-types').EnvInfoRecord;
|
||||
};
|
||||
/**
|
||||
* ## What is this?
|
||||
*
|
||||
* Macro/environment definitions and utilities for specific LaTeX packages from CTAN.
|
||||
*
|
||||
* Note: basic LaTeX macro/environment definitions come from the `latex2e` package, even though
|
||||
* this is technically not a CTAN "package".
|
||||
*
|
||||
* ## When should I use this?
|
||||
*
|
||||
* If you want information about special functions/macros from particular CTAN packages, or
|
||||
* you need to parse special environments.
|
||||
*
|
||||
* ## Notes
|
||||
*
|
||||
* By default all macros/environments that are exported get processed. If multiple packages
|
||||
* export a macro with the same name, then the later-exported one takes precedence. If two packages
|
||||
* export a macro/environment of the same name but with conflicting argument signatures, this can
|
||||
* cause issues when another unified-latex package processes arguments positionally. For example,
|
||||
* by default `\textbf` takes one argument, but the beamer version of `\textbf` takes two arguments.
|
||||
* During HTML conversion, if arguments are referenced positionally, this may cause previously-working
|
||||
* code to fail with when beamer macro signatures are used. A workaround is provided: `_renderInfo.namedArguments`.
|
||||
* If `_renderInfo.namedArguments` is specified on both the original macro/environment definition
|
||||
* **and** the conflicting one, other unified-latex commands can reference arguments by name instead
|
||||
* of by position.
|
||||
*/
|
||||
//# sourceMappingURL=index.d.ts.map
|
||||
71
node_modules/@unified-latex/unified-latex-ctan/index.js
generated
vendored
Normal file
@ -0,0 +1,71 @@
|
||||
import { macros as macros$g, environments as environments$g } from "./package/amsart/index.js";
|
||||
import { macros as macros$f, environments as environments$f } from "./package/cleveref/index.js";
|
||||
import { m as macros$e, e as environments$e } from "./provides-B-HiB8uu.js";
|
||||
import { macros as macros$d, environments as environments$d } from "./package/geometry/index.js";
|
||||
import { macros as macros$c, environments as environments$c } from "./package/hyperref/index.js";
|
||||
import { m as macros$b, e as environments$b } from "./provides-BUHzyq9A.js";
|
||||
import { m as macros$a, e as environments$a } from "./provides-Ch0mvkO_.js";
|
||||
import { macros as macros$9, environments as environments$9 } from "./package/makeidx/index.js";
|
||||
import { macros as macros$8, environments as environments$8 } from "./package/mathtools/index.js";
|
||||
import { m as macros$7, e as environments$7 } from "./provides-sdqk_ZBm.js";
|
||||
import { macros as macros$6, environments as environments$6 } from "./package/nicematrix/index.js";
|
||||
import { m as macros$5, e as environments$5 } from "./provides-yGf6-zdY.js";
|
||||
import "@unified-latex/unified-latex-util-match";
|
||||
import "@unified-latex/unified-latex-util-pegjs";
|
||||
import "@unified-latex/unified-latex-util-print-raw";
|
||||
import "@unified-latex/unified-latex-util-split";
|
||||
import "./index-NHd3tQDq.js";
|
||||
import "@unified-latex/unified-latex-util-comments";
|
||||
import "@unified-latex/unified-latex-util-visit";
|
||||
import "@unified-latex/unified-latex-util-render-info";
|
||||
import "@unified-latex/unified-latex-util-arguments";
|
||||
import { m as macros$4, e as environments$4 } from "./parser-BBXMi7mQ.js";
|
||||
import "@unified-latex/unified-latex-util-trim";
|
||||
import { m as macros$3, e as environments$3 } from "./xcolor-CIejE3rZ.js";
|
||||
import "@unified-latex/unified-latex-builder";
|
||||
import { macros as macros$2, environments as environments$2 } from "./package/xparse/index.js";
|
||||
import { macros as macros$1, environments as environments$1 } from "./package/beamer/index.js";
|
||||
import { macros, environments } from "./package/multicol/index.js";
|
||||
const macroInfo = {
|
||||
amsart: macros$g,
|
||||
cleveref: macros$f,
|
||||
exam: macros$e,
|
||||
geometry: macros$d,
|
||||
hyperref: macros$c,
|
||||
latex2e: macros$b,
|
||||
listings: macros$a,
|
||||
makeidx: macros$9,
|
||||
mathtools: macros$8,
|
||||
minted: macros$7,
|
||||
nicematrix: macros$6,
|
||||
systeme: macros$5,
|
||||
tikz: macros$4,
|
||||
xcolor: macros$3,
|
||||
xparse: macros$2,
|
||||
beamer: macros$1,
|
||||
multicol: macros
|
||||
};
|
||||
const environmentInfo = {
|
||||
amsart: environments$g,
|
||||
cleveref: environments$f,
|
||||
exam: environments$e,
|
||||
geometry: environments$d,
|
||||
hyperref: environments$c,
|
||||
latex2e: environments$b,
|
||||
listings: environments$a,
|
||||
makeidx: environments$9,
|
||||
mathtools: environments$8,
|
||||
minted: environments$7,
|
||||
nicematrix: environments$6,
|
||||
systeme: environments$5,
|
||||
tikz: environments$4,
|
||||
xcolor: environments$3,
|
||||
xparse: environments$2,
|
||||
beamer: environments$1,
|
||||
multicol: environments
|
||||
};
|
||||
export {
|
||||
environmentInfo,
|
||||
macroInfo
|
||||
};
|
||||
//# sourceMappingURL=index.js.map
|
||||
1
node_modules/@unified-latex/unified-latex-ctan/index.js.map
generated
vendored
Normal file
65
node_modules/@unified-latex/unified-latex-ctan/package.json
generated
vendored
Normal file
@ -0,0 +1,65 @@
|
||||
{
|
||||
"name": "@unified-latex/unified-latex-ctan",
|
||||
"version": "1.8.2",
|
||||
"description": "unified-latex tools relating to specific CTAN packages",
|
||||
"main": "index.js",
|
||||
"type": "module",
|
||||
"dependencies": {
|
||||
"@unified-latex/unified-latex-builder": "^1.8.0",
|
||||
"@unified-latex/unified-latex-types": "^1.8.0",
|
||||
"@unified-latex/unified-latex-util-argspec": "^1.8.2",
|
||||
"@unified-latex/unified-latex-util-arguments": "^1.8.2",
|
||||
"@unified-latex/unified-latex-util-comments": "^1.8.2",
|
||||
"@unified-latex/unified-latex-util-match": "^1.8.0",
|
||||
"@unified-latex/unified-latex-util-pegjs": "^1.8.1",
|
||||
"@unified-latex/unified-latex-util-print-raw": "^1.8.0",
|
||||
"@unified-latex/unified-latex-util-render-info": "^1.8.2",
|
||||
"@unified-latex/unified-latex-util-replace": "^1.8.2",
|
||||
"@unified-latex/unified-latex-util-scan": "^1.8.0",
|
||||
"@unified-latex/unified-latex-util-split": "^1.8.0",
|
||||
"@unified-latex/unified-latex-util-trim": "^1.8.2",
|
||||
"@unified-latex/unified-latex-util-visit": "^1.8.2",
|
||||
"color": "^4.2.3"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/siefkenj/unified-latex.git"
|
||||
},
|
||||
"keywords": [
|
||||
"pegjs",
|
||||
"latex",
|
||||
"parser",
|
||||
"prettier",
|
||||
"unified-latex",
|
||||
"unified"
|
||||
],
|
||||
"author": "Jason Siefken",
|
||||
"license": "MIT",
|
||||
"bugs": {
|
||||
"url": "https://github.com/siefkenj/unified-latex/issues"
|
||||
},
|
||||
"homepage": "https://github.com/siefkenj/unified-latex#readme",
|
||||
"exports": {
|
||||
".": {
|
||||
"import": "./index.js",
|
||||
"require": "./index.cjs",
|
||||
"types": "./index.d.ts"
|
||||
},
|
||||
"./*js": "./*js",
|
||||
"./*": {
|
||||
"import": "./*/index.js",
|
||||
"require": "./*/index.cjs",
|
||||
"types": "./*/index.d.ts"
|
||||
},
|
||||
"./*/index": {
|
||||
"import": "./*/index.js",
|
||||
"require": "./*/index.cjs"
|
||||
}
|
||||
},
|
||||
"files": [
|
||||
"**/*ts",
|
||||
"**/*js",
|
||||
"**/*.map",
|
||||
"**/*.json"
|
||||
]
|
||||
}
|
||||
32
node_modules/@unified-latex/unified-latex-ctan/package/amsart/index.cjs
generated
vendored
Normal file
@ -0,0 +1,32 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
||||
const macros = {
|
||||
author: {
|
||||
signature: "o m",
|
||||
renderInfo: { breakAround: true, inParMode: true }
|
||||
},
|
||||
address: {
|
||||
signature: "o m",
|
||||
renderInfo: { breakAround: true, inParMode: true }
|
||||
},
|
||||
curraddr: {
|
||||
signature: "o m",
|
||||
renderInfo: { breakAround: true, inParMode: true }
|
||||
},
|
||||
email: {
|
||||
signature: "o m",
|
||||
renderInfo: { breakAround: true, inParMode: true }
|
||||
},
|
||||
title: {
|
||||
signature: "o m",
|
||||
renderInfo: { breakAround: true, inParMode: true }
|
||||
},
|
||||
urladdr: {
|
||||
signature: "o m",
|
||||
renderInfo: { breakAround: true, inParMode: true }
|
||||
}
|
||||
};
|
||||
const environments = {};
|
||||
exports.environments = environments;
|
||||
exports.macros = macros;
|
||||
//# sourceMappingURL=index.cjs.map
|
||||
1
node_modules/@unified-latex/unified-latex-ctan/package/amsart/index.cjs.map
generated
vendored
Normal file
@ -0,0 +1 @@
|
||||
{"version":3,"file":"index.cjs","sources":["../../../package/amsart/provides.ts"],"sourcesContent":["import {\n MacroInfoRecord,\n EnvInfoRecord,\n} from \"@unified-latex/unified-latex-types\";\n\nexport const macros: MacroInfoRecord = {\n author: {\n signature: \"o m\",\n renderInfo: { breakAround: true, inParMode: true },\n },\n address: {\n signature: \"o m\",\n renderInfo: { breakAround: true, inParMode: true },\n },\n curraddr: {\n signature: \"o m\",\n renderInfo: { breakAround: true, inParMode: true },\n },\n email: {\n signature: \"o m\",\n renderInfo: { breakAround: true, inParMode: true },\n },\n title: {\n signature: \"o m\",\n renderInfo: { breakAround: true, inParMode: true },\n },\n urladdr: {\n signature: \"o m\",\n renderInfo: { breakAround: true, inParMode: true },\n }\n}\n\nexport const environments: EnvInfoRecord = {};\n"],"names":[],"mappings":";;AAKO,MAAM,SAA0B;AAAA,EACnC,QAAQ;AAAA,IACJ,WAAW;AAAA,IACX,YAAY,EAAE,aAAa,MAAM,WAAW,KAAK;AAAA,EACrD;AAAA,EACA,SAAS;AAAA,IACL,WAAW;AAAA,IACX,YAAY,EAAE,aAAa,MAAM,WAAW,KAAK;AAAA,EACrD;AAAA,EACA,UAAU;AAAA,IACN,WAAW;AAAA,IACX,YAAY,EAAE,aAAa,MAAM,WAAW,KAAK;AAAA,EACrD;AAAA,EACA,OAAO;AAAA,IACH,WAAW;AAAA,IACX,YAAY,EAAE,aAAa,MAAM,WAAW,KAAK;AAAA,EACrD;AAAA,EACA,OAAO;AAAA,IACH,WAAW;AAAA,IACX,YAAY,EAAE,aAAa,MAAM,WAAW,KAAK;AAAA,EACrD;AAAA,EACA,SAAS;AAAA,IACL,WAAW;AAAA,IACX,YAAY,EAAE,aAAa,MAAM,WAAW,KAAK;AAAA,EAAA;AAEzD;AAEO,MAAM,eAA8B,CAAA;;;"}
|
||||
2
node_modules/@unified-latex/unified-latex-ctan/package/amsart/index.d.ts
generated
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
export * from './provides';
|
||||
//# sourceMappingURL=index.d.ts.map
|
||||
32
node_modules/@unified-latex/unified-latex-ctan/package/amsart/index.js
generated
vendored
Normal file
@ -0,0 +1,32 @@
|
||||
const macros = {
|
||||
author: {
|
||||
signature: "o m",
|
||||
renderInfo: { breakAround: true, inParMode: true }
|
||||
},
|
||||
address: {
|
||||
signature: "o m",
|
||||
renderInfo: { breakAround: true, inParMode: true }
|
||||
},
|
||||
curraddr: {
|
||||
signature: "o m",
|
||||
renderInfo: { breakAround: true, inParMode: true }
|
||||
},
|
||||
email: {
|
||||
signature: "o m",
|
||||
renderInfo: { breakAround: true, inParMode: true }
|
||||
},
|
||||
title: {
|
||||
signature: "o m",
|
||||
renderInfo: { breakAround: true, inParMode: true }
|
||||
},
|
||||
urladdr: {
|
||||
signature: "o m",
|
||||
renderInfo: { breakAround: true, inParMode: true }
|
||||
}
|
||||
};
|
||||
const environments = {};
|
||||
export {
|
||||
environments,
|
||||
macros
|
||||
};
|
||||
//# sourceMappingURL=index.js.map
|
||||
1
node_modules/@unified-latex/unified-latex-ctan/package/amsart/index.js.map
generated
vendored
Normal file
@ -0,0 +1 @@
|
||||
{"version":3,"file":"index.js","sources":["../../../package/amsart/provides.ts"],"sourcesContent":["import {\n MacroInfoRecord,\n EnvInfoRecord,\n} from \"@unified-latex/unified-latex-types\";\n\nexport const macros: MacroInfoRecord = {\n author: {\n signature: \"o m\",\n renderInfo: { breakAround: true, inParMode: true },\n },\n address: {\n signature: \"o m\",\n renderInfo: { breakAround: true, inParMode: true },\n },\n curraddr: {\n signature: \"o m\",\n renderInfo: { breakAround: true, inParMode: true },\n },\n email: {\n signature: \"o m\",\n renderInfo: { breakAround: true, inParMode: true },\n },\n title: {\n signature: \"o m\",\n renderInfo: { breakAround: true, inParMode: true },\n },\n urladdr: {\n signature: \"o m\",\n renderInfo: { breakAround: true, inParMode: true },\n }\n}\n\nexport const environments: EnvInfoRecord = {};\n"],"names":[],"mappings":"AAKO,MAAM,SAA0B;AAAA,EACnC,QAAQ;AAAA,IACJ,WAAW;AAAA,IACX,YAAY,EAAE,aAAa,MAAM,WAAW,KAAK;AAAA,EACrD;AAAA,EACA,SAAS;AAAA,IACL,WAAW;AAAA,IACX,YAAY,EAAE,aAAa,MAAM,WAAW,KAAK;AAAA,EACrD;AAAA,EACA,UAAU;AAAA,IACN,WAAW;AAAA,IACX,YAAY,EAAE,aAAa,MAAM,WAAW,KAAK;AAAA,EACrD;AAAA,EACA,OAAO;AAAA,IACH,WAAW;AAAA,IACX,YAAY,EAAE,aAAa,MAAM,WAAW,KAAK;AAAA,EACrD;AAAA,EACA,OAAO;AAAA,IACH,WAAW;AAAA,IACX,YAAY,EAAE,aAAa,MAAM,WAAW,KAAK;AAAA,EACrD;AAAA,EACA,SAAS;AAAA,IACL,WAAW;AAAA,IACX,YAAY,EAAE,aAAa,MAAM,WAAW,KAAK;AAAA,EAAA;AAEzD;AAEO,MAAM,eAA8B,CAAA;"}
|
||||
4
node_modules/@unified-latex/unified-latex-ctan/package/amsart/provides.d.ts
generated
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
import { MacroInfoRecord, EnvInfoRecord } from '@unified-latex/unified-latex-types';
|
||||
export declare const macros: MacroInfoRecord;
|
||||
export declare const environments: EnvInfoRecord;
|
||||
//# sourceMappingURL=provides.d.ts.map
|
||||
204
node_modules/@unified-latex/unified-latex-ctan/package/beamer/index.cjs
generated
vendored
Normal file
@ -0,0 +1,204 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
||||
const macros = {
|
||||
mode: { signature: "s d<> d{}", renderInfo: { breakAround: true } },
|
||||
insertnavigation: { signature: "m", renderInfo: { breakAround: true } },
|
||||
insertsectionnavigation: {
|
||||
signature: "m",
|
||||
renderInfo: { breakAround: true }
|
||||
},
|
||||
insertsectionnavigationhorizontal: {
|
||||
signature: "m m m",
|
||||
renderInfo: { breakAround: true }
|
||||
},
|
||||
insertauthor: { signature: "o", renderInfo: { breakAround: true } },
|
||||
insertshortauthor: { signature: "o", renderInfo: { breakAround: true } },
|
||||
insertshortdate: { signature: "o", renderInfo: { breakAround: true } },
|
||||
insertshortinstitute: { signature: "o", renderInfo: { breakAround: true } },
|
||||
insertshortpart: { signature: "o", renderInfo: { breakAround: true } },
|
||||
insertshorttitle: { signature: "o", renderInfo: { breakAround: true } },
|
||||
insertsubsectionnavigation: {
|
||||
signature: "m",
|
||||
renderInfo: { breakAround: true }
|
||||
},
|
||||
insertsubsectionnavigationhorizontal: {
|
||||
signature: "m m m",
|
||||
renderInfo: { breakAround: true }
|
||||
},
|
||||
insertverticalnavigation: {
|
||||
signature: "m",
|
||||
renderInfo: { breakAround: true }
|
||||
},
|
||||
usebeamercolor: { signature: "s m", renderInfo: { breakAround: true } },
|
||||
usebeamertemplate: { signature: "s m", renderInfo: { breakAround: true } },
|
||||
setbeamercolor: {
|
||||
signature: "m m",
|
||||
renderInfo: { breakAround: true, pgfkeysArgs: true }
|
||||
},
|
||||
setbeamersize: {
|
||||
signature: "m o o",
|
||||
renderInfo: { breakAround: true, pgfkeysArgs: true }
|
||||
},
|
||||
setbeamertemplate: {
|
||||
signature: "m o o d{}",
|
||||
renderInfo: { breakAround: true, pgfkeysArgs: true }
|
||||
},
|
||||
newcommand: {
|
||||
signature: "s d<> +m o +o +m",
|
||||
renderInfo: {
|
||||
breakAround: true,
|
||||
namedArguments: [
|
||||
"starred",
|
||||
null,
|
||||
"name",
|
||||
"numArgs",
|
||||
"default",
|
||||
"body"
|
||||
]
|
||||
}
|
||||
},
|
||||
renewcommand: {
|
||||
signature: "s d<> +m o +o +m",
|
||||
renderInfo: {
|
||||
breakAround: true,
|
||||
namedArguments: [
|
||||
"starred",
|
||||
null,
|
||||
"name",
|
||||
"numArgs",
|
||||
"default",
|
||||
"body"
|
||||
]
|
||||
}
|
||||
},
|
||||
newenvironment: {
|
||||
signature: "s d<> m o o m m",
|
||||
renderInfo: { breakAround: true }
|
||||
},
|
||||
renewenvironment: {
|
||||
signature: "s d<> m o o m m",
|
||||
renderInfo: { breakAround: true }
|
||||
},
|
||||
resetcounteronoverlays: {
|
||||
signature: "m",
|
||||
renderInfo: { breakAround: true }
|
||||
},
|
||||
resetcountonoverlays: { signature: "m", renderInfo: { breakAround: true } },
|
||||
logo: { signature: "m", renderInfo: { breakAround: true } },
|
||||
frametitle: { signature: "d<> o m", renderInfo: { breakAround: true } },
|
||||
framesubtitle: { signature: "d<> m", renderInfo: { breakAround: true } },
|
||||
pause: { signature: "o" },
|
||||
onslide: { signature: "t+ t* d<> d{}" },
|
||||
only: { signature: "d<> m d<>" },
|
||||
uncover: { signature: "d<> m" },
|
||||
visible: { signature: "d<> m" },
|
||||
invisible: { signature: "d<> m" },
|
||||
alt: { signature: "d<> m m d<>" },
|
||||
temporal: { signature: "r<> m m m" },
|
||||
item: {
|
||||
signature: "d<> o d<>",
|
||||
renderInfo: {
|
||||
hangingIndent: true,
|
||||
namedArguments: [null, "label", null]
|
||||
}
|
||||
},
|
||||
label: { signature: "d<> o m" },
|
||||
// cleveref adds an optional argument to label; this gives maximum compatibility.
|
||||
action: { signature: "d<> m" },
|
||||
beamerdefaultoverlayspecification: { signature: "m" },
|
||||
titlegraphic: { signature: "m", renderInfo: { breakAround: true } },
|
||||
subject: { signature: "m", renderInfo: { breakAround: true } },
|
||||
keywords: { signature: "m", renderInfo: { breakAround: true } },
|
||||
lecture: { signature: "o m m", renderInfo: { breakAround: true } },
|
||||
partpage: { renderInfo: { breakAround: true } },
|
||||
sectionpage: { renderInfo: { breakAround: true } },
|
||||
subsectionpage: { renderInfo: { breakAround: true } },
|
||||
AtBeginLecture: { signature: "m", renderInfo: { breakAround: true } },
|
||||
AtBeginPart: { signature: "m", renderInfo: { breakAround: true } },
|
||||
tableofcontents: {
|
||||
signature: "o",
|
||||
renderInfo: { breakAround: true, pgfkeysArgs: true }
|
||||
},
|
||||
againframe: { signature: "d<> o o m", renderInfo: { breakAround: true } },
|
||||
framezoom: {
|
||||
signature: "r<> r<> o r() r()",
|
||||
renderInfo: { breakAround: true }
|
||||
},
|
||||
column: { signature: "d<> o m", renderInfo: { breakAround: true } },
|
||||
animate: { signature: "r<>", renderInfo: { breakAround: true } },
|
||||
animatevalue: { signature: "r<> m m m", renderInfo: { breakAround: true } },
|
||||
sound: {
|
||||
signature: "o m m",
|
||||
renderInfo: { breakAround: true, pgfkeysArgs: true }
|
||||
},
|
||||
hyperlinksound: {
|
||||
signature: "o m m",
|
||||
renderInfo: { breakAround: true, pgfkeysArgs: true }
|
||||
},
|
||||
hyperlinkmute: { signature: "m", renderInfo: { breakAround: true } },
|
||||
// These signatures conflict with the default signatures.
|
||||
// Care must be taken when processing an AST.
|
||||
section: {
|
||||
signature: "s d<> o m",
|
||||
renderInfo: {
|
||||
breakAround: true,
|
||||
namedArguments: ["starred", null, "tocTitle", "title"]
|
||||
}
|
||||
},
|
||||
subsection: {
|
||||
signature: "s d<> o m",
|
||||
renderInfo: {
|
||||
breakAround: true,
|
||||
namedArguments: ["starred", null, "tocTitle", "title"]
|
||||
}
|
||||
},
|
||||
subsubsection: {
|
||||
signature: "s d<> o m",
|
||||
renderInfo: {
|
||||
breakAround: true,
|
||||
namedArguments: ["starred", null, "tocTitle", "title"]
|
||||
}
|
||||
},
|
||||
part: {
|
||||
signature: "s d<> o m",
|
||||
renderInfo: {
|
||||
breakAround: true,
|
||||
namedArguments: ["starred", null, "tocTitle", "title"]
|
||||
}
|
||||
},
|
||||
bibitem: {
|
||||
signature: "s d<> o m",
|
||||
renderInfo: {
|
||||
hangingIndent: true,
|
||||
namedArguments: ["starred", null, "tocTitle", "title"]
|
||||
}
|
||||
}
|
||||
};
|
||||
const environments = {
|
||||
frame: {
|
||||
signature: "!d<> !o !o !d{} !d{}"
|
||||
},
|
||||
block: {
|
||||
signature: "!d<> !d{} !d<>"
|
||||
},
|
||||
alertblock: {
|
||||
signature: "!d<> !d{} !d<>"
|
||||
},
|
||||
exampleblock: {
|
||||
signature: "!d<> !d{} !d<>"
|
||||
},
|
||||
onlyenv: {
|
||||
signature: "!d<>"
|
||||
},
|
||||
altenv: {
|
||||
signature: "!d<> m m m m !d<>"
|
||||
},
|
||||
overlayarea: { signature: "m m" },
|
||||
overprint: { signature: "o" },
|
||||
actionenv: { signature: "!d<>" },
|
||||
columns: { signature: "d<> o" },
|
||||
column: { signature: "d<> o m" }
|
||||
};
|
||||
exports.environments = environments;
|
||||
exports.macros = macros;
|
||||
//# sourceMappingURL=index.cjs.map
|
||||
1
node_modules/@unified-latex/unified-latex-ctan/package/beamer/index.cjs.map
generated
vendored
Normal file
2
node_modules/@unified-latex/unified-latex-ctan/package/beamer/index.d.ts
generated
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
export * from './provides';
|
||||
//# sourceMappingURL=index.d.ts.map
|
||||
204
node_modules/@unified-latex/unified-latex-ctan/package/beamer/index.js
generated
vendored
Normal file
@ -0,0 +1,204 @@
|
||||
const macros = {
|
||||
mode: { signature: "s d<> d{}", renderInfo: { breakAround: true } },
|
||||
insertnavigation: { signature: "m", renderInfo: { breakAround: true } },
|
||||
insertsectionnavigation: {
|
||||
signature: "m",
|
||||
renderInfo: { breakAround: true }
|
||||
},
|
||||
insertsectionnavigationhorizontal: {
|
||||
signature: "m m m",
|
||||
renderInfo: { breakAround: true }
|
||||
},
|
||||
insertauthor: { signature: "o", renderInfo: { breakAround: true } },
|
||||
insertshortauthor: { signature: "o", renderInfo: { breakAround: true } },
|
||||
insertshortdate: { signature: "o", renderInfo: { breakAround: true } },
|
||||
insertshortinstitute: { signature: "o", renderInfo: { breakAround: true } },
|
||||
insertshortpart: { signature: "o", renderInfo: { breakAround: true } },
|
||||
insertshorttitle: { signature: "o", renderInfo: { breakAround: true } },
|
||||
insertsubsectionnavigation: {
|
||||
signature: "m",
|
||||
renderInfo: { breakAround: true }
|
||||
},
|
||||
insertsubsectionnavigationhorizontal: {
|
||||
signature: "m m m",
|
||||
renderInfo: { breakAround: true }
|
||||
},
|
||||
insertverticalnavigation: {
|
||||
signature: "m",
|
||||
renderInfo: { breakAround: true }
|
||||
},
|
||||
usebeamercolor: { signature: "s m", renderInfo: { breakAround: true } },
|
||||
usebeamertemplate: { signature: "s m", renderInfo: { breakAround: true } },
|
||||
setbeamercolor: {
|
||||
signature: "m m",
|
||||
renderInfo: { breakAround: true, pgfkeysArgs: true }
|
||||
},
|
||||
setbeamersize: {
|
||||
signature: "m o o",
|
||||
renderInfo: { breakAround: true, pgfkeysArgs: true }
|
||||
},
|
||||
setbeamertemplate: {
|
||||
signature: "m o o d{}",
|
||||
renderInfo: { breakAround: true, pgfkeysArgs: true }
|
||||
},
|
||||
newcommand: {
|
||||
signature: "s d<> +m o +o +m",
|
||||
renderInfo: {
|
||||
breakAround: true,
|
||||
namedArguments: [
|
||||
"starred",
|
||||
null,
|
||||
"name",
|
||||
"numArgs",
|
||||
"default",
|
||||
"body"
|
||||
]
|
||||
}
|
||||
},
|
||||
renewcommand: {
|
||||
signature: "s d<> +m o +o +m",
|
||||
renderInfo: {
|
||||
breakAround: true,
|
||||
namedArguments: [
|
||||
"starred",
|
||||
null,
|
||||
"name",
|
||||
"numArgs",
|
||||
"default",
|
||||
"body"
|
||||
]
|
||||
}
|
||||
},
|
||||
newenvironment: {
|
||||
signature: "s d<> m o o m m",
|
||||
renderInfo: { breakAround: true }
|
||||
},
|
||||
renewenvironment: {
|
||||
signature: "s d<> m o o m m",
|
||||
renderInfo: { breakAround: true }
|
||||
},
|
||||
resetcounteronoverlays: {
|
||||
signature: "m",
|
||||
renderInfo: { breakAround: true }
|
||||
},
|
||||
resetcountonoverlays: { signature: "m", renderInfo: { breakAround: true } },
|
||||
logo: { signature: "m", renderInfo: { breakAround: true } },
|
||||
frametitle: { signature: "d<> o m", renderInfo: { breakAround: true } },
|
||||
framesubtitle: { signature: "d<> m", renderInfo: { breakAround: true } },
|
||||
pause: { signature: "o" },
|
||||
onslide: { signature: "t+ t* d<> d{}" },
|
||||
only: { signature: "d<> m d<>" },
|
||||
uncover: { signature: "d<> m" },
|
||||
visible: { signature: "d<> m" },
|
||||
invisible: { signature: "d<> m" },
|
||||
alt: { signature: "d<> m m d<>" },
|
||||
temporal: { signature: "r<> m m m" },
|
||||
item: {
|
||||
signature: "d<> o d<>",
|
||||
renderInfo: {
|
||||
hangingIndent: true,
|
||||
namedArguments: [null, "label", null]
|
||||
}
|
||||
},
|
||||
label: { signature: "d<> o m" },
|
||||
// cleveref adds an optional argument to label; this gives maximum compatibility.
|
||||
action: { signature: "d<> m" },
|
||||
beamerdefaultoverlayspecification: { signature: "m" },
|
||||
titlegraphic: { signature: "m", renderInfo: { breakAround: true } },
|
||||
subject: { signature: "m", renderInfo: { breakAround: true } },
|
||||
keywords: { signature: "m", renderInfo: { breakAround: true } },
|
||||
lecture: { signature: "o m m", renderInfo: { breakAround: true } },
|
||||
partpage: { renderInfo: { breakAround: true } },
|
||||
sectionpage: { renderInfo: { breakAround: true } },
|
||||
subsectionpage: { renderInfo: { breakAround: true } },
|
||||
AtBeginLecture: { signature: "m", renderInfo: { breakAround: true } },
|
||||
AtBeginPart: { signature: "m", renderInfo: { breakAround: true } },
|
||||
tableofcontents: {
|
||||
signature: "o",
|
||||
renderInfo: { breakAround: true, pgfkeysArgs: true }
|
||||
},
|
||||
againframe: { signature: "d<> o o m", renderInfo: { breakAround: true } },
|
||||
framezoom: {
|
||||
signature: "r<> r<> o r() r()",
|
||||
renderInfo: { breakAround: true }
|
||||
},
|
||||
column: { signature: "d<> o m", renderInfo: { breakAround: true } },
|
||||
animate: { signature: "r<>", renderInfo: { breakAround: true } },
|
||||
animatevalue: { signature: "r<> m m m", renderInfo: { breakAround: true } },
|
||||
sound: {
|
||||
signature: "o m m",
|
||||
renderInfo: { breakAround: true, pgfkeysArgs: true }
|
||||
},
|
||||
hyperlinksound: {
|
||||
signature: "o m m",
|
||||
renderInfo: { breakAround: true, pgfkeysArgs: true }
|
||||
},
|
||||
hyperlinkmute: { signature: "m", renderInfo: { breakAround: true } },
|
||||
// These signatures conflict with the default signatures.
|
||||
// Care must be taken when processing an AST.
|
||||
section: {
|
||||
signature: "s d<> o m",
|
||||
renderInfo: {
|
||||
breakAround: true,
|
||||
namedArguments: ["starred", null, "tocTitle", "title"]
|
||||
}
|
||||
},
|
||||
subsection: {
|
||||
signature: "s d<> o m",
|
||||
renderInfo: {
|
||||
breakAround: true,
|
||||
namedArguments: ["starred", null, "tocTitle", "title"]
|
||||
}
|
||||
},
|
||||
subsubsection: {
|
||||
signature: "s d<> o m",
|
||||
renderInfo: {
|
||||
breakAround: true,
|
||||
namedArguments: ["starred", null, "tocTitle", "title"]
|
||||
}
|
||||
},
|
||||
part: {
|
||||
signature: "s d<> o m",
|
||||
renderInfo: {
|
||||
breakAround: true,
|
||||
namedArguments: ["starred", null, "tocTitle", "title"]
|
||||
}
|
||||
},
|
||||
bibitem: {
|
||||
signature: "s d<> o m",
|
||||
renderInfo: {
|
||||
hangingIndent: true,
|
||||
namedArguments: ["starred", null, "tocTitle", "title"]
|
||||
}
|
||||
}
|
||||
};
|
||||
const environments = {
|
||||
frame: {
|
||||
signature: "!d<> !o !o !d{} !d{}"
|
||||
},
|
||||
block: {
|
||||
signature: "!d<> !d{} !d<>"
|
||||
},
|
||||
alertblock: {
|
||||
signature: "!d<> !d{} !d<>"
|
||||
},
|
||||
exampleblock: {
|
||||
signature: "!d<> !d{} !d<>"
|
||||
},
|
||||
onlyenv: {
|
||||
signature: "!d<>"
|
||||
},
|
||||
altenv: {
|
||||
signature: "!d<> m m m m !d<>"
|
||||
},
|
||||
overlayarea: { signature: "m m" },
|
||||
overprint: { signature: "o" },
|
||||
actionenv: { signature: "!d<>" },
|
||||
columns: { signature: "d<> o" },
|
||||
column: { signature: "d<> o m" }
|
||||
};
|
||||
export {
|
||||
environments,
|
||||
macros
|
||||
};
|
||||
//# sourceMappingURL=index.js.map
|
||||
1
node_modules/@unified-latex/unified-latex-ctan/package/beamer/index.js.map
generated
vendored
Normal file
4
node_modules/@unified-latex/unified-latex-ctan/package/beamer/provides.d.ts
generated
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
import { MacroInfoRecord, EnvInfoRecord } from '@unified-latex/unified-latex-types';
|
||||
export declare const macros: MacroInfoRecord;
|
||||
export declare const environments: EnvInfoRecord;
|
||||
//# sourceMappingURL=provides.d.ts.map
|
||||
30
node_modules/@unified-latex/unified-latex-ctan/package/cleveref/index.cjs
generated
vendored
Normal file
@ -0,0 +1,30 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
||||
const macros = {
|
||||
cref: { signature: "s m" },
|
||||
Cref: { signature: "s m" },
|
||||
crefrange: { signature: "s m m" },
|
||||
Crefrange: { signature: "s m m" },
|
||||
cpageref: { signature: "s m" },
|
||||
Cpageref: { signature: "s m" },
|
||||
ref: { signature: "m" },
|
||||
pageref: { signature: "m" },
|
||||
namecref: { signature: "m" },
|
||||
nameCref: { signature: "m" },
|
||||
lcnamecref: { signature: "m" },
|
||||
namecrefs: { signature: "m" },
|
||||
nameCrefs: { signature: "m" },
|
||||
lcnamecrefs: { signature: "m" },
|
||||
labelcref: { signature: "m" },
|
||||
labelcpageref: { signature: "m" },
|
||||
crefalias: { signature: "m m" },
|
||||
crefname: { signature: "m m m" },
|
||||
// XXX there are many more obscure commands to add here
|
||||
// https://ctan.org/pkg/cleveref
|
||||
crefdefaultlabelformat: { signature: "m" },
|
||||
crefrangeconjunction: { signature: "m" }
|
||||
};
|
||||
const environments = {};
|
||||
exports.environments = environments;
|
||||
exports.macros = macros;
|
||||
//# sourceMappingURL=index.cjs.map
|
||||
1
node_modules/@unified-latex/unified-latex-ctan/package/cleveref/index.cjs.map
generated
vendored
Normal file
@ -0,0 +1 @@
|
||||
{"version":3,"file":"index.cjs","sources":["../../../package/cleveref/provides.ts"],"sourcesContent":["import {\n MacroInfoRecord,\n EnvInfoRecord,\n} from \"@unified-latex/unified-latex-types\";\n\nexport const macros: MacroInfoRecord = {\n cref: { signature: \"s m\" },\n Cref: { signature: \"s m\" },\n crefrange: { signature: \"s m m\" },\n Crefrange: { signature: \"s m m\" },\n cpageref: { signature: \"s m\" },\n Cpageref: { signature: \"s m\" },\n ref: { signature: \"m\" },\n pageref: { signature: \"m\" },\n namecref: { signature: \"m\" },\n nameCref: { signature: \"m\" },\n lcnamecref: { signature: \"m\" },\n namecrefs: { signature: \"m\" },\n nameCrefs: { signature: \"m\" },\n lcnamecrefs: { signature: \"m\" },\n labelcref: { signature: \"m\" },\n labelcpageref: { signature: \"m\" },\n crefalias: { signature: \"m m\" },\n crefname: { signature: \"m m m\" },\n // XXX there are many more obscure commands to add here\n // https://ctan.org/pkg/cleveref\n crefdefaultlabelformat: { signature: \"m\" },\n crefrangeconjunction: { signature: \"m\" },\n};\n\nexport const environments: EnvInfoRecord = {};\n"],"names":[],"mappings":";;AAKO,MAAM,SAA0B;AAAA,EACnC,MAAM,EAAE,WAAW,MAAM;AAAA,EACzB,MAAM,EAAE,WAAW,MAAM;AAAA,EACzB,WAAW,EAAE,WAAW,QAAQ;AAAA,EAChC,WAAW,EAAE,WAAW,QAAQ;AAAA,EAChC,UAAU,EAAE,WAAW,MAAM;AAAA,EAC7B,UAAU,EAAE,WAAW,MAAM;AAAA,EAC7B,KAAK,EAAE,WAAW,IAAI;AAAA,EACtB,SAAS,EAAE,WAAW,IAAI;AAAA,EAC1B,UAAU,EAAE,WAAW,IAAI;AAAA,EAC3B,UAAU,EAAE,WAAW,IAAI;AAAA,EAC3B,YAAY,EAAE,WAAW,IAAI;AAAA,EAC7B,WAAW,EAAE,WAAW,IAAI;AAAA,EAC5B,WAAW,EAAE,WAAW,IAAI;AAAA,EAC5B,aAAa,EAAE,WAAW,IAAI;AAAA,EAC9B,WAAW,EAAE,WAAW,IAAI;AAAA,EAC5B,eAAe,EAAE,WAAW,IAAI;AAAA,EAChC,WAAW,EAAE,WAAW,MAAM;AAAA,EAC9B,UAAU,EAAE,WAAW,QAAQ;AAAA;AAAA;AAAA,EAG/B,wBAAwB,EAAE,WAAW,IAAI;AAAA,EACzC,sBAAsB,EAAE,WAAW,IAAI;AAC3C;AAEO,MAAM,eAA8B,CAAA;;;"}
|
||||
2
node_modules/@unified-latex/unified-latex-ctan/package/cleveref/index.d.ts
generated
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
export * from './provides';
|
||||
//# sourceMappingURL=index.d.ts.map
|
||||
30
node_modules/@unified-latex/unified-latex-ctan/package/cleveref/index.js
generated
vendored
Normal file
@ -0,0 +1,30 @@
|
||||
const macros = {
|
||||
cref: { signature: "s m" },
|
||||
Cref: { signature: "s m" },
|
||||
crefrange: { signature: "s m m" },
|
||||
Crefrange: { signature: "s m m" },
|
||||
cpageref: { signature: "s m" },
|
||||
Cpageref: { signature: "s m" },
|
||||
ref: { signature: "m" },
|
||||
pageref: { signature: "m" },
|
||||
namecref: { signature: "m" },
|
||||
nameCref: { signature: "m" },
|
||||
lcnamecref: { signature: "m" },
|
||||
namecrefs: { signature: "m" },
|
||||
nameCrefs: { signature: "m" },
|
||||
lcnamecrefs: { signature: "m" },
|
||||
labelcref: { signature: "m" },
|
||||
labelcpageref: { signature: "m" },
|
||||
crefalias: { signature: "m m" },
|
||||
crefname: { signature: "m m m" },
|
||||
// XXX there are many more obscure commands to add here
|
||||
// https://ctan.org/pkg/cleveref
|
||||
crefdefaultlabelformat: { signature: "m" },
|
||||
crefrangeconjunction: { signature: "m" }
|
||||
};
|
||||
const environments = {};
|
||||
export {
|
||||
environments,
|
||||
macros
|
||||
};
|
||||
//# sourceMappingURL=index.js.map
|
||||
1
node_modules/@unified-latex/unified-latex-ctan/package/cleveref/index.js.map
generated
vendored
Normal file
@ -0,0 +1 @@
|
||||
{"version":3,"file":"index.js","sources":["../../../package/cleveref/provides.ts"],"sourcesContent":["import {\n MacroInfoRecord,\n EnvInfoRecord,\n} from \"@unified-latex/unified-latex-types\";\n\nexport const macros: MacroInfoRecord = {\n cref: { signature: \"s m\" },\n Cref: { signature: \"s m\" },\n crefrange: { signature: \"s m m\" },\n Crefrange: { signature: \"s m m\" },\n cpageref: { signature: \"s m\" },\n Cpageref: { signature: \"s m\" },\n ref: { signature: \"m\" },\n pageref: { signature: \"m\" },\n namecref: { signature: \"m\" },\n nameCref: { signature: \"m\" },\n lcnamecref: { signature: \"m\" },\n namecrefs: { signature: \"m\" },\n nameCrefs: { signature: \"m\" },\n lcnamecrefs: { signature: \"m\" },\n labelcref: { signature: \"m\" },\n labelcpageref: { signature: \"m\" },\n crefalias: { signature: \"m m\" },\n crefname: { signature: \"m m m\" },\n // XXX there are many more obscure commands to add here\n // https://ctan.org/pkg/cleveref\n crefdefaultlabelformat: { signature: \"m\" },\n crefrangeconjunction: { signature: \"m\" },\n};\n\nexport const environments: EnvInfoRecord = {};\n"],"names":[],"mappings":"AAKO,MAAM,SAA0B;AAAA,EACnC,MAAM,EAAE,WAAW,MAAM;AAAA,EACzB,MAAM,EAAE,WAAW,MAAM;AAAA,EACzB,WAAW,EAAE,WAAW,QAAQ;AAAA,EAChC,WAAW,EAAE,WAAW,QAAQ;AAAA,EAChC,UAAU,EAAE,WAAW,MAAM;AAAA,EAC7B,UAAU,EAAE,WAAW,MAAM;AAAA,EAC7B,KAAK,EAAE,WAAW,IAAI;AAAA,EACtB,SAAS,EAAE,WAAW,IAAI;AAAA,EAC1B,UAAU,EAAE,WAAW,IAAI;AAAA,EAC3B,UAAU,EAAE,WAAW,IAAI;AAAA,EAC3B,YAAY,EAAE,WAAW,IAAI;AAAA,EAC7B,WAAW,EAAE,WAAW,IAAI;AAAA,EAC5B,WAAW,EAAE,WAAW,IAAI;AAAA,EAC5B,aAAa,EAAE,WAAW,IAAI;AAAA,EAC9B,WAAW,EAAE,WAAW,IAAI;AAAA,EAC5B,eAAe,EAAE,WAAW,IAAI;AAAA,EAChC,WAAW,EAAE,WAAW,MAAM;AAAA,EAC9B,UAAU,EAAE,WAAW,QAAQ;AAAA;AAAA;AAAA,EAG/B,wBAAwB,EAAE,WAAW,IAAI;AAAA,EACzC,sBAAsB,EAAE,WAAW,IAAI;AAC3C;AAEO,MAAM,eAA8B,CAAA;"}
|
||||
4
node_modules/@unified-latex/unified-latex-ctan/package/cleveref/provides.d.ts
generated
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
import { MacroInfoRecord, EnvInfoRecord } from '@unified-latex/unified-latex-types';
|
||||
export declare const macros: MacroInfoRecord;
|
||||
export declare const environments: EnvInfoRecord;
|
||||
//# sourceMappingURL=provides.d.ts.map
|
||||
6
node_modules/@unified-latex/unified-latex-ctan/package/exam/index.cjs
generated
vendored
Normal file
@ -0,0 +1,6 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
||||
const provides = require("../../provides-gOjhEUvC.cjs");
|
||||
exports.environments = provides.environments;
|
||||
exports.macros = provides.macros;
|
||||
//# sourceMappingURL=index.cjs.map
|
||||
1
node_modules/@unified-latex/unified-latex-ctan/package/exam/index.cjs.map
generated
vendored
Normal file
@ -0,0 +1 @@
|
||||
{"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;"}
|
||||
2
node_modules/@unified-latex/unified-latex-ctan/package/exam/index.d.ts
generated
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
export * from './provides';
|
||||
//# sourceMappingURL=index.d.ts.map
|
||||
6
node_modules/@unified-latex/unified-latex-ctan/package/exam/index.js
generated
vendored
Normal file
@ -0,0 +1,6 @@
|
||||
import { e, m } from "../../provides-B-HiB8uu.js";
|
||||
export {
|
||||
e as environments,
|
||||
m as macros
|
||||
};
|
||||
//# sourceMappingURL=index.js.map
|
||||
1
node_modules/@unified-latex/unified-latex-ctan/package/exam/index.js.map
generated
vendored
Normal file
@ -0,0 +1 @@
|
||||
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
||||