Compare commits

..

15 Commits

48 changed files with 6824 additions and 2 deletions

2
.gitignore vendored
View File

@@ -1 +1,3 @@
.vscode .vscode
bibliography.bib.bak
bibliography.bib.sav

View File

@@ -1,6 +1,6 @@
#set text(font: "Source Sans 3") #set text(font: "Source Sans 3")
= General Planning = Initial Planning
#table( #table(
columns: (auto, 1fr), columns: (auto, 1fr),
@@ -16,3 +16,20 @@
[*8*], [*8*],
[*9*], [*9*],
) )
= History
#table(
columns: (auto, 1fr),
align: (center, left + horizon),
table.header[*Week*][*Objectives*],
[*1*], [Kickoff, setup project, start prototyping a syntax],
[*2*], [Syntax prototype, simple parser],
[*3*], [Basic type checker (assignments, functions, operations)],
[*4*], [Diagnostics, type check control flow, refine architecture, subtyping],
[*5*], [Generic types, methods and overloads, simple code generator],
[*6*], [For loops, generate assertions, generate stubs, constraints, variance, type unification],
[*7*], [],
[*8*], [],
[*9*], [],
)

View File

@@ -29,3 +29,12 @@
#day(5) #day(5)
- Type check predicate body - Type check predicate body
#day(6)
- Add variance to type variables (infer, use in subtype check, integrate in generated stubs)
- Unify / match types in generic function calls
#day(7)
- Unify / match types in generic function calls

34
journal/week7.typ Normal file
View File

@@ -0,0 +1,34 @@
#import "template.typ": week, day
#show: week.with(num: 7)
#day(1)
- better handle type variables
- write simple demo script
- various fixes
#day(2)
- weekly meeting
- start implementing data-frame and column types
#day(3)
- statically check cast expressions on literal values
- add unsafe cast
- setup user manual
- setup report
#day(4)
- work on data-frame and column types (method resolution, subtyping)
#day(5)
- work on data-frame and column types (asserts, dunders)
- start writing user manual (quick start)
#day(7)
- work on user manual (Midas reference, supported Python syntax)

49
journal/week8.typ Normal file
View File

@@ -0,0 +1,49 @@
#import "template.typ": week, day
#show: week.with(num: 8)
#day(1)
- improvements and bugfixes
- unknown frame methods
- assertion on column values
- allow unknowns in more places
- parse empty calls
- tuple type instantiation
- `str` methods
- multi-parameter generic
- tuple expression
#day(2)
- weekly meeting
- generate stubs when compiling
- work on frames and columns (brainstorm / setup methods)
- start working on call dispatcher
#day(3)
- finish call dispatcher
- add type aliases
- work on frame and columns method registry
#day(4)
- implement group-by on frames and columns
- implement some methods on frames and columns
#day(5)
- implement arithmetic, comparison and aggregation methods, `head`/`tail` and some attributes on frames and columns
- refactor printers
- rename `Function.Argument` -> `Function.Parameter`
- update manual for frames and columns
- add some docstrings
#day(6)
- add more docstrings
#day(7)
- add more docstrings

43
journal/week9.typ Normal file
View File

@@ -0,0 +1,43 @@
#import "template.typ": week, day
#show: week.with(num: 9)
#day(1)
- add more docstrings
- handle column subscript
- handle `not` operator
- properly type check parameter default values
- handle import statements
- handle column type instantiation
#day(2)
- parse int literals as integers
- implement scalar ops on frames and columns
- add more docstrings
- fix some bugs, make some small improvements
- complete weather pipeline example with frame operations
- implement formulae to compute aggregation method return types
#day(3)
- weekly meeting
- update syntax definitions
- check variable assignment when referenced
- add CI to run tests
- remove complex type
- complete user manual, including CLI subcommands
- add variance manager
- minor improvements
#day(4)
- check, document and fix function subtyping logic
- add some tests
- cleanup repository
#day(5)
- remove some raised errors to use diagnostics
- code repository submission

24
meta.typ Normal file
View File

@@ -0,0 +1,24 @@
#let title = "Midas"
#let subtitle = none
#let authors = "Louis Heredero"
#let thesis-supervisor = "Prof. Dr Dimi Racordon"
#let thesis-co-supervisor = none
#let thesis-expert = "Dr Sébastien Doeraene"
#let thesis-id = "ISC-ID-26-8"
#let project-repos = "https://git.kb28.ch/HEL/midas"
#let school = "Haute École d'Ingénierie de Sion"
#let programme = "Informatique et systèmes de communication (ISC)"
#let keywords = ("engineering", "type systems", "gradual typing")
#let major = "Data engineering"
#let date = datetime(year: 2026, month: 7, day: 10) // Date of the thesis & the declaration (or datetime.today())
#let permanent-email = "louis@heredero.org"
#let video-url = none
#let picture-web-opt-out = false // set to true to keep your picture off the web
#let email-web-opt-out = false // set to true to keep your email off the web
#let academic-year = "2025-2026"

211
midas.sublime-syntax Normal file
View File

@@ -0,0 +1,211 @@
%YAML 1.2
---
name: Midas
file_extensions:
- midas
scope: source.midas
variables:
identifier: "[a-zA-Z_][a-zA-Z0-9_]*"
contexts:
prototype:
- include: comments
main:
- include: keywords
- include: types
comments:
- match: "//"
scope: punctuation.definition.comment.midas
push:
- meta_scope: comment.line.midas
- match: $
pop: true
- match: /\*
scope: punctuation.definition.comment.midas
push:
- meta_scope: comment.block.midas
- match: \*/
pop: true
string:
- meta_include_prototype: false
- meta_scope: string.quoted.double.c
- match: '"'
pop: true
keywords:
- match: \balias\b
scope: keyword.declaration.midas
push: alias-stmt
- match: \btype\b
scope: keyword.declaration.midas
push: type-stmt
- match: \bextend\b
scope: keyword.declaration.midas
push: extend-stmt
- match: \bpredicate\b
scope: keyword.declaration.midas
push: predicate-stmt
alias-stmt:
- match: "{{identifier}}"
scope: entity.name.type
- match: "="
scope: keyword.operator.equal.midas
push: type-expr
- match: $
pop: true
type-stmt:
- match: "{{identifier}}"
scope: entity.name.type
- match: \[
push: type-params
- match: "="
scope: keyword.operator.equal.midas
push: type-expr
- match: $
pop: true
type-expr:
- match: \b(fn)\s*(\()
captures:
1: keyword.other.midas
2: punctuation.section.group.begin
push: fn-params
- match: \b(where)\b
scope: keyword.other.midas
set: constraint
- match: "Frame"
scope: entity.name.type
push:
- match: \[
push: frame-schema
- match: $
pop: true
- match: "{{identifier}}"
scope: entity.name.type
- match: $
pop: 2
fn-params:
- match: "({{identifier}})(:)"
captures:
1: variable.parameter.midas
2: punctuation.separator.annotation.midas
push:
- include: type-expr
- match: \?
scope: keyword.operator.qmark.midas
- match: "(?=,)"
scope: punctuation.separator.midas
pop: true
- match: '(?=\))'
pop: true
- include: type-expr
- match: '\)'
set:
- match: "->"
scope: keyword.operator.arrow.midas
set: type-expr
constraint:
- match: $
pop: 2
- match: \d+(\.\d+)?
scope: constant.numeric.midas
- match: \b(true|false|none)\b
scope: constant.language.midas
- match: '"'
push: string
- match: (<=|>=|<|>|==|!=|&)
scope: keyword.operator
- match: _
scope: variable.language.midas
- match: '{{identifier}}(?=\s*\()'
scope: variable.function.midas
- match: "{{identifier}}"
scope: variable.other.readwrite.midas
type-params:
- match: "<:"
scope: keyword.operator.subtype.midas
- match: "[a-zA-Z][a-zA-Z_0-9]*"
scope: entity.name.type
- match: "]"
pop: true
extend-stmt:
- match: "{{identifier}}"
scope: entity.name.type
- match: \[
push: type-params
- match: \{
scope: punctuation.section.block.begin
set: extend-body
extend-body:
- include: member-stmt
- match: \}
scope: punctuation.section.block.end
pop: true
member-stmt:
- match: \b(prop|def)\b
scope: keyword.other.midas
push:
- match: "{{identifier}}"
scope: variable.other.member
- match: ":"
push: type-expr
- match: $
pop: true
predicate-stmt:
- match: "{{identifier}}"
scope: entity.name.function.midas
- match: '\('
push: predicate-params
- match: "="
scope: keyword.operator.equal.midas
set: constraint
- match: $
pop: true
predicate-params:
- match: "({{identifier}})(:)"
captures:
1: variable.parameter.midas
2: punctuation.separator.annotation.midas
push:
- include: type-expr
- match: "(?=,)"
scope: punctuation.separator.midas
pop: true
- match: '(?=\))'
pop: true
- match: '\)'
pop: true
frame-schema:
- include: frame-column
- match: \]
# scope: punctuation.section.block.end
pop: true
frame-column:
- match: "{{identifier}}"
scope: variable.other.member
- match: ":"
push: type-expr

8
report/acronyms.typ Normal file
View File

@@ -0,0 +1,8 @@
#import "@preview/acrostiche:0.7.0": *
#let acronyms = (
"TaPL": ([Types and Progamming Languages@tapl],),
"LSP": (link("https://en.wikipedia.org/wiki/Liskov_substitution_principle")[Liskov substitution principle],),
)
#init-acronyms(acronyms)

View File

@@ -0,0 +1,88 @@
#import "@preview/curryst:0.6.0": prooftree, rule, rule-set
#import "@preview/gentle-clues:1.3.1" as gc
#import "@preview/lovelace:0.3.1": pseudocode-list
#let req = math.op("req")
This document formalizes the logic used when checking whether a function is a subtype of another.
= Definitions
A *Parameter specification* has a list of positional-only parameters $P$, mixed parameters $M$ and keyword-only parameters $K$:
$ S = (P, M, K) $
A *Parameter* has an index $i$, a name $n$ and a required flag $r$:
$ p = (i, n, r) $
A *Function* has a param spec $S$ and a return type $R$:
$ F = (S, R) $
= Main rules
We want to define a rule for checking structural subtyping of functions, i.e. to check when $F_1 <: F_2$
There are two conditions to check:
#align(center, prooftree(
rule(
$Gamma tack S_2 <: S_1$,
$Gamma tack R_1 <: R_2$,
$Gamma tack F_1 <: F_2$,
),
))
The second condition is trivial to check.
The first condition is a bit more tricky.
For a parameter specification $S_2$ to be a subtype of another $S_1$, the latter needs to be fully compatible with any usages of the former. What this means is that #link(<cond-1>)[(1)] any argument that can be passed to $S_2$ must be accepted by $S_1$, and #link(<cond-2>)[(2)] $S_1$ must not have additional required arguments that are not in $S_2$. However, $S_1$ can have additional optional parameters not present in $S_2$.
After mapping parameters of $S_1$ and $S_2$, types must be checked such that if a parameter $p_i: T in S_1$ is mapped to a parameter $q_j: U in S_2$, $U <: T$.
= Detailed rules for *ParamSpec* subtyping
#gc.info(title: [Notation])[
In the following equations:
- the notation $S in.rev a^i: T$ will be used to denote that a parameter spec $S$ accepts an argument named $a$ at index $i$ of type $T$
- the special name $alpha$ will be used to denote any argument without a specific name
- the special name $phi$ will be used to denote any parameter without a specific name
- $AA$ denotes the group of all arguments, i.e. $alpha in AA$
- $PP$ denotes the group of all parameters, i.e. $p in PP$
- $req(S, alpha)$ is a predicate checking whether $alpha$ is required in $S$
]
== Arguments of $S_2$ are compatible with $S_1$ <cond-1>
Formally, the condition is:
$
forall alpha in AA, S_2 in.rev alpha => S_1 in.rev alpha
$
Let $S_1 = (P_1, M_1, K_1)$ and $S_2 = (P_2, M_2, K_2)$.
For each positional-only parameter $phi_i in P_2$, $phi_i in P_1 or phi_i in M_1$. A positional-only parameter of $S_2$ can either be positional-only or mixed in $S_1$. Additionally, $not req(S_2, phi_i) => not req(S_1, phi_i)$. If $phi_i$ is optional in $S_2$, it must also be optional in $S_1$ so that a call omitting it is valid.
Similarly, for each keyword-only parameter $p in K_2$, $p in K_1 or p in M_1$. A keyword-only parameter of $S_2$ can either be keyword-only or mixed in $S_1$. Additionally, $not req(S_2, p) => not req(S_1, p)$. If $p$ is optional in $S_2$, it must also be optional in $S_1$ so that a call omitting it is valid.
Finally, for mixed parameters, the rule is slightly more complex. Either there is a corresponding mixed parameter in $S_1$, or the parameter is covered by both a positional/mixed and a keyword/mixed parameter. In the second case, we must keep in mind that only one of the match will made at runtime, or maybe even none if the parameter is optional in $S_2$, meaning the parameters in $S_1$ _must_ be optional.
We can thus split the rule in two. $forall p_i in M_2$:
$
cases(
p_i in M_1 and not req(S_2, p_i) => not req(S_1, p_i),
"or",
underbrace((phi_i in P_1 or phi_i in M_1), "Positional") and
underbrace((p in K_1 or p in M_1), "Keyword") and
underbrace((not req(S_1, phi_i) and not req(S_1, p)), "Optional")
)
$
== No additional required arguments in $S_1$ <cond-2>
Formally, the condition is:
$
forall alpha in AA, S_1 in.rev alpha and req(S_1, alpha) => S_2 in.rev alpha and req(S_2, alpha)
$
Each parameter in $S_1$ that is not matched by a parameter in $S_2$ must be optional:
$
forall p_i in S_1, p_i in.not S_2 => not req(S_1, p_i)
$

View File

@@ -0,0 +1,243 @@
#import "@preview/fervojo:0.1.1": default-css, render
#let extra-css = ```css
svg.railroad .terminal rect {
fill: #F7DCD4;
}
```
#let css = default-css() + bytes(extra-css.text)
#let literal = ```
{[`literal` <
[`number` 'digit' * ! <!, ["." 'digit' * !]>],
[`boolean` <"False", "True">],
[`string` <["\"" 'char'*! "\""], ["'" 'char'*! "'"]>],
[`none` "None"]
>]}
```
#let grouping = ```
{[`grouping` "(" 'expression' ")"]}
```
#let primary = ```
{[`primary` <"_", 'literal', 'identifier', 'grouping'>]}
```
#let reference = ```
{[`reference` 'primary' <!, ["." 'identifier']*!>]}
```
#let call-args = ```
{[`call-args` "(" <!, <'expression', ['identifier' "=" 'expression']>*","#`Same rules as Python`> ")"]}
```
#let call = ```
{[`call` 'reference' <!, 'call-args'*!>]}
```
#let unary = ```
{[`unary` <[<"+", "-", "!"> 'unary'], 'call'>]}
```
#let factor = ```
{[`factor` 'unary'*<"*", "/">]}
```
#let term = ```
{[`term` 'factor'*<"+", "-">]}
```
#let comparison = ```
{[`comparison` 'term'*<">", "<", ">=", "<=">]}
```
#let equality = ```
{[`equality` 'comparison'*<"==", "!=">]}
```
#let expression = ```
{[`expression` 'equality'*"&"]}
```
#let constraint = ```
{[`constraint` 'expression']}
```
#let template-param = ```
{[`template-param` 'identifier' <!, ["<:" 'type']>]}
```
#let template = ```
{[`template` "[" <!, 'template-param'*","> "]"]}
```
#let named-type = ```
{[`named-type` 'identifier']}
```
#let type-args = ```
{[`type-args` "[" <!, 'type'*","> "]"]}
```
#let frame-schema = ```
{[`frame-schema` "[" <!, ['TOKEN' ":" 'type']*","> "]"]}
```
#let generic-type = ```
{[`generic-type` <["Frame" 'frame-schema'], ['named-type' <!, 'type-args'>]>]}
```
#let grouped-type = ```
{[`grouped-type` "(" 'type' ")"]}
```
#let base-type = ```
{[`base-type` <'grouped-type', 'generic-type'>]}
```
#let constraint-type = ```
{[`constraint-type` 'base-type' <!, ["where" 'constraint']>]}
```
#let pos-param = ```
{[`pos-param` <!, ['identifier' ":"]> 'type' <!, "?">]}
```
#let kw-param = ```
{[`kw-param` 'identifier' ":" 'type' <!, "?">]}
```
#let param-spec = ```
{[`param-spec` "(" <!, <'pos-param', "/", "*", 'kw-param'>*",">#`Same rules as Python` ")"]}
```
#let func-type = ```
{[`func-type` "fn" 'param-spec' "->" 'type']}
```
#let type = ```
{[`type` <'func-type', 'constraint-type'>]}
```
#let alias-statement = ```
{[`alias-statement` "alias" 'identifier' "=" 'type']}
```
#let type-statement = ```
{[`type-statement` "type" 'identifier' <!, 'template'> "=" 'type']}
```
#let member-stmt = ```
{[`member-stmt` <"prop", "def"> 'identifier' ":" 'type']}
```
#let extend-statement = ```
{[`extend-statement` "extend" 'type' "{" <!, 'member-stmt'*!> "}"]}
```
#let predicate-statement = ```
{[`predicate-statement` "predicate" 'identifier' <!, 'param-spec'*!> "=" 'constraint']}
```
#let statement = ```
{[`statement` <'alias-statement', 'type-statement', 'extend-statement', 'predicate-statement'>]}
```
#let rules = (
literal: literal,
grouping: grouping,
primary: primary,
reference: reference,
call-args: call-args,
call: call,
unary: unary,
factor: factor,
term: term,
comparison: comparison,
equality: equality,
expression: expression,
constraint: constraint,
template-param: template-param,
template: template,
named-type: named-type,
type-args: type-args,
generic-type: generic-type,
grouped-type: grouped-type,
base-type: base-type,
constraint-type: constraint-type,
pos-param: pos-param,
kw-param: kw-param,
param-spec: param-spec,
func-type: func-type,
type: type,
alias-statement: alias-statement,
type-statement: type-statement,
member-stmt: member-stmt,
extend-statement: extend-statement,
predicate-statement: predicate-statement,
statement: statement,
)
#let inline = (
"grouping",
"literal",
"template-param",
"template",
"call-args",
"type-args",
"named-type",
"grouped-type",
"generic-type",
"base-type",
"constraint-type",
"pos-param",
"kw-param",
"func-type",
"member-stmt",
"alias-statement",
"type-statement",
"extend-statement",
"predicate-statement",
)
= Statements and expressions
#let all-rules = for (name, rule) in rules.pairs().rev() {
[== #name]
render(rule, css: css)
}
#let substitute(base-rule) = {
let new-rule = base-rule
for name in inline {
let rule = rules.at(name)
let replacement = rule.text.slice(1, -1).replace(regex("\[`.*?`"), "[")
replacement = "[" + replacement + "#`" + name + "`]"
new-rule = new-rule.replace(
"'" + name + "'",
replacement,
)
}
if new-rule != base-rule {
new-rule = substitute(new-rule)
}
return new-rule
}
#let capitalize(word) = {
return upper(word.slice(0, 1)) + word.slice(1)
}
#let display-name(name) = {
let words = name.split("-").map(capitalize)
return [#words.join(" ") (#raw(name))]
}
#let all-combined = for (name, rule) in rules.pairs() {
if not name in inline {
[== #display-name(name)]
let combined = substitute(rule.text)
render(raw(combined), css: css)
//raw(block: true, combined)
}
}

168
report/bachelor_thesis.typ Normal file
View File

@@ -0,0 +1,168 @@
// ___ ____ ____ _ _ _____ ___
// |_ _/ ___| / ___| | | | | ____|_ _| Informatique et
// | |\___ \| | ___ | |_| | _| | | systèmes de communication
// | | ___) | |__|___| | _ | |___ | | HEI Sion · HES-SO Valais / mui 24-26
// |___|____/ \____| |_| |_|_____|___|
//
// 52 65 61 64 69 6e 67 20 68 65 78 20 66 6f 72 20 66 75 6e 3f 20 49 53 43 20 66 6f 72 65 76 65 72
//
#import "requirements.typ": isc-hei-bthesis
#import isc-hei-bthesis: *
#import "@preview/codly:1.3.0": codly-init, codly
#import "@preview/codly-languages:0.1.10": codly-languages
#import "../meta.typ"
#import "utils.typ": include-offset
#let doc_language = "en"
#show: codly-init
#codly(
languages: codly-languages,
)
#set raw(
syntaxes: path("../midas.sublime-syntax")
)
#show: thesis.with(
title: meta.title,
subtitle: meta.subtitle,
authors: meta.authors,
language: doc_language,
thesis-supervisor: meta.thesis-supervisor,
thesis-co-supervisor: meta.thesis-co-supervisor,
thesis-expert: meta.thesis-expert,
thesis-id: meta.thesis-id,
project-repos: meta.project-repos,
school: meta.school,
programme: meta.programme,
keywords: meta.keywords,
major : meta.major,
date: meta.date,
// Declaration of honour signature
signature: image("figs/signature_placeholder.svg", width: 4.5cm), // A scan/photo of your handwritten signature
revision: "1.0",
code-theme: "bluloco-light",
// The cover might show a red "ATTENTION REQUISE" box listing required fields still
// left at their placeholder values (and warns if the title/subtitle is too long).
// Uncomment to hide it, but only do this if you know what you are doing.
// hide-completeness-warning: true,
)
// If using acronyms
#import "@preview/acrostiche:0.7.0": *
#include "acronyms.typ"
// A tidy acronym table for the appendix, using the acronyms declared above.
// (Kept here, not in the package, so acrostiche stays an example-only dependency.)
#let acronym-table() = print-index(
title: page-title(i18n(doc_language, "acronym-table-title"), mult: 1, top: 1em, bottom: 1em),
sorted: "up",
delimiter: " : ",
row-gutter: 0.7em,
outlined: false,
)
////////////////////////////
// Let's get started folks!
////////////////////////////
#cleardoublepage()
#include "pages/abstract.typ"
#cleardoublepage()
#include "pages/résumé.typ"
#cleardoublepage()
#declaration-of-honour()
#cleardoublepage()
#include "pages/acknowledgements.typ"
/*
== The content of a thesis
The general structure of a bachelor thesis typically includes the following sections:
1. *Abstract*: A concise summary of the thesis, including the research question, methodology, results, and conclusions.
2. *Résumé*: A summary of the thesis in French.
3. *Acknowledgements*: [Optional] A section to thank those who supported your work.
4. *Table of Contents*: An organized list of chapters and sections.
5. *Introduction*: Presents the background/context, motivation, objectives, and scope and plan of the thesis.
6. *State of the Art / Literature Review*: Reviews existing research and situates the thesis within the academic context, if relevant to your work.
7. *Development and Methodology*: Describes the methods, materials, and procedures used in the research/thesis.
8. *Results*: Presents the findings of the research, often with tables, figures, and analysis.
9. *Discussion*: Interprets the results, discusses implications, and relates findings to the research question.
10. *Conclusion*: Summarizes the main findings and contributions, and suggests future work.
11. *References / Bibliography*: Lists all sources cited in the thesis.
12. *Appendices*: (Optional) Contains supplementary material such as raw data, code, or additional explanations.
This structure may vary depending on the field of study, but these elements are commonly found in most bachelor theses. They are recommended for the _ISC Bachelor thesis_ and should be adapted to the specific requirements of your thesis (e.g., if you have a state of the art section or not).
You can also change the order or the names of the sections, for instance, if you want to put the state of the art before the introduction, or if you want to add a section on methodology before the results.
*/
#include "chapters/01_introduction.typ"
#include "chapters/02_state_of_the_art.typ"
#include "chapters/03_theory.typ"
#include "chapters/04_implementation.typ"
#include "chapters/05_results_discussion.typ"
#include "chapters/06_conclusion.typ"
#pagebreak()
#the-bibliography(
bib-file: read("bibliography.bib", encoding: none),
full: true,
style: "ieee"
)
//////////////
// Appendices
//////////////
#cleardoublepage()
#appendix-page()
#pagebreak()
#set heading(numbering: "A.1", supplement: [Appendix])
// Table of acronyms (optional). Defined near the acronyms above.
#acronym-table()
#pagebreak()
// Table of listings
#table-of-figures()
// Code inclusion
#pagebreak()
#code-samples()
#figure(
code(
```python
print("Hello World!")
```
),
caption: "Code included from the file example.scala"
)
#pagebreak()
= Midas Language Definition <app:midas-syntax>
#import "appendices/midas_railway.typ": all-combined
#all-combined
= Function Subtyping Rules <app:function-subtyping>
#include-offset("appendices/function_subtyping.typ")

102
report/bibliography.bib Normal file
View File

@@ -0,0 +1,102 @@
% Encoding: UTF-8
@book{tapl,
author = {Pierce, Benjamin C.},
title = {Types and Programming Languages},
year = {2002},
isbn = {0262162091},
publisher = {The MIT Press},
edition = {1st},
abstract = {A type system is a syntactic method for automatically checking the absence of certain erroneous behaviors by classifying program phrases according to the kinds of values they compute. The study of type systems -- and of programming languages from a type-theoretic perspective -- has important applications in software engineering, language design, high-performance compilers, and security.This text provides a comprehensive introduction both to type systems in computer science and to the basic theory of programming languages. The approach is pragmatic and operational; each new concept is motivated by programming examples and the more theoretical sections are driven by the needs of implementations. Each chapter is accompanied by numerous exercises and solutions, as well as a running implementation, available via the Web. Dependencies between chapters are explicitly identified, allowing readers to choose a variety of paths through the material.The core topics include the untyped lambda-calculus, simple type systems, type reconstruction, universal and existential polymorphism, subtyping, bounded quantification, recursive types, kinds, and type operators. Extended case studies develop a variety of approaches to modeling the features of object-oriented languages.}
}
@article{gator,
author = {Geisler, Dietrich and Yoon, Irene and Kabra, Aditi and He, Horace and Sanders, Yinnon and Sampson, Adrian},
title = {Geometry types for graphics programming},
year = {2020},
issue_date = {November 2020},
publisher = {Association for Computing Machinery},
address = {New York, NY, USA},
volume = {4},
number = {OOPSLA},
url = {https://doi.org/10.1145/3428241},
doi = {10.1145/3428241},
abstract = {In domains that deal with physical space and geometry, programmers need to track the coordinate systems that underpin a computation. We identify a class of geometry bugs that arise from confusing which coordinate system a vector belongs to. These bugs are not ruled out by current languages for vector-oriented computing, are difficult to check for at run time, and can generate subtly incorrect output that can be hard to test for. We introduce a type system and language that prevents geometry bugs by reflecting the coordinate system for each geometric object. A value's geometry type encodes its reference frame, the kind of geometric object (such as a point or a direction), and the coordinate representation (such as Cartesian or spherical coordinates). We show how these types can rule out geometrically incorrect operations, and we show how to use them to automatically generate correct-by-construction code to transform vectors between coordinate systems. We implement a language for graphics programming, Gator, that checks geometry types and compiles to OpenGL's shading language, GLSL. Using case studies, we demonstrate that Gator can raise the level of abstraction for shader programming and prevent common errors without inducing significant annotation overhead or performance cost.},
journal = {Proc. ACM Program. Lang.},
month = nov,
articleno = {173},
numpages = {25},
keywords = {computer graphics, geometry, language design, type systems}
}
@inproceedings{Siek2006GradualTF,
title={Gradual Typing for Functional Languages},
author={Jeremy G. Siek and Walid Taha},
year={2006},
url={https://api.semanticscholar.org/CorpusID:1398902}
}
@book{Nystrom:2021:Crafting,
added-at = {2025-04-07T18:48:41.000+0200},
author = {Nystrom, Robert},
biburl = {https://www.bibsonomy.org/bibtex/277c8c518a2426a59a8e4c3a720e60d23/gron},
interhash = {98f889463df208a828c08042cd116e94},
intrahash = {77c8c518a2426a59a8e4c3a720e60d23},
isbn = {978-0990582939},
keywords = {AST Book Bytecode Interpreters Visitor},
month = {July},
pages = 639,
publisher = {Genever Benning},
timestamp = {2025-04-07T18:49:46.000+0200},
title = {{Crafting Interpreters}},
url = {https://craftinginterpreters.com/},
year = 2021
}
@Book{Householder1951,
author = {Householder, Alston S.},
title = {Monte Carlo Method},
year = {1951},
series = {Applied Mathematics Series},
number = {12},
note = {Proceedings of a symposium held June 29, 30, and July 1, 1949},
publisher = {U.S. Department of Commerce, National Bureau of Standards},
pages = {36},
address = {Washington, D.C.},
}
@Online{HOPL,
author = {Diarmuid Pigott},
title = {Online Historical Encyclopaedia of Programming Languages},
url = {https://hopl.info/},
language = {en},
urldate = {2026-07-13},
}
@Online{SO2025Survey,
title = {2025 Stack Overflow Developer Survey},
year = {2025},
url = {https://survey.stackoverflow.co/2025/technology#most-popular-technologies-language-language},
language = {en},
organization = {Stack Overflow},
urldate = {2026-07-13},
}
@Online{PythonGlossary,
title = {Python Glossary},
url = {https://docs.python.org/3/glossary.html#term-duck-typing},
language = {en},
urldate = {2026-07-13},
}
@TechReport{MCOReport,
author = {{{National Aeronautics and Space Administration}}},
title = {Mars Climate Orbiter Mishap Investigation Board - Phase I Report},
institution = {NASA Lessons Learned Information System},
year = {1999},
language = {en},
number = {641},
month = {11},
url = {https://llis.nasa.gov/lesson/641},
}
@Comment{jabref-meta: databaseType:biblatex;}

View File

@@ -0,0 +1,44 @@
#import "../requirements.typ": isc-hei-bthesis
#import isc-hei-bthesis: todo
#import "../utils.typ": quote-block
= Introduction <chap:intro>
#quote-block[J. von Neumann @Householder1951][
Any one who considers arithmetical methods of producing random digits is, of course, in a state of sin
]
Dogs are often said to be man's best friend for their unwavering loyalty. As human beings, we thrive on patterns and predictability. On the other hand, our little animal friends can sometimes be irrational and surprise us with their unpredictable behavior. Computers however, these thought-less automatic machines made of metal, would be much better companions.
By their fundamental essence, computers and other similar machines are deterministic. As developers, we simply give them series of instructions, algorithms, functions and other scripts. Their one and only job is to execute our commands, one after the other, sometimes at the same time. An addition is always an addition, a byte is always a byte, and most importantly, a dog is always a dog.
When programming, developers use formal languages to instruct their devices to do particular tasks. Theses languages are designed to be unambiguous and generally explicit about what they describe. To the machine interpreting that written text, only one meaning is possible. "But", you may say, "sometimes there are bugs when I run my program". Of course, bugs are an inherent part of programming, but not because the machine might not understand you, because you explained it wrongly.
Errors and bugs are always caused by the human factor of computer science.#footnote[Notable exceptions are of course hardware failures which are a totally separate kind of issue]
Over the years, we have created a terrifyingly large number of programming languages#footnote[At least 8945 in 2005 according to the Historical Encyclopaedia of Programming Languages@HOPL] and developed countless tools to help developers avoid errors. Some are more famous than others, some are short-lived, and some remained obscure research projects which never made it out to the public.
While programming languages such as C and Java have long been some of the most popular among developers, another language seemed to have taken the lead in recent years. According to Stack Overflow's 2025 Developer Survey, Python is the most popular programming language among respondents, from beginners to professional developers.@SO2025Survey
Python is a very flexible scripting language, used in many fields, from small games, one-off data processing scripts and personal tooling to desktop applications and data processing pipelines. It is simple enough for beginners to easily learn it and play with it but highly expressive and with a rich ecosystem to build complex projects and production software.
One feature of Python that can be both a great benefit for lazy programmers or fast iteration, and a curse for safety and predictability is its use of duck typing. Duck typing is defined as "A programming style which does not look at an objects type to determine if it has the right interface; instead, the method or attribute is simply called or used"@PythonGlossary, applying the principle "If it looks like a duck and quacks like a duck, it must be a duck.", also known as the duck test.
Additionally, the Python language uses dynamic typing, a design principle allowing users to selectively type values, for example through type hints. These annotations are entirely optional in Python and have no direct runtime effect.#footnote[The only runtime consequence of adding annotations may be additional attributes to access them as strings at runtime] Their goal is to be interpreted by type checkers, like MyPy or Pyright, to verify a program's validity statically.
== Motivation
As explained above, Python is a very flexible language, sometimes too flexible. For beginners trying to learn programming, this can be a double-edged sword. One the one hand, the language is quite lenient and allows mixing data types, reusing variables with different types and passing values that are not at all what was expected by a function but still have the correct attributes or methods. On the other hand, it can lead to confusing behavior, when a parameter does not fit the developer's expectation or a variable is changed in some part of the code to a completely different kind of value. At the professional level, this can also prove dangerous. Mixing medical measurements or having a production service crash because of a type error can become an expensive mistake with real-world impact.
Secondly, as every Java developer can tell you, runtime errors are the worst. The dreaded `NullPointerException` continues to haunt many developers. Although some runtime errors like this are quite loud and can crash an hour-long computation process, others are much more subtle and tricky to catch. A famous example of this is the historical crash of NASA's Mars Climate Orbiter in 1999, which failed its orbital insertion due to a unit error mixing metric and imperial measurements.@MCOReport
Lastly, designing a safe code base and including tests to check that values conform to what is expected can be a tedious and often unrewarding process. Simplifying this process for user is one of the motivation for the famous Python library Pydantic, allowing users to define data structures that can validate inputs when instantiated.
== Objectives
In light of the various points exposed in the previous section, I set out to create a potential solution, a tool to help Python developers code more safely and avoid runtime type errors.
The general goal of this bachelor project is to create a type system on top of Python, using type hints, which can help detect non-trivial type errors (i.e. not necessarily structurally wrong, and also on complex types like dataframes), and produce runtime assertions to check type conformity where static checking is not possible.
The system should not impede on Python's dynamic typing philosophy. It should ensure soundness where types are annotated or inferred, while leaving the user free to omit some and perform unsafe operations.
It system must be flexible to allow checking various kinds of constraints (e.g. value domain, geometric shape, distribution, etc.) and allow extension to add support for more Python features and packages.
Finally, the system must be simple to use for average Python developers, and be able to seamlessly integrate into existing Python code.

View File

@@ -0,0 +1,21 @@
#import "../requirements.typ": isc-hei-bthesis
#import isc-hei-bthesis: todo
= State of the Art <chap:state-of-the-art>
/*
- Python type hints (https://peps.python.org/pep-0484/):
- base types
- type aliases
- structural subtyping with Protocols -> matches duck-typing (https://peps.python.org/pep-0544/)
- Existing type checkers
- MyPy / Pyright
- Existing libraries
- Pandera: runtime only, syntax heavy, but quite complete
- Similar ideas
- Gator system (https://capra.cs.cornell.edu/research/gator/)
*/

View File

@@ -0,0 +1,242 @@
#import "../requirements.typ": isc-hei-bthesis
#import isc-hei-bthesis: todo
#import "@preview/gentle-clues:1.3.1" as gc
#import "@preview/acrostiche:0.7.0": acr
#import "@preview/curryst:0.6.0": prooftree, rule
#import "03_theory/python_syntax.typ": python-syntax
#import "03_theory/midas_syntax.typ": midas-syntax
#import "03_theory/typing.typ"
= Underlying Theory and Typing Rules <chap:theory>
#gc.info[
This chapter presents some type theory notions that form the basis of a type checker and establishes some typing rules we would wish to implement for Python. The reader may skip this more theoretical chapter to the implementation in @chap:impl. These notions are only explained to justify some implementation decisions and provide a solid basis on which to build the type checker but are not strictly necessary to understand the concrete development.
]
The first step to build a useful type checker for Python is to identify the concrete requirements. By identifying what kind of expressions and relationships we are dealing with, we can then select the rules we need to define and handle, and implement appropriate solutions. The concepts and ideas covered in this chapter are mainly derived from the wonderful #acr("TaPL") by Benjamin C. Pierce. This books serves as a reference for all type theory notions presented in this report. This report does not intend to become the new #acr("TaPL").
== Principles <sec:theory-principles>
To talk about type theory and typing rules, we must first define some concepts. B. C. Pierce suggests one definition for type systems:
#quote(block: true)[
A type system is a tractable syntactic method for proving the absence of certain program behaviors by classifying phrases according to the kinds of values they compute.@tapl
]
At its core, a type system provides techniques to ensure the absence of unwanted behavior due to incompatibilities between value types. Although often associated with computer science and programming languages, the fundamental concept of a type system is a mathematical construct.
In the following sections, we will define both syntax rules, to lay out legal constructs in the languages, and typing rules, to build relationships and theorems in our type system.
Syntactically, we will use different kinds of elements, as described in @tab:calculus-elmts.
#figure(
table(
columns: 3,
table.header[*Element*][*Meta-variable*][*Description*],
[Terms], $"t"$, [Building blocks of the language, expressions which can be evaluated],
[Values], $"v"$, [Subset of terms, possible final results of evaluation],
[Statements], $"s"$, [Language constructs that do not evaluate to a value and may have side-effects],
[Types], $"T"$, [Category of values of the same kind],
),
caption: [Calculus elements]
) <tab:calculus-elmts>
A term $"t"$ is said to be of type $"T"$, written $"t": "T"$ if it can be statically proven that it evaluates to a value belonging to type $"T"$.
Additionally, we will need to define rules that link different types together in a compatibility relationship. For example, we can say that a car is a kind of vehicle. In this case, the type `Car` is said to be a "subtype" of `Vehicle`. This relationship is asymmetric and transitive, and is written $"S" <: "T"$ (read "S is a subtype of T").
Finally, because we are dealing with a complex programming language such as Python, we need to introduce the concept of a context. In Python, as in most other languages, users can define variables and functions taking named parameters. This fact means that evaluating an expression, or even typing it, requires knowing some things about the context of what comes before. Taking the example of @fig:example-context, we can see that evaluating or typing the expression `a + a` on line 2 requires knowing the type (or value) of `a`, which was set in a different statement on line 1.
#figure(
```python
a: float = 3
b = a + a
```,
caption: [Example Python expression requiring context]
) <fig:example-context>
The notations for context are as follows:
#align(center, grid(
columns: 2,
gutter: 1em,
align: (center, left),
$Gamma$,
[the context, a list of bindings, mapping terms to types],
$Gamma, "t": "T"$,
[the context extended with the binding of $"t"$ to the type $"T"$],
))
Finally, the rules expressed in @sec:theory-syntax are written in the form of theorems using the following mathematical syntaxes:
#align(center, grid(
columns: 2,
gutter: 1em,
align: (center, left),
prooftree(rule($P_1$, $...$, $P_n$, $C$)),
[Given premises $P_1, ..., P_n$, conclusion $C$ is true],
$Gamma tack P$,
[$Gamma$ "judges" that $P$ is true, i.e. $P$ is true given context $Gamma$],
$P tack.l Gamma'$,
[Evaluating $P$ produces the new context $Gamma'$]
))
== Syntax rules <sec:theory-syntax>
In this section, we define syntax rules for both Python and our type definition language Midas. Obviously, Python already has syntax rules defining what is or is not valid code. What is defined in @sec:theory-syntax-python are a subset of constructs which our type checker will be able to process.
=== Python syntax <sec:theory-syntax-python>
@tab:python-syntax-rules lists mosts Python constructs we want to support with our type checker (notable exceptions are listed below). This subset of the Python language is sufficient to express a wide range of programs, including data processing pipelines and moderately complex scripts.
#figure(
python-syntax,
caption: [Python syntax rules],
supplement: [Table],
kind: table,
) <tab:python-syntax-rules>
Some syntaxes are simplified or omitted from @tab:python-syntax-rules for the sake of conciseness, readability and scope. Indeed, this work's primary focus is not on the theoretical and formal approach to type checking but rather on the concrete application of it to produce a useful tool for developers. For example, function signature in Python are rather complex and flexible, allowing positional-only, keyword-only and mixed parameters, argument sinks, and default values. Expressing this level of flexibility in a formal definition as those presented above is tricky and not necessarily pertinent to this work.
Other syntaxes not referenced in this report are voluntarily left out because they either fall out of the scope of this work or are either not fundamental to the language or not necessary to most developers. Such constructs include classes, match statements, while loops, `for`/`else` blocks and the walrus operator~(`:=`).
=== Midas syntax <sec:theory-syntax-midas>
Our type system includes a dedicated language to define custom types that can be used in Python code. This language is hereafter referred to as the Midas language, or simply Midas. Its goal is to allow users to concisely define types, aliases, subtypes and the like in a simple and intuitive language. All syntax rules are listed in @tab:midas-syntax-rules.
#figure(
midas-syntax,
caption: [Midas syntax rules],
supplement: [Table],
kind: table,
) <tab:midas-syntax-rules>
Parameter specifications in function types and predicates are simplified here for conciseness. In actuality, the supported syntax is similar to Python's regarding positional-only, keyword-only and mixed arguments, with the following notable differences:
- the name of positional-only parameters is optional, i.e. `fn(float, /) -> bool` is valid
- default values are not supported but optional parameters may be indicated with a question mark (`?`) after the type, e.g. `fn(a: float?) -> bool`
A more detailed definition of the syntax is available in @app:midas-syntax.
Some elements are worth explaining here. Midas offers four base statements through four keywords: `alias`, `type`, `extend` and `predicate`.\
The first is rather straightforward: ```midas alias X = T``` defines an alias named `X` for the type `T`.\
The second is a simple subtype definition. ```midas type X = T``` is similar to an alias, but it creates a subtype relationship instead of an equivalence. `X` is thus a subtype of `T`. This also allows defining generic types using type parameters, bounded or not, which can be referenced in the right-hand side of the definition. For example ```midas type Foo[T <: U] = list[T]``` defines a type generic `Foo` with one parameter `T` subtype of `U`, which is a subtype of `list[T]`.\
The third, `extend`, is linked to a subtype definition. It allows users to define members on a type, such as properties/attributes (`prop`) and methods (`def`). Methods may be overloaded to combine multiple signatures under the same name. The type specific after `extend` must obviously be defined.\
The last kind of statement provides user with a way to define named constraint expressions and reuse them as functions in other constraint expressions. Predicates are defined like functions, with a list of parameters. This list may be split into multiple parameter specifications, for example ```midas predicate foo(a: float)(b: int) = a < b``` to allow partial application.
A particularity of Midas are its constraint types. A constraint type `T where e` is built from a base type `T` and a constraint expression `e`. It allows binding a constraint on the values belonging to this type, which will be materialized by assertions at runtime.
== Typing rules <sec:theory-typing>
Now that we have defined what Python syntax we will support and our own definition language, we need to define how our type checker will be able to bind types to Python expressions. This section is heavily inspired by the _Pure simply typed lambda-calculus~($lambda_->$)_, _Simply typed lambda-calculus with subtyping~($lambda_(<:)$)_, _Polymorphic lambda-calculus (System F)_ and _Bounded quantification (kernel $F_(<:)$)_ presented in Chapters 9, 15, 23 and 26 of #acr("TaPL")@tapl.
=== Literals
First and foremost, we can define elementary typing rules for all literal values. These rules having no premises, they are simple axioms. @tab:typing-literals lists all literal typing rules.
#figure(
typing.literals,
caption: [Typing rules: literals],
kind: table,
supplement: [Table],
) <tab:typing-literals>
Other constructs, although not constants, directly map to builtin types. These include literal lists, tuples and dictionaries. Each of these has a corresponding `list[T]`, `tuple` and `dict[K, V]` type. We will not define formal rules in this section regarding these elements, but a more in depth explanation will be given in the implementation of the type checker, in @sec:impl-python. #todo[replace ref]
=== Expressions
Apart from literals, developers also need some building blocks to express their programs. These expressions include variables, function calls, operations, etc. and need their own typing rules. The rules listed in @tab:typing-expressions cover most expressions we will handle, as defined in @sec:theory-syntax-python. Some syntaxes are omitted to keep this chapter short and because they don't necessarily bring new theoretical concepts.
#figure(
typing.expressions,
caption: [Typing rules: expressions],
kind: table,
supplement: [Table],
) <tab:typing-expressions>
#smallcaps[T-Var] simply states that a variable can be typed iff it is in the context.
#smallcaps[T-Call] is a simplified rule of the concrete behavior. Taking into account all call forms with positional and keyword arguments is a rather tedious process which is left as an exercise to the reader.
#smallcaps[T-Tern] is worth a few more words too. Typing rules used by Midas are, by design, stricter than what Python allows. In this case, because we have chosen not to include union types, an expression can only have at most one type, thus the branches must belong to a common type. The specific types of each branch may differ thanks to #smallcaps[T-Sub], defined in @tab:typing-subtyping-base. Additionally, the test expression must be of type $"bool"$, whereas Python can evaluate any object to a boolean.
#smallcaps[T-Op] is used for all binary operations. In Python, these are implemented in _dunder-methods_, such as `__add__` for the `+` operator. A similar rule could be defined for unary operations but is omitted here for brevity.
=== Statements
Finally, expressions can be used in statements, which are special constructs that can have side-effects. We listed in @sec:theory-syntax-python the particular statements that Midas should support, and @tab:typing-statements provides rules to type check their components and effects.
#figure(
typing.statements,
caption: [Typing rules: statements],
kind: table,
supplement: [Table],
) <tab:typing-statements>
#smallcaps[T-Annot] is a rule which handles Python type annotations. It states that the type checker must take note of type hints in the context.
#smallcaps[T-Seq] allows sequences of statements.
#smallcaps[T-IfElse], like #smallcaps[T-Tern] is a stricter version of how Python processes `if` statements. Indeed, Midas will not allow leaking context from inside the bodies of any branch. If a variable is declared inside an `if` statement, Midas will not allow references outside of it.
#gc.info[
You may be familiar with the walrus operator `:=` which is often used in `if` statements to simultaneously declare a variable and use it as an expression. It it thus a mix between a simple expression, which may be used everywhere, and a statement, with the side-effect of declaring a variable.
]
#smallcaps[T-Def] is a gross simplification of how functions can be defined. It does not cover multiple parameters, positional-only and keyword-only parameters, complex bodies with multiple and implicit returns, etc. Again, for the sake of simplicity and readability, we will not define a complete rule to handle all forms and features, but the implementation will go into more details in @sec:impl-python. #todo[replace ref]
=== Subtyping
Similarly to some calculi described in #acr("TaPL")@tapl and to allow flexibility, we must equip our type system with a subtyping relationship. This relationship allows using some types in place of others where it is sound to do so. The subtyping rules presented in @tab:typing-subtyping-base cover the base cases of subtyping.
#figure(
typing.subtyping,
caption: [Typing rules: subtyping base],
kind: table,
supplement: [Table],
) <tab:typing-subtyping-base>
The subtyping relationship is by definition both reflective (#smallcaps[S-Refl]) and transitive (#smallcaps[S-Trans]).
#smallcaps[T-Sub] is a consequence of the #acr("LSP"). A term $"t"$ of type $"S"$ can be used anywhere a term of type $"T"$ is expected if $"S"$ is a subtype of $"T"$.
In addition to these base rules, we need to define how functions, constraint types and generic types are handled.
For constraint types, we will take the simple approach of considering only the base type for the subtype relationship. A more complete and interesting implementation could implement subtyping of constraint expression, where a condition such as `_ < 10` is a subtype of `_ < 100`, but the added complexity was deemed out of scope for this particular project. We do nonetheless define #smallcaps[S-Constr] in @tab:typing-subtyping-constraint to handle the base case.
#figure(
typing.subtyping-constraint,
caption: [Typing rules: subtyping constraint type],
kind: table,
supplement: [Table],
) <tab:typing-subtyping-constraint>
Generics are handled using similar rules to the _Bounded quantification (kernel $F_(<:)$)_ calculus presented in #acr("TaPL") Chapter 26@tapl. Additionally, Midas supports implicit variance, which is inferred from the locations in which type parameters are used, and is used when checking subtypes of applied generic types. A detailed explanation of variance inference is provided in the corresponding implementation section, @sec:impl-python #todo[replace ref].
Finally, functions in Python are complex types. The general subtyping rule is given in @tab:typing-subtyping-function, but the complete set of rules for checking parameter specifications is too complex to include here. It is however detailed in @app:function-subtyping.
#figure(
typing.subtyping-function,
caption: [Typing rules: subtyping functions],
kind: table,
supplement: [Table],
) <tab:typing-subtyping-function>
=== Special types
Two special types can be added to our type system for practical purposes. The first is a regular top type, as represented by `Any` in Python. Every type is a subtype of `Any`, as stated by #smallcaps[S-Any] in @tab:typing-subtyping-top.
In addition to `Any`, we will add a second top type to represent unknowns. When a user omits an annotation, the type checker can use this type as a placeholder to track that a particular expression was indeed processed but its type could not be determined. This has many practical benefits, among which avoiding early exits and propagating unknowns. Additionally, this allows the type checker to differentiate a variable which has specifically been typed as `Any`, and can contain _any_ kind of value, from a variable whose type the checker does not know.
#figure(
typing.subtyping-top,
caption: [Typing rules: subtyping top types],
kind: table,
supplement: [Table],
) <tab:typing-subtyping-top>
The special type `None`, also later referred to as `UnitType`, is used in Midas as a unit type, mapping Python functions' behavior regarding implicit returns.
/*
- Identify requirements
- Introduction to TAPL
- Grammar and typing rules for Midas, paralleled with TAPL
- Omitted rules, simplifications, mechanisms not implemented
*/

View File

@@ -0,0 +1,61 @@
#import "utils.typ": *
#let types = (
($"X"$, [_named type_]),
($"T" ["T"^(i in 1..n)]$, [_type application_]),
($"T" #syntax[where] "e"$, [_constraint type_]),
($#syntax[fn] (attach("a"_i: "T"_i, tr: i in 1..n)) -> "T"$, [_function type_]),
)
#let statements = (
($#syntax[alias] "X" = "T"$, [_alias definition_]),
($#syntax[type] "X" = "T"$, [_type definition_]),
($#syntax[type] "X"["P"^(i in 1..n)] = "T"$, [_generic definition_]),
($ cases(
#syntax[extend] "X"["P"^(i in 1..n)] space \{,
quad m^(j in 1..M),
\},
delim: "["
) $, [_generic definition_]),
($#syntax[predicate] "p" = "e"$, [_predicate alias_]),
($#syntax[predicate] "p" (attach("a"_i: "T"_i, tr: i in 1..n))^(j in 1..m) = "e"$, none),
($$, [_predicate definition_]),
)
#let type-parameters = (
($X$, [_type variable_]),
($X <: T$, [_bounded type\ variable_]),
)
#let member-statements = (
($#syntax[prop] x: T$, [_property_]),
($#syntax[def] x: T$, [_method_]),
)
#let expressions = (
($x$, [_variable_]),
($"i"$, [_integer literal_]),
($"f"$, [_float literal_]),
($"z"$, [_string literal_]),
($"True"$, [_constant true_]),
($"False"$, [_constant false_]),
($"None"$, [_constant none_]),
($f("t")$, [_call_]),
($"t"_1 "op" "t"_2$, [_operation_]),
($"t"."x"$, [_attribute_]),
($\_$, [_self reference_])
)
#let midas-syntax = grid(
columns: (1fr, 1fr),
gutter: 2em,
syntax-grid(
("T", "types", types),
("e", "expressions", expressions),
),
syntax-grid(
("s", "statements", statements),
("P", "type parameters", type-parameters),
("m", "member statements", member-statements),
),
)

View File

@@ -0,0 +1,68 @@
#import "utils.typ": *
#let terms = (
($"x"$, [_variable_]),
($"i"$, [_integer literal_]),
($"f"$, [_float literal_]),
($"z"$, [_string literal_]),
($"True"$, [_constant true_]),
($"False"$, [_constant false_]),
($"None"$, [_constant none_]),
($f("t")$, [_call_]),
($"t"_21 #syntax[if] "t"_1 #syntax[else] "t"_22$, [_ternary_]),
($"t"_1 "op" "t"_2$, [_operation_]),
($"t" [ "t" ]$, [_subscript_]),
($"t"."x"$, [_attribute_]),
)
#let values = (
($"i"$, [_integer literal_]),
($"f"$, [_float literal_]),
($"z"$, [_string literal_]),
($"True"$, [_constant true_]),
($"False"$, [_constant false_]),
($"None"$, [_constant none_]),
)
#let statements = (
($"t"$, [_expression_]),
($"s"; "t"$, [_inline sequence_]),
($ cases(
"s" #nl,
"s",
delim: "["
) $, [_multiline sequence_]),
($"x" = "t"$, [_assignment_]),
($"x": "T"$, [_variable declaration_]),
($ cases(
#syntax[def] f("x": "T") -> "T": #nl,
#tab "t" #nl,
delim: "["
) $, [_def_]),
($ cases(
#syntax[if] "t": #nl,
tab "s" #nl,
#syntax[else]: #nl,
tab "s" #nl,
delim: "["
) $, [_if / else_]),
($ cases(
#syntax[for] "x" #syntax[in] "t":#nl,
#tab "s",
delim: "["
) $, [_for loop_]),
($#syntax[return]$, [_bare return_]),
($#syntax[return] "t"$, [_value return_]),
)
#let python-syntax = grid(
columns: (1fr, 1fr),
gutter: 2em,
syntax-grid(
("t", "terms", terms),
("v", "values", values),
),
syntax-grid(
("s", "statements", statements),
),
)

View File

@@ -0,0 +1,199 @@
#import "@preview/curryst:0.6.0"
#import "utils.typ": *
#let rule(
name,
..premises,
conclusion,
python,
) = (
return (
name: name,
rule: curryst.prooftree(
curryst.rule(
..premises.pos(),
conclusion,
name: smallcaps[(#name)],
),
),
python: python,
)
)
#let literals-rules = (
rule(
"T-Int",
$Gamma tack "i": "int"$,
```py 12: int```
),
rule(
"T-Float",
$Gamma tack "f": "float"$,
```py 12.34: float```
),
rule(
"T-Str",
$Gamma tack "z": "str"$,
```py "foo": str```
),
rule(
"T-True",
$Gamma tack "True": "bool"$,
```py True: bool```
),
rule(
"T-False",
$Gamma tack "False": "bool"$,
```py False: bool```
),
rule(
"T-None",
$Gamma tack "None": "None"$,
```py None: None```
),
)
#let expressions-rules = (
rule(
"T-Var",
$"x": "T" in Gamma$,
$Gamma tack "x": "T"$,
```py x```,
),
rule(
"T-Call",
$Gamma tack f: "T"_1 -> "T"_2$,
$Gamma tack "t": "T"_1$,
$Gamma tack f("t"): "T"_2$,
```py
def func(a: S) -> T: ...
...
func(a): T
```,
),
rule(
"T-Tern",
$Gamma tack "t"_1: "bool"$,
$Gamma tack "t"_21: "T"$,
$Gamma tack "t"_22: "T"$,
$Gamma tack "t"_21 #syntax[if] "t"_1 #syntax[else] "t"_22: "T"$,
```py (true if cond else false): T ```,
),
rule(
"T-Op",
$Gamma tack "t"_1: "T"_1$,
$Gamma tack "t"_2: "T"_2$,
$"op": "T"_1 -> "T"_2 -> "T"_3 in Gamma$,
$Gamma tack "t"_1 "op" "t"_2: "T"_3$,
```py (a + b): T```,
),
)
#let statements-rules = (
rule(
"T-Annot",
$Gamma tack "x": "T" tack.l Gamma, "x": "T"$,
```py x: T```,
),
rule(
"T-Seq",
$Gamma tack "s"_1 tack.l Gamma'$,
$Gamma' tack "s"_2 tack.l Gamma''$,
$Gamma tack "s"_1; "s"_2 tack.l Gamma''$,
```py a = 3; a: int```
),
rule(
"T-IfElse",
$Gamma tack "t": "bool"$,
$Gamma tack "s"_1 tack.l Gamma'$,
$Gamma tack "s"_2 tack.l Gamma''$,
$Gamma tack #syntax[if] "t": "s"_1 #syntax[else]: "s"_2 tack.l Gamma$,
```py
if cond:
...
else:
...
```,
),
rule(
"T-Def",
$Gamma, f: "T"_1 -> "T"_2, "x": "T"_1 tack "t": "T"_2$,
$ Gamma tack cases(delim: #none, #syntax[def] &f("x": "T"_1) -> "T"_2:, &#syntax[return] "t") space tack.l space Gamma, f: "T"_1 -> "T"_2 $,
```py
def func(a: S) -> T:
return ...: T
```,
),
)
#let subtyping-rules = (
rule(
"S-Refl",
$"S" <: "S"$,
none,
),
rule(
"S-Trans",
$"S" <: "U"$,
$"U" <: "T"$,
$"S" <: "T"$,
none,
),
rule(
"T-Sub",
$Gamma tack "t": "S"$,
$"S" <: "T"$,
$Gamma tack "t": "T"$,
none,
),
)
#let rules-grid(rules, columns: 1, large: false) = {
let cells = rules.map(
r => (r.rule, r.python)
).chunks(columns).flatten()
let header = ([*Rule*], [*Python example*]) * columns
grid(
columns: (auto, if large {1fr} else {auto}) * columns,
//row-gutter: 2em,
//column-gutter: 1em,
column-gutter: (0pt, 3em) * columns,
inset: (x:.5em, y: 1em),
align: (center+horizon, right+horizon),
//stroke: (x, _) => if calc.rem(x, 2) == 0 and x != 0 {(left: black)},
grid.header(..header),
..cells,
)
}
#let literals = rules-grid(literals-rules, columns: 2)
#let expressions = rules-grid(expressions-rules)
#let statements = rules-grid(statements-rules, large: true)
#let subtyping = curryst.rule-set(
..subtyping-rules.map(r => r.rule)
)
#let subtyping-constraint = curryst.prooftree(
curryst.rule(
$"S" <: "T"$,
$"S" #syntax[where] "e" <: "T"$,
name: smallcaps[(S-Constr)],
)
)
#let subtyping-function = curryst.prooftree(
curryst.rule(
$"S"_2 <: "S"_1$,
$"R"_1 <: "R"_2$,
$#syntax[fn] ("S"_1) -> "R"_1 <: #syntax[fn] ("S"_2) -> "R"_2$,
name: smallcaps[(S-Func)],
)
)
#let subtyping-top = curryst.rule-set(
curryst.prooftree(curryst.rule(
$"T" <: "Any"$,
name: smallcaps[(S-Any)],
)),
curryst.prooftree(curryst.rule(
$"T" <: "Unknown"$,
name: smallcaps[(S-Unknown)],
)),
)

View File

@@ -0,0 +1,48 @@
#let syntax(body) = {
set text(weight: "bold", fill: rgb(100, 50, 0))
body
}
#let blank(r, c) = grid.cell(
rowspan: r,
colspan: c
)[]
#let tab = sym.arrow.r.stop
#let nl = move(dx: -2pt, dy: 2pt, sym.arrow.curve.l)
#let syntax-preamble = doc => {
show tab: set text(fill: gray.darken(20%))
show sym.arrow.curve.l: set text(fill: gray.darken(20%))
set math.cases(gap: 4pt)
show math.equation: set align(left)
doc
}
#let syntax-grid(..sections) = {
let cells = ()
for (i, (meta-var, name, elements)) in sections.pos().enumerate() {
if i != 0 {
cells.push(grid.cell(colspan: 4)[])
}
cells += ($#meta-var$, $::=$, none, [_#{name}_])
cells.push(blank(elements.len(), 2))
cells += elements.map(
e => if e.last() == none {
grid.cell(colspan: 2, e.first())
} else {
e
}
).flatten()
}
show: syntax-preamble
grid(
columns: (auto, auto, 1fr, auto),
align: (left, left, left, right).map(a => a + horizon),
column-gutter: .4em,
row-gutter: 1.2em,
..cells,
)
}

View File

@@ -0,0 +1,21 @@
#import "../requirements.typ": isc-hei-bthesis
#import isc-hei-bthesis: todo
#import "../utils.typ": include-offset
= Implementation <chap:impl>
#include-offset(path("04_implementation/01_overview.typ"))
#include-offset(path("04_implementation/02_midas_language.typ"))
#include-offset(path("04_implementation/03_python_checking.typ"))
#include-offset(path("04_implementation/04_generation.typ"))
/*
Subjects:
- Variance inference
- Environment
- Resolver
- Evaluator
- CallDispatcher
- Registry (`is_subtype`)
- MethodRegistry (frames and columns)
*/

View File

@@ -0,0 +1,14 @@
#import "../../requirements.typ": isc-hei-bthesis
#import isc-hei-bthesis: todo
= Architecture Overview <sec:impl-overview>
/*
- Main elements
- Definition language
- Supported Python syntax (cf. grammar and typing rules)
- Parse and type check
- Produce user-facing diagnostics
- Generate runtime assertions
- Architecture overview
*/

View File

@@ -0,0 +1,16 @@
#import "../../requirements.typ": isc-hei-bthesis
#import isc-hei-bthesis: todo
= Midas Definition Processing <sec:impl-midas>
/*
- Midas definition language
- Lexer + parser (Crafting Interpreters, Pebble)
- reference theory for grammar rules
- token location -> necessary later for diagnostics
- AST node generation, similar to CI (3 kinds, Stmt/Expr/Type)
- Typer
- reference theory for typing rules
- type structures
- types registry
*/

View File

@@ -0,0 +1,16 @@
#import "../../requirements.typ": isc-hei-bthesis
#import isc-hei-bthesis: todo
= Python Type Checking <sec:impl-python>
/*
- Python type checking
- Parsing (short paragraph about AST nodes)
- Resolver
- Cf. CI
- Assignment analysis
- Typer
- Returns / if-else
- Environment
- Static constraint evaluation
*/

View File

@@ -0,0 +1,10 @@
#import "../../requirements.typ": isc-hei-bthesis
#import isc-hei-bthesis: todo
= Code Generation <sec:impl-generation>
/*
- Code generation
- Stubs
- Assertions
*/

View File

@@ -0,0 +1,4 @@
#import "../requirements.typ": isc-hei-bthesis
#import isc-hei-bthesis: todo
= Results and Discussion <chap:results>

View File

@@ -0,0 +1,4 @@
#import "../requirements.typ": isc-hei-bthesis
#import isc-hei-bthesis: todo
= Conclusion <chap:conclusion>

View File

@@ -0,0 +1,6 @@
<svg xmlns="http://www.w3.org/2000/svg" width="220" height="70" viewBox="0 0 220 70">
<!-- Placeholder handwritten-style signature for the template example. -->
<path d="M8 50 C 30 10, 45 60, 60 35 S 85 5, 100 40 C 110 60, 120 20, 135 38 S 165 55, 185 25 C 195 12, 205 30, 212 22"
fill="none" stroke="#1a2b6b" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M70 55 C 110 48, 150 58, 200 50" fill="none" stroke="#1a2b6b" stroke-width="1.2" stroke-linecap="round"/>
</svg>

After

Width:  |  Height:  |  Size: 514 B

16
report/fonts/README.md Normal file
View File

@@ -0,0 +1,16 @@
# License
All the fonts downloaded by this script for the layout of the documents are licensed under the [SIL Open Font License](https://openfontlicense.org/) which is included in [here](ofl.md).
## Installing fonts
This report template uses several fonts packaged in this repository. To install the fonts in a Linux environment, simply type:
```bash
source install_fonts.sh
```
from within the `fonts` directory and voilà!
The installer also creates a local fontconfig alias so Linux maps `Source Sans Pro` to `Source Sans 3`.
This keeps Typst/web template naming compatibility while avoiding missing-font warnings on Linux.

View File

@@ -0,0 +1,59 @@
#!/usr/bin/env bash
RED='\033[0;31m'
GREEN='\033[0;32m'
NC='\033[0m' # No Color
VU="${GREEN}${NC}"
# v2: ships both "Source Sans 3" and "Source Sans Pro" (v2 name used by the
# Typst web editor) so templates compile without font warnings on both CLI and web.
FONTS_URL="https://files.isc-vs.ch/typst/modern-isc-fonts-v2.tar.gz"
FONTS_ARCHIVE="modern-isc-fonts-v2.tar.gz"
FONTS_DIR="modern-isc-fonts-v2"
echo -e "Downloading and installing fonts locally..."
fonts_dir="${HOME}/.local/share/fonts"
if [ ! -d "${fonts_dir}" ]; then
mkdir -p "${fonts_dir}"
echo -e "Created fonts directory $fonts_dir $VU"
else
echo -e "Found fonts directory $fonts_dir $VU"
fi
wget -q --show-progress "${FONTS_URL}"
if [ $? -ne 0 ]; then
echo -e "${RED}Error: Failed to download ${FONTS_ARCHIVE}.${NC}"
exit 1
fi
echo -e "Font bundle downloaded $VU"
tar -zxf "${FONTS_ARCHIVE}"
cp "${FONTS_DIR}"/*.ttf "${fonts_dir}/"
cp "${FONTS_DIR}"/*.otf "${fonts_dir}/"
echo -e "Fonts installed $VU"
echo -e "Rebuilding font cache..."
fc-cache -f
echo -e "Font cache rebuilt $VU"
rm -f "${FONTS_ARCHIVE}"
rm -rf "${FONTS_DIR}/"
# Verify all required fonts are visible to Typst
missing_fonts=()
for font in "Source Sans Pro" "Source Sans 3" "Inria Sans" "Fira Code"; do
if ! typst fonts | grep -q "^${font}$"; then
missing_fonts+=("$font")
fi
done
if [ ${#missing_fonts[@]} -eq 0 ]; then
echo -e "${VU} All required fonts found in Typst. Install successful!"
else
echo -e "${RED}The following fonts were not found by Typst: ${missing_fonts[*]}${NC}"
exit 1
fi

113
report/fonts/ofl.md Normal file
View File

@@ -0,0 +1,113 @@
Copyright &#40;c) ``<dates>``, ``<Copyright Holder>`` (``<URL|email>``),
with Reserved Font Name ``<Reserved Font Name>``.
Copyright &#40;c) ``<dates>``, ``<additional Copyright Holder>`` (``<URL|email>``),
with Reserved Font Name ``<additional Reserved Font Name>``.
Copyright &#40;c) ``<dates>``, ``<additional Copyright Holder>`` (``<URL|email>``).
This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at:
<https://openfontlicense.org>
---
# SIL OPEN FONT LICENSE
##### *Version 1.1 - 26 February 2007*
PREAMBLE
----------
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.
The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.
DEFINITIONS
-------------
***Font Software*** refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.
***Reserved Font Name*** refers to any names specified as such after the
copyright statement(s).
***Original Version*** refers to the collection of Font Software components as
distributed by the Copyright Holder(s).
***Modified Version*** refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.
***Author*** refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.
PERMISSION & CONDITIONS
------------------------
Permission is hereby granted, free of charge, to any person obtaining
a copy of the ***Font Software***, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the ***Font
Software***, subject to the following conditions:
1) Neither the ***Font Software*** nor any of its individual components,
in ***Original*** or ***Modified Versions***, may be sold by itself.
2) ***Original*** or ***Modified Versions*** of the ***Font Software*** may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.
3) No ***Modified Version*** of the ***Font Software*** may use the ***Reserved Font
Name(s)*** unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.
4) The name(s) of the Copyright Holder(s) or the ***Author(s)*** of the ***Font
Software*** shall not be used to promote, endorse or advertise any
***Modified Version***, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the ***Author(s)*** or with their explicit written
permission.
5) The ***Font Software***, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the ***Font Software***.
TERMINATION
-----------
This license becomes null and void if any of the above conditions are
not met.
DISCLAIMER
-----------
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.

21
report/pages/abstract.typ Normal file
View File

@@ -0,0 +1,21 @@
#import "@preview/isc-hei-bthesis:0.8.1" : *
#page-title("Abstract")
#v(1fr)
The abstract of a bachelor thesis should provide a concise summary of the entire work. It typically includes:
- The context and motivation for the research.
- The main objective or research question.
- A brief description of the methodology or approach used.
- The key results or findings.
- The main conclusion or implications of the work.
The abstract should be self-contained, clear, and usually does not exceed 250300 words. It allows readers to quickly understand the purpose and outcomes of the thesis without reading the full document.
The abstract *must* be written in both French and English.
#lorem(150)
#abstract-footer("en")

View File

@@ -0,0 +1,18 @@
#import "@preview/isc-hei-bthesis:0.8.1" : *
// Get the proper title for acknowledgements if not written in English
#page-title(context i18n(inc.global-language.get(), "acknowledgements"))
#v(1fr)
The *Acknowledgements* section of a bachelor thesis is where you express gratitude to those who supported you during your research and writing process. It is an *OPTIONAL* section. It may include:
- Academic supervisors or advisors who provided guidance.
- Professors or instructors who offered feedback or resources.
- Family and friends for emotional or practical support.
- Institutions or organizations that provided funding, facilities, or data.
- Anyone else who contributed significantly to your work.
Keep this section concise and sincere. It is typically placed after the abstract and before the main content of your thesis.
#v(1fr)

21
report/pages/résumé.typ Normal file
View File

@@ -0,0 +1,21 @@
#import "@preview/isc-hei-bthesis:0.8.1" : *
#page-title("Résumé")
#v(1fr)
Le résumé dun mémoire de bachelor doit fournir un aperçu concis de lensemble du travail. Il inclut généralement:
- Le contexte et la motivation de la recherche.
- Lobjectif principal ou la question de recherche.
- Une brève description de la méthodologie ou de lapproche utilisée.
- Les principaux résultats ou découvertes.
- La conclusion principale ou les implications du travail.
Le résumé doit être autonome, clair et ne pas dépasser habituellement 250 à 300 mots. Il permet aux lecteurs de comprendre rapidement le but et les résultats du mémoire sans lire lintégralité du document.
Le résumé doit être rédigé en français *et* en anglais.
#lorem(150)
#abstract-footer("fr")

159
report/plan.typ Normal file
View File

@@ -0,0 +1,159 @@
= General Plan
1. *Abstract*: concise summary, includes: research question, methodology, results, conclusions
2. *Résumé*: summary in French
3. *Acknowledgements*: [Optional] thank those who supported your work
4. *Table of Contents*
5. *Introduction*: background/context, motivation, objectives, scope and plan
6. *State of the Art / Literature Review*: existing research and situates thesis within academic context, if relevant to the work
7. *Development and Methodology*: methods, materials, and procedures
8. *Results*: findings, often with tables, figures, and analysis
9. *Discussion*: Interpret results, discuss implications, and relate findings to research question
10. *Conclusion*: Summarize main findings and contributions, suggest future work
11. *References / Bibliography*: List all sources cited
12. *Appendices*: (Optional) Contains supplementary material such as raw data, code, or additional explanations
= Introduction
== Background / context
- Programming
- Deterministic -> ask the machine to do something, does it
- Ambiguities come from developer
- Python
- Duck typing
- (Highly) Dynamic
- Very popular, especially in data science
- Type hints
- Type theory introduction
- Why does the IDE know that float + str not valid, but not that EUR + USD is also invalid
== Motivation
- Python is often too flexible
- Can be good but also confusing for beginners
- Dangerous for production use
- Even type-checkers can be too lenient
- Runtime errors are the worst
- Hour-long pipeline process crashing in the middle can be costly
- Silent errors producing the wrong results are close to impossible to locate
- Manually checking things can be tedious and unrewarding
== Objectives
Create a type system on top of Python, using type hints, which can help detect non-trivial type errors (i.e. not necessarily structurally wrong, and also on complex types like dataframes), and produces runtime assertions to check type conformity where static checking is not possible.
This system should ensure soundness where types are annotated or inferred, while leaving the user free to omit some and perform unsafe operations.
The system must be flexible to allow checking various kinds of constraints (e.g. value domain, geometric shape, distribution, etc.) and allow extension.
Finally, the system must be simple to use for average Python developers, and be able to seamlessly integrate into existing Python code.
== Scope and plan
TODO
= State of the art
- Python type hints (https://peps.python.org/pep-0484/):
- base types
- type aliases
- structural subtyping with Protocols -> matches duck-typing (https://peps.python.org/pep-0544/)
- Existing type checkers
- MyPy / Pyright
- Existing libraries
- Pandera: runtime only, syntax heavy, but quite complete
- Similar ideas
- Gator system (https://capra.cs.cornell.edu/research/gator/)
= Development and methodology
2 sections:
1. theory
2. implementation
== Theory
- Identify requirements
- Introduction to TAPL
- Grammar and typing rules for Midas, paralleled with TAPL
- Omitted rules, simplifications, mechanisms not implemented
== Implementation
- Main elements
- Definition language
- Supported Python syntax (cf. grammar and typing rules)
- Parse and type check
- Produce user-facing diagnostics
- Generate runtime assertions
- Architecture overview
- Midas definition language
- Lexer + parser (Crafting Interpreters, Pebble)
- reference theory for grammar rules
- token location -> necessary later for diagnostics
- AST node generation, similar to CI (3 kinds, Stmt/Expr/Type)
- Typer
- reference theory for typing rules
- type structures
- types registry
- Python type checking
- Parsing (short paragraph about AST nodes)
- Resolver
- Cf. CI
- Assignment analysis
- Typer
- Returns / if-else
- Environment
- Static constraint evaluation
- Code generation
- Stubs
- Assertions
/*
Subjects:
- Variance inference
- Environment
- Resolver
- Evaluator
- CallDispatcher
- Registry (`is_subtype`)
- MethodRegistry (frames and columns)
*/
= Results
TODO
= Discussion
TODO
= Conclusion
TODO
== Future work
=== Python features
- support for more common structures and methods (e.g. numpy array, more methods on dataframes)
- support for more builtin types: Iterator, Sequence, etc.
- argument sinks
- while loops, lambdas, classes
- multi-file project and imports
=== Typing features
- expected type
- literal value propagation
=== Improvements
- more control on assertion type, for example to avoid expensive checks
- less redundant check for know part of type (e.g. a dataframe is still a dataframe if only the columns have changed)
- better integration with VSCode (e.g. inline diagnostics)
- generate checks for members (does the object being cast have the given properties and methods?)

1
report/requirements.typ Normal file
View File

@@ -0,0 +1 @@
#import "@preview/isc-hei-bthesis:0.8.1"

View File

@@ -0,0 +1,511 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<!--
Name: 3024 day
Author: Jan T. Sott
License: Public Domain Mark 1.0
URL: https://github.com/idleberg/3024.tmTheme
Base16 template for TextMate by Chris Kempson (https://github.com/chriskempson)
-->
<plist version="1.0">
<dict>
<key>author</key>
<string>Jan T. Sott</string>
<key>name</key>
<string>3024 day</string>
<key>comment</key>
<string>https://github.com/idleberg/3024.tmTheme</string>
<key>semanticClass</key>
<string>theme.light.3024</string>
<key>colorSpaceName</key>
<string>sRGB</string>
<key>gutterSettings</key>
<dict>
<key>background</key>
<string>#f7f7f7</string>
<key>divider</key>
<string>#f7f7f7</string>
<key>foreground</key>
<string>#4a4543</string>
<key>selectionBackground</key>
<string>#f7f7f7</string>
<key>selectionForeground</key>
<string>#a5a2a2</string>
</dict>
<key>settings</key>
<array>
<dict>
<key>settings</key>
<dict>
<key>background</key>
<string>#f7f7f7</string>
<key>caret</key>
<string>#4a4543</string>
<key>foreground</key>
<string>#4a4543</string>
<key>invisibles</key>
<string>#d6d5d4</string>
<key>lineHighlight</key>
<string>#d6d5d4</string>
<key>selection</key>
<string>#d6d5d4</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Text</string>
<key>scope</key>
<string>variable.parameter.function</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#4a4543</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Comments</string>
<key>scope</key>
<string>comment, punctuation.definition.comment</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#807d7c</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Punctuation</string>
<key>scope</key>
<string>punctuation.definition.string, punctuation.definition.variable, punctuation.definition.string, punctuation.definition.parameters, punctuation.definition.string, punctuation.definition.array</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#4a4543</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Delimiters</string>
<key>scope</key>
<string>none</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#4a4543</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Operators</string>
<key>scope</key>
<string>keyword.operator</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#4a4543</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Keywords</string>
<key>scope</key>
<string>keyword, keyword.control</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#a16a94</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Variables</string>
<key>scope</key>
<string>variable</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#db2d20</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Functions</string>
<key>scope</key>
<string>entity.name.function, meta.require, support.function.any-method</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#01a0e4</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Classes</string>
<key>scope</key>
<string>meta.class, support.class, entity.name.class, entity.name.type.class</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ed0c8c</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Methods</string>
<key>scope</key>
<string>keyword.other.special-method</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#01a0e4</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Storage</string>
<key>scope</key>
<string>storage</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#a16a94</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Support</string>
<key>scope</key>
<string>support.function</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#b5e4f4</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Strings, Inherited Class</string>
<key>scope</key>
<string>string, constant.other.symbol, entity.other.inherited-class</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#01a252</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Integers</string>
<key>scope</key>
<string>constant.numeric</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ed0c8c</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Floats</string>
<key>scope</key>
<string>none</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ed0c8c</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Boolean</string>
<key>scope</key>
<string>none</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ed0c8c</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Constants</string>
<key>scope</key>
<string>constant</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ed0c8c</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Tags</string>
<key>scope</key>
<string>entity.name.tag</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#db2d20</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Attributes</string>
<key>scope</key>
<string>entity.other.attribute-name</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ed0c8c</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Attribute IDs</string>
<key>scope</key>
<string>entity.other.attribute-name.id, punctuation.definition.entity</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#01a0e4</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Selector</string>
<key>scope</key>
<string>meta.selector</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#a16a94</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Values</string>
<key>scope</key>
<string>none</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ed0c8c</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Headings</string>
<key>scope</key>
<string>markup.heading punctuation.definition.heading, entity.name.section</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string></string>
<key>foreground</key>
<string>#01a0e4</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Units</string>
<key>scope</key>
<string>keyword.other.unit</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ed0c8c</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Bold</string>
<key>scope</key>
<string>markup.bold, punctuation.definition.bold</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>bold</string>
<key>foreground</key>
<string>#ed0c8c</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Italic</string>
<key>scope</key>
<string>markup.italic, punctuation.definition.italic</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>italic</string>
<key>foreground</key>
<string>#a16a94</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Code</string>
<key>scope</key>
<string>markup.raw.inline</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#01a252</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Link Text</string>
<key>scope</key>
<string>string.other.link</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#db2d20</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Link Url</string>
<key>scope</key>
<string>meta.link</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ed0c8c</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Lists</string>
<key>scope</key>
<string>markup.list</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#db2d20</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Quotes</string>
<key>scope</key>
<string>markup.quote</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ed0c8c</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Separator</string>
<key>scope</key>
<string>meta.separator</string>
<key>settings</key>
<dict>
<key>background</key>
<string>#d6d5d4</string>
<key>foreground</key>
<string>#4a4543</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Inserted</string>
<key>scope</key>
<string>markup.inserted</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#01a252</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Deleted</string>
<key>scope</key>
<string>markup.deleted</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#db2d20</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Changed</string>
<key>scope</key>
<string>markup.changed</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#a16a94</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Colors</string>
<key>scope</key>
<string>constant.other.color</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#b5e4f4</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Regular Expressions</string>
<key>scope</key>
<string>string.regexp</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#b5e4f4</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Escape Characters</string>
<key>scope</key>
<string>constant.character.escape</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#b5e4f4</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Embedded</string>
<key>scope</key>
<string>punctuation.section.embedded, variable.interpolation</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#cdab53</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Invalid</string>
<key>scope</key>
<string>invalid.illegal</string>
<key>settings</key>
<dict>
<key>background</key>
<string>#db2d20</string>
<key>foreground</key>
<string>#f7f7f7</string>
</dict>
</dict>
</array>
<key>uuid</key>
<string>14875ac8-6a02-493d-9cfa-1701c764e24b</string>
</dict>
</plist>

View File

@@ -0,0 +1,948 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<!-- Generated by: TmTheme-Editor -->
<!-- ============================================ -->
<!-- app: http://tmtheme-editor.herokuapp.com -->
<!-- code: https://github.com/aziz/tmTheme-Editor -->
<plist version="1.0">
<dict>
<key>name</key>
<string>Angular-io-Code</string>
<key>settings</key>
<array>
<dict>
<key>settings</key>
<dict>
<key>background</key>
<string>#F5F6F7</string>
<key>foreground</key>
<string>#5C707A</string>
<key>invisibles</key>
<string>#5C707A</string>
<key>caret</key>
<string>#5C707A</string>
<key>gutter</key>
<string>#F5F6F7</string>
<key>gutterForeground</key>
<string>#5C707A</string>
<key>guide</key>
<string>#969896</string>
<key>stackGuide</key>
<string>#969896</string>
<key>activeGuide</key>
<string>#969896</string>
<key>lineHighlight</key>
<string>#FFFFFF00</string>
<key>findHighlight</key>
<string>#969896</string>
<key>findHighlightForeground</key>
<string>#969896</string>
<key>selection</key>
<string>#969896</string>
<key>selectionBorder</key>
<string>#ffffff</string>
<key>bracketsForeground</key>
<string>#647F11</string>
<key>bracketsOptions</key>
<string>underline</string>
<key>bracketContentsForeground</key>
<string>#647F11</string>
<key>bracketContentsOptions</key>
<string>underline</string>
<key>tagsForeground</key>
<string>#647F11</string>
<key>tagsOptions</key>
<string>underline</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Comment</string>
<key>scope</key>
<string>comment</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#969896</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>String</string>
<key>scope</key>
<string>string</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#647F11</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>RegExp Operator</string>
<key>scope</key>
<string>regexp-operator</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#D43669</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>RegExp Character Class</string>
<key>scope</key>
<string>string.regexp.characterclass punctuation.definition.string.begin, string.regexp.characterclass punctuation.definition.string.end</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#D43669</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Number</string>
<key>scope</key>
<string>constant.numeric</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#647F11</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Built-in Constant</string>
<key>scope</key>
<string>constant.language</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#D43669</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>User-defined Constant</string>
<key>scope</key>
<string>constant.character, constant.other, variable.other.constant</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#D43669</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Variable</string>
<key>scope</key>
<string>variable</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#D43669</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Keyword</string>
<key>scope</key>
<string>keyword</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#D43669</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Bitwise</string>
<key>scope</key>
<string>bitwise-operator</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#D43669</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Storage</string>
<key>scope</key>
<string>storage</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#D43669</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Storage Type</string>
<key>scope</key>
<string>storage.type</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#D43669</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Class Name</string>
<key>scope</key>
<string>entity.name.class</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#D43669</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Inherited Class</string>
<key>scope</key>
<string>entity.other.inherited-class</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#D43669</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Function Name</string>
<key>scope</key>
<string>entity.name.function</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#D43669</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Function Argument</string>
<key>scope</key>
<string>variable.parameter</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#5C707A</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Tag Name</string>
<key>scope</key>
<string>entity.name.tag</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#D43669</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Tag Attribute</string>
<key>scope</key>
<string>entity.other.attribute-name</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#647F11</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Library Function</string>
<key>scope</key>
<string>support.function</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#D43669</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Library Constant</string>
<key>scope</key>
<string>support.constant</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#D43669</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Library Class</string>
<key>scope</key>
<string>support.type, support.class</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#D43669</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Library Variable</string>
<key>scope</key>
<string>support.other.variable</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#D43669</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Invalid</string>
<key>scope</key>
<string>invalid, invalid.illegal, invalid.deprecated</string>
<key>settings</key>
<dict>
<key>background</key>
<string>#f5f5f5</string>
<key>foreground</key>
<string>#D43669</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Find-in-files Filename</string>
<key>scope</key>
<string>entity.name.filename.find-in-files</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#5C707A</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Find-in-files Line Numbers</string>
<key>scope</key>
<string>constant.numeric.line-number.find-in-files, constant.numeric.line-number.match.find-in-files</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#969896</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Diff Header</string>
<key>scope</key>
<string>meta.diff.header</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#969896</string>
<key>background</key>
<string>#ffffff</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Diff Header</string>
<key>scope</key>
<string>meta.diff.header punctuation.definition.from-file.diff</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#D43669</string>
<key>background</key>
<string>#ffecec</string>
<key>fontStyle</key>
<string>italic </string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Diff Header</string>
<key>scope</key>
<string>meta.diff.header punctuation.definition.to-file.diff</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#647F11</string>
<key>background</key>
<string>#eaffea</string>
<key>fontStyle</key>
<string>italic </string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Diff Range</string>
<key>scope</key>
<string>meta.diff.range</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#969896</string>
<key>fontStyle</key>
<string>italic </string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Diff Deleted</string>
<key>scope</key>
<string>markup.deleted</string>
<key>settings</key>
<dict>
<key>background</key>
<string>#ffecec</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Diff Deleted Punctuation</string>
<key>scope</key>
<string>markup.deleted punctuation.definition.inserted</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#D43669</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Diff Inserted</string>
<key>scope</key>
<string>markup.inserted</string>
<key>settings</key>
<dict>
<key>background</key>
<string>#eaffea</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Diff Inserted Punctuation</string>
<key>scope</key>
<string>markup.inserted punctuation.definition.inserted</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#647F11</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>GitGutter Deleted</string>
<key>scope</key>
<string>markup.deleted.git_gutter</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#D43669</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>GitGutter Inserted</string>
<key>scope</key>
<string>markup.inserted.git_gutter</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#647F11</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>GitGutter Modified</string>
<key>scope</key>
<string>markup.changed.git_gutter</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#969896</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>GitGutter Ignored</string>
<key>scope</key>
<string>markup.ignored.git_gutter</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#b3b3b3</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>GitGutter Untracked</string>
<key>scope</key>
<string>markup.untracked.git_gutter</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#b3b3b3</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Entity Punctuation</string>
<key>scope</key>
<string>source.css punctuation.definition.entity</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#5C707A</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Pseudo Selector</string>
<key>scope</key>
<string>source.css entity.other.attribute-name.pseudo-class, source.css entity.other.attribute-name.pseudo-element</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#D43669</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Property Value</string>
<key>scope</key>
<string>source.css meta.value, source.css support.constant, source.css support.function</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#647F11</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Color</string>
<key>scope</key>
<string>source.css constant.other.color</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#647F11</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Entity Punctuation</string>
<key>scope</key>
<string>source.scss punctuation.definition.entity</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#5C707A</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Pseudo Selector</string>
<key>scope</key>
<string>source.scss entity.other.attribute-name.pseudo-class, source.scss entity.other.attribute-name.pseudo-element</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#D43669</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Color</string>
<key>scope</key>
<string>source.scss support.constant.property-value, source.scss support.function</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#647F11</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Variable</string>
<key>scope</key>
<string>source.scss variable</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#D43669</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>this</string>
<key>scope</key>
<string>variable.language.this.js</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#D43669</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Function</string>
<key>scope</key>
<string>source.js entity.name.function</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#D43669</string>
<key>fontStyle</key>
<string>regular</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Function Definition</string>
<key>scope</key>
<string>source.js meta.function entity.name.function, source.js entity.name.function meta.function</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#D43669</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>New Function</string>
<key>scope</key>
<string>entity.name.type.new.js</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#D43669</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Function Prototype</string>
<key>scope</key>
<string>variable.language.prototype.js</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#D43669</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Support Function</string>
<key>scope</key>
<string>source.js support.function</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#647F11</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Function Prototype</string>
<key>scope</key>
<string>support.type.object.console.js</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#D43669</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>JSON Property</string>
<key>scope</key>
<string>meta.structure.dictionary.json string.quoted.double.json</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#5C707A</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>JSON Value</string>
<key>scope</key>
<string>meta.structure.dictionary.json meta.structure.dictionary.value.json string.quoted.double.json</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#647F11</string>
<key>fontStyle</key>
<string>regular</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Keyword</string>
<key>scope</key>
<string>source.python keyword</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#D43669</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Storage</string>
<key>scope</key>
<string>source.python storage</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#D43669</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Storage Type</string>
<key>scope</key>
<string>source.python storage.type</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#D43669</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Function</string>
<key>scope</key>
<string>source.python entity.name.function</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#D43669</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Class</string>
<key>scope</key>
<string>source.php entity.name.type.class</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#D43669</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Language Variable</string>
<key>scope</key>
<string>variable.language.ruby</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#D43669</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Module Name</string>
<key>scope</key>
<string>entity.name.type.module.ruby</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#D43669</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Class Name</string>
<key>scope</key>
<string>entity.name.type.class.ruby</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#D43669</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Inherited Class</string>
<key>scope</key>
<string>entity.other.inherited-class.ruby</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#D43669</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Punctuation</string>
<key>scope</key>
<string>punctuation.definition.heading.markdown, punctuation.definition.italic.markdown, punctuation.definition.bold.markdown, punctuation.definition.string.begin.markdown, punctuation.definition.string.end.markdown, punctuation.definition.metadata.markdown, punctuation.definition.link.markdown, punctuation.definition.blockquote.markdown, punctuation.definition.raw.markdown</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#D43669</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Separator</string>
<key>scope</key>
<string>text.html.markdown meta.separator</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#5C707A</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Heading</string>
<key>scope</key>
<string>text.html.markdown markup.heading</string>
<key>settings</key>
<dict>
</dict>
</dict>
<dict>
<key>name</key>
<string>Code Block</string>
<key>scope</key>
<string>text.html.markdown markup.raw.block</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#5C707A</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Inline Code</string>
<key>scope</key>
<string>text.html.markdown markup.raw.inline</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#5C707A</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Link and Image</string>
<key>scope</key>
<string>text.html.markdown meta.link, text.html.markdown meta.image</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#647F11</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Link URL</string>
<key>scope</key>
<string>text.html.markdown markup.underline.link, text.html.markdown constant.other.reference</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>italic</string>
<key>foreground</key>
<string>#647F11</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>List</string>
<key>scope</key>
<string>text.html.markdown markup.list</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#D43669</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Bold</string>
<key>scope</key>
<string>text.html.markdown markup.bold</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string> bold</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Italic</string>
<key>scope</key>
<string>text.html.markdown markup.italic</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Bold Italic</string>
<key>scope</key>
<string>text.html.markdown markup.bold markup.italic</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string> italic bold</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Italic Bold</string>
<key>scope</key>
<string>text.html.markdown markup.italic markup.bold</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>italic bold</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Decorators</string>
<key>scope</key>
<string>tag.decorator.js entity.name.tag.js, tag.decorator.js punctuation.definition.tag.js, tag.decorator.ts entity.name.tag.ts, tag.decorator.ts punctuation.definition.tag.ts</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#647F11</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Type</string>
<key>scope</key>
<string>meta.return.type, meta.return-type, meta.cast, meta.type.annotation, support.type, entity.name.class, entity.name.type, storage.type.cs, storage.type.java</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#D43669</string>
</dict>
</dict>
</array>
<key>colorSpaceName</key>
<string>sRGB</string>
<key>semanticClass</key>
<string>theme.light.angular-io-code</string>
<key>author</key>
<string>NoHomey</string>
<key>comment</key>
<string>Angular.io inspired theme</string>
</dict>
</plist>

View File

@@ -0,0 +1,294 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>author</key>
<string>Austin Cummings</string>
<key>name</key>
<string>Chrome DevTools</string>
<key>settings</key>
<array>
<dict>
<key>settings</key>
<dict>
<key>background</key>
<string>#FFFFFF</string>
<key>caret</key>
<string>#000000</string>
<key>foreground</key>
<string>#000000</string>
<key>invisibles</key>
<string>#B3B3B3F4</string>
<key>lineHighlight</key>
<string>#0000001A</string>
<key>selection</key>
<string>#BAD6FD</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>String</string>
<key>scope</key>
<string>string</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#C41A16</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Number</string>
<key>scope</key>
<string>constant.numeric</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#1C00CF</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Keyword</string>
<key>scope</key>
<string>keyword</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#AA0D91</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Operator</string>
<key>scope</key>
<string>keyword.operator</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#000000</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Identifier</string>
<key>scope</key>
<string>constant.language</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#AA0D91</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Exception</string>
<key>scope</key>
<string>support.class.exception</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#990000</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Function name</string>
<key>scope</key>
<string>entity.name.function</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#000000</string>
<!-- <key>fontStyle</key>
<string>italic</string> -->
</dict>
</dict>
<dict>
<key>name</key>
<string>Type name</string>
<key>scope</key>
<string>entity.name.type</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>bold underline</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Arguments</string>
<key>scope</key>
<string>variable.parameter</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Comment</string>
<key>scope</key>
<string>comment</string>
<key>settings</key>
<dict>
<!-- <key>fontStyle</key>
<string>italic</string> -->
<key>foreground</key>
<string>#007400</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Invalid</string>
<key>scope</key>
<string>invalid</string>
<key>settings</key>
<dict>
<!-- <key>background</key>
<string>#E71A114D</string> -->
<key>foreground</key>
<string>#FF0000</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Trailing whitespace</string>
<key>scope</key>
<string>invalid.deprecated.trailing-whitespace</string>
<key>settings</key>
<dict>
<key>background</key>
<string>#E71A1100</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Embedded source</string>
<key>scope</key>
<string>text source</string>
<key>settings</key>
<dict>
<key>background</key>
<string>#FAFAFAFC</string>
<key>foreground</key>
<string>#000000</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Tag</string>
<key>scope</key>
<string>meta.tag, declaration.tag</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#AA0D91</string>
</dict>
</dict>
<!-- <dict>
<key>name</key>
<string>Constant</string>
<key>scope</key>
<string>constant, support.constant</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#000000</string>
</dict>
</dict> -->
<dict>
<key>name</key>
<string>Support</string>
<key>scope</key>
<string>support</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>bold</string>
<key>foreground</key>
<string>#000000</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Storage</string>
<key>scope</key>
<string>storage</string>
<key>settings</key>
<dict>
<!-- <key>fontStyle</key>
<string>bold</string> -->
<key>foreground</key>
<string>#AA0D91</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Section name</string>
<key>scope</key>
<string>entity.name.section</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>bold underline</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Frame title</string>
<key>scope</key>
<string>entity.name.function.frame</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>bold</string>
<key>foreground</key>
<string>#000000</string>
<!-- <string>#881280</string> -->
</dict>
</dict>
<dict>
<key>name</key>
<string>XML Declaration</string>
<key>scope</key>
<string>meta.tag.preprocessor.xml</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#333333</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Tag Attribute</string>
<key>scope</key>
<string>entity.other.attribute-name</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>italic</string>
<key>foreground</key>
<!-- <string>#3366CC</string> -->
<string>#994500</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Tag Name</string>
<key>scope</key>
<string>entity.name.tag</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#881280</string>
<!-- <key>fontStyle</key>
<string>bold</string> -->
</dict>
</dict>
</array>
<key>uuid</key>
<string>4FCFA210-B247-11D9-9D00-000D93347A42</string>
</dict>
</plist>

View File

@@ -0,0 +1,436 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>author</key>
<string>Kobzarev Mikhail</string>
<key>name</key>
<string>EditPlus</string>
<key>settings</key>
<array>
<dict>
<key>settings</key>
<dict>
<key>background</key>
<string>#FFFFFF</string>
<key>caret</key>
<string>#000000</string>
<key>foreground</key>
<string>#000000</string>
<key>invisibles</key>
<string>#B3B3B3F4</string>
<key>lineHighlight</key>
<string>#00808060</string>
<key>selection</key>
<string>#BAD6FD</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>String</string>
<key>scope</key>
<string>string</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#FF00FF</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Number</string>
<key>scope</key>
<string>constant.numeric</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#800080</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Regular expression</string>
<key>scope</key>
<string>string.regexp</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#FF0080</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Keyword</string>
<key>scope</key>
<string>keyword</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#0000FF</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Identifier</string>
<key>scope</key>
<string>constant.language</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#0000FF</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Exception</string>
<key>scope</key>
<string>support.class.exception</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#990000</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Function name</string>
<key>scope</key>
<string>entity.name.function</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#800000</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Type name</string>
<key>scope</key>
<string>entity.name.type</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>bold underline</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Arguments</string>
<key>scope</key>
<string>variable.parameter</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Comment</string>
<key>scope</key>
<string>comment</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#008000</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Invalid</string>
<key>scope</key>
<string>invalid</string>
<key>settings</key>
<dict>
<key>background</key>
<string>#E71A114D</string>
<key>foreground</key>
<string>#FF0000</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Trailing whitespace</string>
<key>scope</key>
<string>invalid.deprecated.trailing-whitespace</string>
<key>settings</key>
<dict>
<key>background</key>
<string>#E71A1100</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Embedded source</string>
<key>scope</key>
<string>text source</string>
<key>settings</key>
<dict>
<key>background</key>
<string>#FFFFFF</string>
<key>foreground</key>
<string>#800000</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Functions Alt</string>
<key>scope</key>
<string>support.function.construct</string>
<key>settings</key>
<dict>
<key>background</key>
<string>#FFFFFF</string>
<key>foreground</key>
<string>#0000FF</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Tag</string>
<key>scope</key>
<string>meta.tag, declaration.tag</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#0033CC</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Constant</string>
<key>scope</key>
<string>constant, support.constant</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#800000</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Support</string>
<key>scope</key>
<string>support</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>bold</string>
<key>foreground</key>
<string>#3333FF</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Punctuation</string>
<key>scope</key>
<string>punctuation.definition.variable</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#3333FF</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Punctuation Alt</string>
<key>scope</key>
<string>punctuation.definition.string</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#FF00FF</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Object Ref</string>
<key>scope</key>
<string>meta.function-call</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#800000</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Var Alt</string>
<key>scope</key>
<string>variable.other</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#800000</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Var Alt 2</string>
<key>scope</key>
<string>variable.other.php</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#008080</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Punctuation Alt</string>
<key>scope</key>
<string>punctuation.section.embedded</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#800000</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Operators Alt</string>
<key>scope</key>
<string>keyword.operator.assignment</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#800000</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Operators Alt 2</string>
<key>scope</key>
<string>keyword.operator</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#800000</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Operators Alt 3</string>
<key>scope</key>
<string>storage.modifier</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#800000</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>SQL</string>
<key>scope</key>
<string>punctuation.definition.string.begin</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#FF00FF</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Storage</string>
<key>scope</key>
<string>storage</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#3333FF</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Section name</string>
<key>scope</key>
<string>entity.name.section</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>bold underline</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Frame title</string>
<key>scope</key>
<string>entity.name.function.frame</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>bold</string>
<key>foreground</key>
<string>#0000FF</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>XML Declaration</string>
<key>scope</key>
<string>meta.tag.preprocessor.xml</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#333333</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Tag Attribute</string>
<key>scope</key>
<string>entity.other.attribute-name</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#FF0000</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Tag Name</string>
<key>scope</key>
<string>entity.name.tag</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>bold</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>SublimeLinter Error</string>
<key>scope</key>
<string>sublimelinter.mark.error</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#D02000</string>
</dict>
</dict><dict>
<key>name</key>
<string>SublimeLinter Warning</string>
<key>scope</key>
<string>sublimelinter.mark.warning</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#DDB700</string>
</dict>
</dict><dict>
<key>name</key>
<string>SublimeLinter Gutter Mark</string>
<key>scope</key>
<string>sublimelinter.gutter-mark</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#FFFFFF</string>
</dict>
</dict></array>
<key>uuid</key>
<string>4FCFA210-B247-11D9-9D00-000D93347A42</string>
</dict>
</plist>

View File

@@ -0,0 +1,374 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>author</key>
<string>Ankur Gupta</string>
<key>name</key>
<string>GitHub Clean White</string>
<key>settings</key>
<array>
<dict>
<key>settings</key>
<dict>
<key>background</key>
<string>#FFFFFF</string>
<key>caret</key>
<string>#000000</string>
<key>foreground</key>
<string>#000000</string>
<key>invisibles</key>
<string>#B3B3B3F4</string>
<key>lineHighlight</key>
<string>#0000001A</string>
<key>selection</key>
<string>#BAD6FD</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>String</string>
<key>scope</key>
<string>string</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#C41A16</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Number</string>
<key>scope</key>
<string>constant.numeric</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#0086B3</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Keyword</string>
<key>scope</key>
<string>keyword</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#A71D5D</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Operator</string>
<key>scope</key>
<string>keyword.operator</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#000000</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Built-in constant</string>
<key>scope</key>
<string>constant.language</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#0086B3</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Exception</string>
<key>scope</key>
<string>support.class.exception</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#990000</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Function name</string>
<key>scope</key>
<string>entity.name.function</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#000000</string>
<!-- <key>fontStyle</key>
<string>italic</string> -->
</dict>
</dict>
<dict>
<key>name</key>
<string>Type name</string>
<key>scope</key>
<string>entity.name.type</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>bold underline</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Arguments</string>
<key>scope</key>
<string>variable.parameter</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Comment</string>
<key>scope</key>
<string>comment</string>
<key>settings</key>
<dict>
<!-- <key>fontStyle</key>
<string>italic</string> -->
<key>foreground</key>
<string>#969896</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Invalid</string>
<key>scope</key>
<string>invalid</string>
<key>settings</key>
<dict>
<!-- <key>background</key>
<string>#E71A114D</string> -->
<key>foreground</key>
<string>#FF0000</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Trailing whitespace</string>
<key>scope</key>
<string>invalid.deprecated.trailing-whitespace</string>
<key>settings</key>
<dict>
<key>background</key>
<string>#E71A1100</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Embedded source</string>
<key>scope</key>
<string>text source</string>
<key>settings</key>
<dict>
<key>background</key>
<string>#FAFAFAFC</string>
<key>foreground</key>
<string>#000000</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Tag</string>
<key>scope</key>
<string>meta.tag, declaration.tag</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#AA0D91</string>
</dict>
</dict>
<!-- <dict>
<key>name</key>
<string>Constant</string>
<key>scope</key>
<string>constant, support.constant</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#000000</string>
</dict>
</dict> -->
<dict>
<key>name</key>
<string>Support</string>
<key>scope</key>
<string>support</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>bold</string>
<key>foreground</key>
<string>#000000</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Storage</string>
<key>scope</key>
<string>storage</string>
<key>settings</key>
<dict>
<!-- <key>fontStyle</key>
<string>bold</string> -->
<key>foreground</key>
<string>#AA0D91</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Section name</string>
<key>scope</key>
<string>entity.name.section</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>bold underline</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Frame title</string>
<key>scope</key>
<string>entity.name.function.frame</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>bold</string>
<key>foreground</key>
<string>#000000</string>
<!-- <string>#881280</string> -->
</dict>
</dict>
<dict>
<key>name</key>
<string>XML Declaration</string>
<key>scope</key>
<string>meta.tag.preprocessor.xml</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#333333</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>html attribute</string>
<key>scope</key>
<string>entity.other.attribute-name</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>italic</string>
<key>foreground</key>
<!-- <string>#3366CC</string> -->
<string>#0A8585</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>html tag punctuation</string>
<key>scope</key>
<string>entity.name.tag</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#121289</string>
<!-- <key>fontStyle</key>
<string>bold</string> -->
</dict>
</dict>
<!-- Adding stuff for diff. This works in ST3 -->
<dict>
<key>name</key>
<string>diff header from</string>
<key>scope</key>
<string>meta.diff.header.from-file</string>
<key>settings</key>
<dict>
<key>background</key>
<string>#FFDDDD</string>
<key>fontStyle</key>
<string></string>
<key>foreground</key>
<string>#000000</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>diff header to</string>
<key>scope</key>
<string>meta.diff.header.to-file</string>
<key>settings</key>
<dict>
<key>background</key>
<string>#DDFFDD</string>
<key>fontStyle</key>
<string></string>
<key>foreground</key>
<string>#000000</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>diff inserted</string>
<key>scope</key>
<string>markup.inserted.diff</string>
<key>settings</key>
<dict>
<key>background</key>
<string>#DDFFDD</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>diff deleted</string>
<key>scope</key>
<string>markup.deleted.diff</string>
<key>settings</key>
<dict>
<key>background</key>
<string>#FFDDDD</string>
<key>fontStyle</key>
<string></string>
<key>foreground</key>
<string>#000000</string>
</dict>
</dict>
<!-- BracketHighlighter colors -->
<dict>
<key>name</key>
<string>BH Color</string>
<key>scope</key>
<string>brackethighlighter.default</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#FF992244</string>
<key>fontStyle</key>
<string>italic</string>
</dict>
</dict>
</array>
<key>uuid</key>
<string>26786979-843B-4FE2-BCB6-4FCEC6F8FB58</string>
<key>colorSpaceName</key>
<string>sRGB</string>
<key>semanticClass</key>
<string>theme.light.git_hub_clean_white</string>
<key>comment</key>
<string>v1.0 Feb 1, 2015
Made to look as close to GitHub as possible.</string>
</dict>
</plist>

View File

@@ -0,0 +1,643 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>author</key>
<string>GitHub</string>
<key>settings</key>
<array>
<dict>
<key>settings</key>
<dict>
<key>selection</key>
<string>#c8c8fa</string>
<key>lineHighlight</key>
<string>#fafbfc</string>
<key>background</key>
<string>#fff</string>
<key>foreground</key>
<string>#24292e</string>
<key>invisibles</key>
<string>#959da5</string>
<key>caret</key>
<string>#24292e</string>
<key>diffRenamed</key>
<string>#fafbfc</string>
<key>diffModified</key>
<string>#f9c513</string>
<key>diffDeleted</key>
<string>#d73a49</string>
<key>diffAdded</key>
<string>#34d058</string>
<key>markdown</key>
<string>#f7f7f7</string>
<key>inactiveSelection</key>
<string>#fafbfc</string>
<key>selectionBorder</key>
<string>#fafbfc</string>
<key>findHighlight</key>
<string>#e36209</string>
<key>findHighlightForeground</key>
<string>#fff8f2</string>
<key>guide</key>
<string>#959da5</string>
<key>activeGuide</key>
<string>#24292e</string>
<key>stackGuide</key>
<string>#959da5</string>
<key>highlight</key>
<string>#444d56</string>
<key>popupCss</key>
<string>&lt;![CDATA[html { background-color: #e0e0e0; } h1, h2, h3, h4, h5, h6 { color: #005cc5; margin-top: 0.2em; margin-bottom: 0.2em; } h1 { font-size: 1.5em; } h2 { font-size: 1.4em; } h3 { font-size: 1.3em; } h4 { font-size: 1.2em; } h5 { font-size: 1.1em; } h6 { font-size: 1em; } blockquote { color: #22863a; display: block; font-style: italic; } pre { display: block; } a { color: #032f62; font-style: underline; } body { color: #24292e; background-color: #fff; margin: 1px; font-size: 1em; padding: 0.2em; } .danger { color: #b31d28; } .important, .attention { color: #6f42c1; } .caution, .warning { color: #e36209; } .note { color: #735c0f; }]]&gt;</string>
<key>highlightForeground</key>
<string>#444d56</string>
<key>tagsOptions</key>
<string>underline</string>
<key>bracketContentsOptions</key>
<string>underline</string>
<key>bracketContentsForeground</key>
<string>#24292e</string>
<key>bracketsOptions</key>
<string>underline</string>
<key>bracketsForeground</key>
<string>#24292e</string>
<key>gutterForeground</key>
<string>#24292e</string>
</dict>
</dict>
<dict>
<key>scope</key>
<string>comment, punctuation.definition.comment, string.comment</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#6a737d</string>
</dict>
<key>name</key>
<string>Comment</string>
</dict>
<dict>
<key>scope</key>
<string>constant, entity.name.constant, variable.other.constant, variable.language</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#005cc5</string>
</dict>
<key>name</key>
<string>Constant</string>
</dict>
<dict>
<key>scope</key>
<string>keyword.operator.symbole, keyword.other.mark</string>
<key>name</key>
<string>Clojure workaround; don't highlight these separately from their enclosing scope</string>
<key>settings</key>
<dict/>
</dict>
<dict>
<key>scope</key>
<string>entity, entity.name</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string/>
<key>foreground</key>
<string>#6f42c1</string>
</dict>
<key>name</key>
<string>Entity</string>
</dict>
<dict>
<key>scope</key>
<string>variable.parameter.function</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#24292e</string>
</dict>
</dict>
<dict>
<key>scope</key>
<string>entity.name.tag</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string/>
<key>foreground</key>
<string>#22863a</string>
</dict>
</dict>
<dict>
<key>scope</key>
<string>keyword</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string/>
<key>foreground</key>
<string>#d73a49</string>
</dict>
<key>name</key>
<string>Keyword</string>
</dict>
<dict>
<key>scope</key>
<string>storage, storage.type</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#d73a49</string>
</dict>
<key>name</key>
<string>Storage</string>
</dict>
<dict>
<key>scope</key>
<string>storage.modifier.package, storage.modifier.import, storage.type.java</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#24292e</string>
</dict>
</dict>
<dict>
<key>scope</key>
<string>string, punctuation.definition.string, string punctuation.section.embedded source</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string/>
<key>foreground</key>
<string>#032f62</string>
</dict>
<key>name</key>
<string>String</string>
</dict>
<dict>
<key>name</key>
<string>Ada workaround; don't highlight imports as strings</string>
<key>scope</key>
<string>string.unquoted.import.ada</string>
<key>settings</key>
<dict/>
</dict>
<dict>
<key>scope</key>
<string>support</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string/>
<key>foreground</key>
<string>#005cc5</string>
</dict>
<key>name</key>
<string>Support</string>
</dict>
<dict>
<key>scope</key>
<string>meta.property-name</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string/>
<key>foreground</key>
<string>#005cc5</string>
</dict>
</dict>
<dict>
<key>scope</key>
<string>variable</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string/>
<key>foreground</key>
<string>#e36209</string>
</dict>
<key>name</key>
<string>Variable</string>
</dict>
<dict>
<key>scope</key>
<string>variable.other</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#24292e</string>
</dict>
</dict>
<dict>
<key>scope</key>
<string>invalid.broken</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>bold italic underline</string>
<key>foreground</key>
<string>#b31d28</string>
</dict>
<key>name</key>
<string>Invalid - Broken</string>
</dict>
<dict>
<key>scope</key>
<string>invalid.deprecated</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>bold italic underline</string>
<key>foreground</key>
<string>#b31d28</string>
</dict>
<key>name</key>
<string>Invalid Deprecated</string>
</dict>
<dict>
<key>scope</key>
<string>invalid.illegal</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>italic underline</string>
<key>background</key>
<string>#b31d28</string>
<key>foreground</key>
<string>#fafbfc</string>
</dict>
<key>name</key>
<string>Invalid Illegal</string>
</dict>
<dict>
<key>scope</key>
<string>carriage-return</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>italic underline</string>
<key>background</key>
<string>#d73a49</string>
<key>foreground</key>
<string>#fafbfc</string>
<key>content</key>
<string>^M</string>
</dict>
<key>name</key>
<string>Carriage Return</string>
</dict>
<dict>
<key>scope</key>
<string>invalid.unimplemented</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>bold italic underline</string>
<key>foreground</key>
<string>#b31d28</string>
</dict>
<key>name</key>
<string>Invalid - Unimplemented</string>
</dict>
<dict>
<key>scope</key>
<string>message.error</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#b31d28</string>
</dict>
</dict>
<dict>
<key>scope</key>
<string>string source</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string/>
<key>foreground</key>
<string>#24292e</string>
</dict>
<key>name</key>
<string>String embedded-source</string>
</dict>
<dict>
<key>scope</key>
<string>string variable</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string/>
<key>foreground</key>
<string>#005cc5</string>
</dict>
<key>name</key>
<string>String variable</string>
</dict>
<dict>
<key>scope</key>
<string>source.regexp, string.regexp</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string/>
<key>foreground</key>
<string>#032f62</string>
</dict>
<key>name</key>
<string>String.regexp</string>
</dict>
<dict>
<key>scope</key>
<string>string.regexp.character-class, string.regexp constant.character.escape, string.regexp source.ruby.embedded, string.regexp string.regexp.arbitrary-repitition</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#032f62</string>
</dict>
<key>name</key>
<string>String.regexp.«special»</string>
</dict>
<dict>
<key>scope</key>
<string>string.regexp constant.character.escape</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>bold</string>
<key>foreground</key>
<string>#22863a</string>
</dict>
<key>name</key>
<string>String.regexp constant.character.escape</string>
</dict>
<dict>
<key>scope</key>
<string>support.constant</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string/>
<key>foreground</key>
<string>#005cc5</string>
</dict>
<key>name</key>
<string>Support.constant</string>
</dict>
<dict>
<key>scope</key>
<string>support.variable</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#005cc5</string>
</dict>
<key>name</key>
<string>Support.variable</string>
</dict>
<dict>
<key>scope</key>
<string>meta.module-reference</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#005cc5</string>
</dict>
<key>name</key>
<string>meta module-reference</string>
</dict>
<dict>
<key>scope</key>
<string>markup.list</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#735c0f</string>
</dict>
<key>name</key>
<string>Markup.list</string>
</dict>
<dict>
<key>scope</key>
<string>markup.heading, markup.heading entity.name</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>bold</string>
<key>foreground</key>
<string>#005cc5</string>
</dict>
<key>name</key>
<string>Markup.heading</string>
</dict>
<dict>
<key>scope</key>
<string>markup.quote</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#22863a</string>
</dict>
<key>name</key>
<string>Markup.quote</string>
</dict>
<dict>
<key>scope</key>
<string>markup.italic</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>italic</string>
<key>foreground</key>
<string>#24292e</string>
</dict>
<key>name</key>
<string>Markup.italic</string>
</dict>
<dict>
<key>scope</key>
<string>markup.bold</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>bold</string>
<key>foreground</key>
<string>#24292e</string>
</dict>
<key>name</key>
<string>Markup.bold</string>
</dict>
<dict>
<key>scope</key>
<string>markup.raw</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string/>
<key>foreground</key>
<string>#005cc5</string>
</dict>
<key>name</key>
<string>Markup.raw</string>
</dict>
<dict>
<key>scope</key>
<string>markup.deleted, meta.diff.header.from-file, punctuation.definition.deleted</string>
<key>settings</key>
<dict>
<key>background</key>
<string>#ffeef0</string>
<key>foreground</key>
<string>#b31d28</string>
</dict>
<key>name</key>
<string>Markup.deleted</string>
</dict>
<dict>
<key>scope</key>
<string>markup.inserted, meta.diff.header.to-file, punctuation.definition.inserted</string>
<key>settings</key>
<dict>
<key>background</key>
<string>#f0fff4</string>
<key>foreground</key>
<string>#22863a</string>
</dict>
<key>name</key>
<string>Markup.inserted</string>
</dict>
<dict>
<key>scope</key>
<string>markup.changed, punctuation.definition.changed</string>
<key>settings</key>
<dict>
<key>background</key>
<string>#ffebda</string>
<key>foreground</key>
<string>#e36209</string>
</dict>
</dict>
<dict>
<key>scope</key>
<string>markup.ignored, markup.untracked</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#f6f8fa</string>
<key>background</key>
<string>#005cc5</string>
</dict>
</dict>
<dict>
<key>scope</key>
<string>meta.diff.range</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#6f42c1</string>
<key>fontStyle</key>
<string>bold</string>
</dict>
</dict>
<dict>
<key>scope</key>
<string>meta.diff.header</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#005cc5</string>
</dict>
</dict>
<dict>
<key>scope</key>
<string>meta.separator</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>bold</string>
<key>foreground</key>
<string>#005cc5</string>
</dict>
<key>name</key>
<string>Meta.separator</string>
</dict>
<dict>
<key>name</key>
<string>Output</string>
<key>scope</key>
<string>meta.output</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#005cc5</string>
</dict>
</dict>
<dict>
<key>scope</key>
<string>brackethighlighter.tag, brackethighlighter.curly, brackethighlighter.round, brackethighlighter.square, brackethighlighter.angle, brackethighlighter.quote</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#586069</string>
</dict>
</dict>
<dict>
<key>scope</key>
<string>brackethighlighter.unmatched</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#b31d28</string>
</dict>
</dict>
<dict>
<key>scope</key>
<string>sublimelinter.mark.error</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#b31d28</string>
</dict>
</dict>
<dict>
<key>scope</key>
<string>sublimelinter.mark.warning</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#e36209</string>
</dict>
</dict>
<dict>
<key>scope</key>
<string>sublimelinter.gutter-mark</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#959da5</string>
</dict>
</dict>
<dict>
<key>scope</key>
<string>constant.other.reference.link, string.other.link</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#032f62</string>
<key>fontStyle</key>
<string>underline</string>
</dict>
</dict>
</array>
<key>comment</key>
<string>GitHub Light syntax theme</string>
<key>name</key>
<string>GitHub Light</string>
<key>semanticClass</key>
<string>theme.light.github</string>
<key>filename</key>
<string>github-light</string>
<key>uuid</key>
<string>A1C4DFA0-7031-11E4-9803-0800200C9A66</string>
</dict>
</plist>

369
report/themes/ILM.tmTheme Normal file
View File

@@ -0,0 +1,369 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<!-- Created by: ilm techno solutions -->
<!-- ============================================ -->
<!-- code: https://github.com/codex8/Colorsublime-Themes -->
<plist version="1.0">
<dict>
<key>name</key>
<string>ILM</string>
<key>settings</key>
<array>
<dict>
<key>settings</key>
<dict>
<key>background</key>
<string>#FFFFFF</string>
<key>caret</key>
<string>#000000</string>
<key>foreground</key>
<string>#000000</string>
<key>invisibles</key>
<string>#BFBFBF</string>
<key>lineHighlight</key>
<string>#FFFBD1</string>
<key>selection</key>
<string>#BDD5FC</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Comment</string>
<key>scope</key>
<string>comment</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string></string>
<key>foreground</key>
<string>#BCC8BA</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>String</string>
<key>scope</key>
<string>string</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string></string>
<key>foreground</key>
<string>#5D90CD</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Number</string>
<key>scope</key>
<string>constant.numeric</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#46A609</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Built-in constant</string>
<key>scope</key>
<string>constant.language</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string></string>
<key>foreground</key>
<string>#39946A</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>User-defined constant</string>
<key>scope</key>
<string>constant.character, constant.other</string>
<key>settings</key>
<dict>
</dict>
</dict>
<dict>
<key>name</key>
<string>Variable</string>
<key>scope</key>
<string>variable.language, variable.other</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string></string>
<key>foreground</key>
<string>#2b991b</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Keyword</string>
<key>scope</key>
<string>keyword, support.constant.property-value, constant.other.color</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string> bold</string>
<key>foreground</key>
<string>#ef5a19</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Keyword -&gt; Unit</string>
<key>scope</key>
<string>keyword.other.unit</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#96DC5F</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Keyword -&gt; Operator</string>
<key>scope</key>
<string>keyword.operator</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#655465</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Storage</string>
<key>scope</key>
<string>storage</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string></string>
<key>foreground</key>
<string>#C52727</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Class name</string>
<key>scope</key>
<string>entity.name.class</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string> bold</string>
<key>foreground</key>
<string>#27a6b4</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Inherited class</string>
<key>scope</key>
<string>entity.other.inherited-class</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string></string>
<key>foreground</key>
<string>#858585</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Function name</string>
<key>scope</key>
<string>entity.name.function</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string> bold</string>
<key>foreground</key>
<string>#5319b5</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Function argument</string>
<key>scope</key>
<string>variable.parameter</string>
<key>settings</key>
<dict>
</dict>
</dict>
<dict>
<key>name</key>
<string>Tag name</string>
<key>scope</key>
<string>entity.name.tag</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string></string>
<key>foreground</key>
<string>#606060</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>HTML Entity</string>
<key>scope</key>
<string>constant.character.entity</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#BF78CC</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>JS Support Class</string>
<key>scope</key>
<string>support.class.js</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#BF78CC</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Tag attribute</string>
<key>scope</key>
<string>entity.other.attribute-name</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string></string>
<key>foreground</key>
<string>#606060</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>CSS Selector</string>
<key>scope</key>
<string>meta.selector.css, entity.name.tag.css, entity.other.attribute-name.id.css, entity.other.attribute-name.class.css</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string></string>
<key>foreground</key>
<string>#C52727</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>CSS Property</string>
<key>scope</key>
<string>meta.property-name.css</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#484848</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Library function</string>
<key>scope</key>
<string>support.function</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#C52727</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Library constant</string>
<key>scope</key>
<string>support.constant</string>
<key>settings</key>
<dict>
</dict>
</dict>
<dict>
<key>name</key>
<string>Library class&#x2f;type</string>
<key>scope</key>
<string>support.type, support.class</string>
<key>settings</key>
<dict>
</dict>
</dict>
<dict>
<key>name</key>
<string>Library variable</string>
<key>scope</key>
<string>support.other.variable</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Invalid</string>
<key>scope</key>
<string>invalid</string>
<key>settings</key>
<dict>
<key>background</key>
<string>#FF002A</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Punctuation&#x2f;Widgets</string>
<key>scope</key>
<string>punctuation.section.embedded</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string></string>
<key>foreground</key>
<string>#C52727</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Punctuation (Tags)</string>
<key>scope</key>
<string>punctuation.definition.tag</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string></string>
<key>foreground</key>
<string>#606060</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Keyword -&gt; CSS</string>
<key>scope</key>
<string>constant.other.color.rgb-value.css, support.constant.property-value.css</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#BF78CC</string>
</dict>
</dict>
</array>
<key>uuid</key>
<string>47536290-6FC1-4B09-A08F-B219909E1A69</string>
<key>colorSpaceName</key>
<string>sRGB</string>
<key>semanticClass</key>
<string>theme.ILM</string>
<key>author</key>
<string>sameer</string>
<key>comment</key>
<string>https://github.com/codex8/Colorsublime-Themes</string>
</dict>
</plist>

View File

@@ -0,0 +1,369 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<!-- Created by: ilm techno solutions -->
<!-- ============================================ -->
<!-- code: https://github.com/codex8/Colorsublime-Themes -->
<plist version="1.0">
<dict>
<key>name</key>
<string>ILM 2</string>
<key>settings</key>
<array>
<dict>
<key>settings</key>
<dict>
<key>background</key>
<string>#FFFFFF</string>
<key>caret</key>
<string>#000000</string>
<key>foreground</key>
<string>#000000</string>
<key>invisibles</key>
<string>#BFBFBF</string>
<key>lineHighlight</key>
<string>#FFFBD1</string>
<key>selection</key>
<string>#BDD5FC</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Comment</string>
<key>scope</key>
<string>comment</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string></string>
<key>foreground</key>
<string>#c5c8baff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>String</string>
<key>scope</key>
<string>string</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string></string>
<key>foreground</key>
<string>#5dcdbfff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Number</string>
<key>scope</key>
<string>constant.numeric</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#a69d09ff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Built-in constant</string>
<key>scope</key>
<string>constant.language</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string></string>
<key>foreground</key>
<string>#459439ff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>User-defined constant</string>
<key>scope</key>
<string>constant.character, constant.other</string>
<key>settings</key>
<dict>
</dict>
</dict>
<dict>
<key>name</key>
<string>Variable</string>
<key>scope</key>
<string>variable.language, variable.other</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string></string>
<key>foreground</key>
<string>#7f991bff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Keyword</string>
<key>scope</key>
<string>keyword, support.constant.property-value, constant.other.color</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string> bold</string>
<key>foreground</key>
<string>#ef1967ff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Keyword -&gt; Unit</string>
<key>scope</key>
<string>keyword.other.unit</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#dccf5fff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Keyword -&gt; Operator</string>
<key>scope</key>
<string>keyword.operator</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#5a5465ff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Storage</string>
<key>scope</key>
<string>storage</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string></string>
<key>foreground</key>
<string>#c52790ff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Class name</string>
<key>scope</key>
<string>entity.name.class</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string> bold</string>
<key>foreground</key>
<string>#27b464ff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Inherited class</string>
<key>scope</key>
<string>entity.other.inherited-class</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string></string>
<key>foreground</key>
<string>#858585ff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Function name</string>
<key>scope</key>
<string>entity.name.function</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string> bold</string>
<key>foreground</key>
<string>#1947b5ff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Function argument</string>
<key>scope</key>
<string>variable.parameter</string>
<key>settings</key>
<dict>
</dict>
</dict>
<dict>
<key>name</key>
<string>Tag name</string>
<key>scope</key>
<string>entity.name.tag</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string></string>
<key>foreground</key>
<string>#606060ff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>HTML Entity</string>
<key>scope</key>
<string>constant.character.entity</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#8778ccff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>JS Support Class</string>
<key>scope</key>
<string>support.class.js</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#8778ccff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Tag attribute</string>
<key>scope</key>
<string>entity.other.attribute-name</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string></string>
<key>foreground</key>
<string>#606060ff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>CSS Selector</string>
<key>scope</key>
<string>meta.selector.css, entity.name.tag.css, entity.other.attribute-name.id.css, entity.other.attribute-name.class.css</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string></string>
<key>foreground</key>
<string>#c52790ff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>CSS Property</string>
<key>scope</key>
<string>meta.property-name.css</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#484848ff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Library function</string>
<key>scope</key>
<string>support.function</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#c52790ff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Library constant</string>
<key>scope</key>
<string>support.constant</string>
<key>settings</key>
<dict>
</dict>
</dict>
<dict>
<key>name</key>
<string>Library class&#x2f;type</string>
<key>scope</key>
<string>support.type, support.class</string>
<key>settings</key>
<dict>
</dict>
</dict>
<dict>
<key>name</key>
<string>Library variable</string>
<key>scope</key>
<string>support.other.variable</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Invalid</string>
<key>scope</key>
<string>invalid</string>
<key>settings</key>
<dict>
<key>background</key>
<string>#ff00d4ff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Punctuation&#x2f;Widgets</string>
<key>scope</key>
<string>punctuation.section.embedded</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string></string>
<key>foreground</key>
<string>#c52790ff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Punctuation (Tags)</string>
<key>scope</key>
<string>punctuation.definition.tag</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string></string>
<key>foreground</key>
<string>#606060ff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Keyword -&gt; CSS</string>
<key>scope</key>
<string>constant.other.color.rgb-value.css, support.constant.property-value.css</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#8778ccff</string>
</dict>
</dict>
</array>
<key>uuid</key>
<string>47536290-6FC1-4B09-A08F-B219909E1A69</string>
<key>colorSpaceName</key>
<string>sRGB</string>
<key>semanticClass</key>
<string>theme.light.ILM light</string>
<key>author</key>
<string>sameer</string>
<key>comment</key>
<string>sam0hack</string>
</dict>
</plist>

View File

@@ -0,0 +1,619 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<!-- Generated by: TmTheme-Editor -->
<!-- ============================================ -->
<!-- app: http://tmtheme-editor.herokuapp.com -->
<!-- code: https://github.com/aziz/tmTheme-Editor -->
<plist version="1.0">
<dict>
<key>author</key>
<string>Umut Topuzoğlu</string>
<key>name</key>
<string>Bluloco Light</string>
<key>semanticClass</key>
<string>theme.light.bluloco_light</string>
<key>colorSpaceName</key>
<string>sRGB</string>
<key>gutterSettings</key>
<dict>
<key>background</key>
<string>#353b45</string>
<key>divider</key>
<string>#353b45</string>
<key>foreground</key>
<string>#a0a1a7</string>
<key>selectionBackground</key>
<string>#d2ecff</string>
<key>selectionForeground</key>
<string>#565c64</string>
</dict>
<key>settings</key>
<array>
<dict>
<key>settings</key>
<dict>
<key>background</key>
<string>#f9f9f9</string>
<key>caret</key>
<string>#f31459</string>
<key>foreground</key>
<string>#383a42</string>
<key>invisibles</key>
<string>#a0a1a7</string>
<key>lineHighlight</key>
<string>#f1f1f1</string>
<key>selection</key>
<string>#d2ecff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Text</string>
<key>scope</key>
<string>variable.parameter.function</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#383a42</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Comments</string>
<key>scope</key>
<string>comment, punctuation.definition.comment, string.comment</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#a0a1a7</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Punctuation</string>
<key>scope</key>
<string>punctuation.definition.variable, punctuation.definition.parameters, punctuation.definition.array, punctuation.definition.function, meta.brace, punctuation.terminator.statement, meta.delimiter.object.comma, punctuation.definition.entity, punctuation.definition,punctuation.definition.string.begin.markdown, punctuation.definition.string.end.markdown, punctuation.separator.key-value, punctuation.separator.dictionary, punctuation.terminator, meta.delimiter.comma, punctuation.separator.comma,punctuation.accessor,punctuation.separator.array,punctuation.section.property-list.begin.bracket.curly, punctuation.section.property-list.end.bracket.curly, punctuation.separator.statement</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#7a82da</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Delimiters</string>
<key>scope</key>
<string>none</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#383a42</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Operators</string>
<key>scope</key>
<string>keyword.operator</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#7a82da</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Keywords</string>
<key>scope</key>
<string>keyword, variable.language</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#0098dd</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Variables</string>
<key>scope</key>
<string>variable</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#383a42</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Functions</string>
<key>scope</key>
<string>entity.name.function, meta.require, support.function.any-method, meta.function-call</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#23974a</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Classes</string>
<key>scope</key>
<string>support.class, entity.name.class, entity.name.type.class,meta.class.instance,meta.class.inheritance, entity.other.inherited-class, entity.name.type</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#d52753</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Methods</string>
<key>scope</key>
<string>keyword.other.special-method</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#23974a</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Storage</string>
<key>scope</key>
<string>storage,constant.language</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#0098dd</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Support</string>
<key>scope</key>
<string>support.function</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#23974a</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Strings, Inherited Class</string>
<key>scope</key>
<string>string, constant.other.symbol, punctuation.definition.string,support.constant.property-value, string.quoted.double.shell</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#c5a332</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Integers</string>
<key>scope</key>
<string>constant.numeric</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ce33c0</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Floats</string>
<key>scope</key>
<string>none</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ce33c0</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Boolean</string>
<key>scope</key>
<string>none</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#0098dd</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Constants</string>
<key>scope</key>
<string>constant</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#823ff1</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Tags</string>
<key>scope</key>
<string>entity.name.tag, punctuation.definition.tag</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#275fe4</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Attribute IDs</string>
<key>scope</key>
<string>entity.other.attribute-name</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#df631c</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Selector</string>
<key>scope</key>
<string>meta.selector</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#7a82da</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Values</string>
<key>scope</key>
<string>none</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ce33c0</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Headings</string>
<key>scope</key>
<string>markup.heading, punctuation.definition.heading, entity.name.section, markup.heading.setext</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string></string>
<key>foreground</key>
<string>#c5a332</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Units</string>
<key>scope</key>
<string>keyword.other.unit</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#c5a332</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Bold</string>
<key>scope</key>
<string>markup.bold, punctuation.definition.bold</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>bold</string>
<key>foreground</key>
<string>#d52753</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Italic</string>
<key>scope</key>
<string>markup.italic, punctuation.definition.italic</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#df631c</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Code</string>
<key>scope</key>
<string>markup.raw.inline</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#c5a332</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Link Text</string>
<key>scope</key>
<string>string.other.link</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#275fe4</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Link Url</string>
<key>scope</key>
<string>meta.link</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#0098dd</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Lists</string>
<key>scope</key>
<string>beginning.punctuation.definition.list</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#a05a48</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Quotes</string>
<key>scope</key>
<string>markup.quote</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#823ff1</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Separator</string>
<key>scope</key>
<string>meta.separator</string>
<key>settings</key>
<dict>
<key>background</key>
<string>#d2ecff</string>
<key>foreground</key>
<string>#383a42</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Inserted</string>
<key>scope</key>
<string>markup.inserted</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#23974a</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Deleted</string>
<key>scope</key>
<string>markup.deleted</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#d52753</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Changed</string>
<key>scope</key>
<string>markup.changed</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#0098dd</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Colors</string>
<key>scope</key>
<string>constant.other.color, support.constant.color</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#c5a332</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Regular Expressions</string>
<key>scope</key>
<string>string.regexp</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#a05a48</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Escape Characters</string>
<key>scope</key>
<string>constant.character.escape</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#df631c</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Embedded</string>
<key>scope</key>
<string>punctuation.section.embedded, variable.interpolation</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#0098dd</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Illegal</string>
<key>scope</key>
<string>invalid</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ff0000</string>
<key>background</key>
<string>#d2ecff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Support Constant</string>
<key>scope</key>
<string>support.constant</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#a05a48</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>New Operator</string>
<key>scope</key>
<string>keyword.operator.new</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#0098dd</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Css ID</string>
<key>scope</key>
<string>entity.other.attribute-name.id</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#d52753</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Function Parameters</string>
<key>scope</key>
<string>meta.function-call.arguments</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#383a42</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Object Properties</string>
<key>scope</key>
<string>meta.object-literal.key, meta.object.member, support.type.property-name, entity.name.tag.yaml, constant.other.key,constant.other.object.key.js,string.unquoted.label.js</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#a05a48</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Markup Code</string>
<key>scope</key>
<string>markup.inline.raw, markup.fenced_code.block, markup.raw.block</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#a05a48</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Markup Link Image</string>
<key>scope</key>
<string>markup.underline.link.image</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#23974a</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Variable Parameter</string>
<key>scope</key>
<string>variable.parameter</string>
<key>settings</key>
<dict></dict>
</dict>
<dict>
<key>name</key>
<string>Type Primitive</string>
<key>scope</key>
<string>support.type.primitive</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#0098dd</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>BASH: Command Substitution</string>
<key>scope</key>
<string>string.interpolated.dollar.shell</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#d52753</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>BASH: Math Operation</string>
<key>scope</key>
<string>string.other.math.shell</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#275fe4</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>BASH: Substitution</string>
<key>scope</key>
<string>punctuation.definition.string.begin.shell, punctuation.definition.string.end.shell</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#7a82da</string>
</dict>
</dict>
</array>
<key>uuid</key>
<string>uuid</string>
</dict>
</plist>

21
report/utils.typ Normal file
View File

@@ -0,0 +1,21 @@
#let include-offset(what) = context {
let current-offset = heading.offset
set heading(offset: current-offset + 1)
include what
}
#let quote-block(width: 10cm, who, what) = {
set par(justify: false)
align(
right,
block(
width: width,
inset: (bottom: 1cm),
quote(
attribution: who,
block: true,
what
)
)
)
}

58
summary/exec_summary.typ Normal file
View File

@@ -0,0 +1,58 @@
// ___ ____ ____ _ _ _____ ___
// |_ _/ ___| / ___| | | | | ____|_ _| Informatique et
// | |\___ \| | ___ | |_| | _| | | systèmes de communication
// | | ___) | |__|___| | _ | |___ | | HEI Sion · HES-SO Valais / mui 24-26
// |___|____/ \____| |_| |_|_____|___|
//
// 52 65 61 64 69 6e 67 20 68 65 78 20 66 6f 72 20 66 75 6e 3f 20 49 53 43 20 66 6f 72 65 76 65 72
//
// Adapted from the BFH year book idea at https://www.bfh.ch/dam/jcr:e512ae31-a3ed-4b65-b589-870383d794b0/abschlussarbeiten-bsc-informatik.pdf
#import "@preview/isc-hei-exec-summary:0.8.1" : *
#import "../meta.typ"
// Must be <= 365 characters long.
#let summary = "Midas is cool!" // TODO
#assert(
summary.len() <= 365,
message: "Summary too long: len() > 365"
)
#let content = [
#todo[]
#lorem-pars(500)
#colbreak()
#lorem-pars(500)
]
#show: exec-summary.with(
title: meta.title,
subtitle: meta.subtitle,
language: "en",
authors: meta.authors,
student-picture: image("figs/me.jpg"), // TODO: replace
permanent-email: meta.permanent-email,
video-url: meta.video-url,
picture-web-opt-out: meta.picture-web-opt-out,
email-web-opt-out: meta.email-web-opt-out,
summary: summary,
content: content,
thesis-supervisor: meta.thesis-supervisor,
thesis-co-supervisor: meta.thesis-co-supervisor,
thesis-expert: meta.thesis-expert,
academic-year: meta.academic-year,
school: meta.school,
programme: meta.programme,
keywords: meta.keywords,
major : meta.major,
bind: right, // Bind the left side of the page
footer: none, //align(right, text(0.9em)[This is some content for the footer])
)

BIN
summary/figs/me.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 752 KiB