chore: started working on the report
This commit is contained in:
commit
22b0abdba7
96
.drone.yml
Normal file
96
.drone.yml
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
---
|
||||||
|
kind: pipeline
|
||||||
|
type: exec
|
||||||
|
name: Build and deploy
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Linting
|
||||||
|
commands:
|
||||||
|
- bash linting.sh
|
||||||
|
|
||||||
|
- name: Build UPDS-1
|
||||||
|
commands:
|
||||||
|
- cd upds-1
|
||||||
|
- pdflatex UPDS12-1.tex
|
||||||
|
# Prepare bib
|
||||||
|
- /usr/bin/vendor_perl/biber UPDS12-1
|
||||||
|
# Compile twice for the table of contents and for bib text
|
||||||
|
- pdflatex UPDS12-1.tex
|
||||||
|
- cd -
|
||||||
|
|
||||||
|
- name: Build UPDS-2
|
||||||
|
commands:
|
||||||
|
- cd upds-2
|
||||||
|
- pdflatex UPDS12-2.tex
|
||||||
|
# Prepare bib
|
||||||
|
- /usr/bin/vendor_perl/biber UPDS12-2
|
||||||
|
# Compile twice for the table of contents and for bib text
|
||||||
|
- pdflatex UPDS12-2.tex
|
||||||
|
- cd -
|
||||||
|
|
||||||
|
- name: Build Report
|
||||||
|
commands:
|
||||||
|
- cd report
|
||||||
|
- cp ../upds-1/UPDS-content.tex UPDS-1-content.tex
|
||||||
|
- cp ../upds-2/UPDS-content.tex UPDS-2-content.tex
|
||||||
|
- pdflatex report.tex
|
||||||
|
# Prepare bib
|
||||||
|
- /usr/bin/vendor_perl/biber report
|
||||||
|
# Compile twice for the table of contents and for bib text
|
||||||
|
- pdflatex report.tex
|
||||||
|
- cd -
|
||||||
|
|
||||||
|
- name: Build Poster
|
||||||
|
commands:
|
||||||
|
- cd poster
|
||||||
|
- echo -e "\n\n\nFirst 1\n\n\n"
|
||||||
|
- pdflatex poster.tex || cat poster.log
|
||||||
|
# Prepare bib
|
||||||
|
- echo -e "\n\n\nFirst 2\n\n\n"
|
||||||
|
- /usr/bin/vendor_perl/biber poster
|
||||||
|
# Compile twice for the table of contents and for bib text
|
||||||
|
- echo -e "\n\n\nFirst 3\n\n\n"
|
||||||
|
- pdflatex poster.tex
|
||||||
|
- cd -
|
||||||
|
|
||||||
|
- name: Generate text
|
||||||
|
commands:
|
||||||
|
- pnpm i
|
||||||
|
- pnpm ts-node main.ts report/report.tex
|
||||||
|
|
||||||
|
- name: gitea_release
|
||||||
|
environment:
|
||||||
|
TOKEN:
|
||||||
|
from_secret: token
|
||||||
|
commands:
|
||||||
|
- tea login add --url https://git.andr3h3nriqu3s.com --token "$TOKEN"
|
||||||
|
- tea r rm -y current || echo "Release not found"
|
||||||
|
- tea r c --title "Latest Report" --asset report/report.pdf --asset upds-1/UPDS12-1.pdf --asset upds-2/UPDS12-2.pdf --asset results.txt --asset poster/poster.pdf current
|
||||||
|
|
||||||
|
- name: Remove current on failure
|
||||||
|
environment:
|
||||||
|
TOKEN:
|
||||||
|
from_secret: token
|
||||||
|
commands:
|
||||||
|
- tea login add --url https://git.andr3h3nriqu3s.com --token "$TOKEN"
|
||||||
|
- tea r rm -y current || echo "Release not found"
|
||||||
|
trigger:
|
||||||
|
status:
|
||||||
|
- failure
|
||||||
|
when:
|
||||||
|
status:
|
||||||
|
- failure
|
||||||
|
|
||||||
|
#- name: latest
|
||||||
|
# environment:
|
||||||
|
# TOKEN:
|
||||||
|
# from_secret: token
|
||||||
|
# commands:
|
||||||
|
# - tea r rm -y "3rd-metting" || echo "Release not found"
|
||||||
|
# - tea r c --title "Last Metting Report" --asset report/report.pdf --asset upds-1/UPDS12-1.pdf --asset upds-2/UPDS12-2.pdf "3rd-metting"
|
||||||
|
|
||||||
|
trigger:
|
||||||
|
branch:
|
||||||
|
- main
|
||||||
|
node:
|
||||||
|
lights: builder
|
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
*.pdf
|
||||||
|
.DS_store
|
||||||
|
!report/Placement Report and Presentation Company Confidentiality (Required).pdf
|
||||||
|
node_modules
|
31
linting.sh
Normal file
31
linting.sh
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
if grep "codding" -R . --exclude=linting.sh; then
|
||||||
|
echo 'Found codding'
|
||||||
|
grep "codding" -R . --exclude=linting.sh
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if grep " sky " -R . --exclude=linting.sh; then
|
||||||
|
echo 'Found " sky " this is probably wrong'
|
||||||
|
grep " sky " -R . --exclude=linting.sh
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if grep " devolving " -R . --exclude=linting.sh; then
|
||||||
|
echo 'Found " devolving " this is probably wrong'
|
||||||
|
grep " devolving " -R . --exclude=linting.sh
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if grep " prof " -R . --exclude=linting.sh; then
|
||||||
|
echo 'Found " prof " this is probably wrong'
|
||||||
|
grep " prof " -R . --exclude=linting.sh
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if grep " codded " -R . --exclude=linting.sh; then
|
||||||
|
echo 'Found " codded " this is probably wrong'
|
||||||
|
grep " codded " -R . --exclude=linting.sh
|
||||||
|
exit 1
|
||||||
|
fi
|
289
main.bib
Normal file
289
main.bib
Normal file
@ -0,0 +1,289 @@
|
|||||||
|
@misc{confluence,
|
||||||
|
author = {Atlassian},
|
||||||
|
title = {{C}onfluence | {Y}our {R}emote-{F}riendly {T}eam {W}orkspace | {A}tlassian --- atlassian.com},
|
||||||
|
howpublished = {\url{https://www.atlassian.com/software/confluence}},
|
||||||
|
year = {},
|
||||||
|
note = {(Accessed 26-Jun-2023)},
|
||||||
|
}
|
||||||
|
@misc{jira,
|
||||||
|
author = {Atlassian},
|
||||||
|
title = {{J}ira | {I}ssue \& {P}roject {T}racking {S}oftware | {A}tlassian --- atlassian.com},
|
||||||
|
howpublished = {\url{https://www.atlassian.com/software/jira}},
|
||||||
|
year = {},
|
||||||
|
note = {(Accessed 26-Jun-2023)},
|
||||||
|
}
|
||||||
|
@misc{ldap,
|
||||||
|
series = {Request for Comments},
|
||||||
|
number = 5058,
|
||||||
|
howpublished = {RFC 5058},
|
||||||
|
publisher = {RFC Editor},
|
||||||
|
doi = {10.17487/RFC5058},
|
||||||
|
url = {https://www.rfc-editor.org/info/rfc5058},
|
||||||
|
author = {Dirk Ooms and Nancy Feldman and Yuji Imai and Wim P. Livens and Dr. Richard H. Boivie},
|
||||||
|
title = {{Explicit Multicast (Xcast) Concepts and Options}},
|
||||||
|
pagetotal = 35,
|
||||||
|
year = 2007,
|
||||||
|
month = nov,
|
||||||
|
abstract = {While traditional IP multicast schemes (RFC 1112) are scalable for very large multicast groups, they have scalability issues with a very large number of distinct multicast groups. This document describes Xcast (Explicit Multi-unicast), a new multicast scheme with complementary scaling properties: Xcast supports a very large number of small multicast sessions. Xcast achieves this by explicitly encoding the list of destinations in the data packets, instead of using a multicast group address. This document discusses Xcast concepts and options in several areas; it does not provide a complete technical specification. This memo defines an Experimental Protocol for the Internet community.},
|
||||||
|
}
|
||||||
|
@misc{sky,
|
||||||
|
author = {},
|
||||||
|
title = {{S}ky {G}roup - {E}urope’s leading direct-to-consumer media and entertainment company --- skygroup.sky},
|
||||||
|
howpublished = {\url{https://www.skygroup.sky}},
|
||||||
|
year = {},
|
||||||
|
note = {(Accessed 26-Jun-2023)},
|
||||||
|
}
|
||||||
|
@misc{gitlab,
|
||||||
|
author = {},
|
||||||
|
title = {The DevSecOps Platform | GitLab},
|
||||||
|
howpublished = {\url{https://about.gitlab.com/}},
|
||||||
|
month = {},
|
||||||
|
year = {},
|
||||||
|
note = {(Accessed on 06/26/2023)}
|
||||||
|
}
|
||||||
|
@misc{jenkins,
|
||||||
|
author = {},
|
||||||
|
title = {Jenkins},
|
||||||
|
howpublished = {\url{https://www.jenkins.io/}},
|
||||||
|
month = {},
|
||||||
|
year = {},
|
||||||
|
note = {(Accessed on 06/26/2023)}
|
||||||
|
}
|
||||||
|
@misc{ansible,
|
||||||
|
author = {},
|
||||||
|
title = {Ansible is Simple IT Automation},
|
||||||
|
howpublished = {\url{https://www.ansible.com/}},
|
||||||
|
month = {},
|
||||||
|
year = {},
|
||||||
|
note = {(Accessed on 06/26/2023)}
|
||||||
|
}
|
||||||
|
@misc{grafana,
|
||||||
|
author = {},
|
||||||
|
title = {Grafana: The open observability platform | Grafana Labs},
|
||||||
|
howpublished = {\url{https://grafana.com/}},
|
||||||
|
month = {},
|
||||||
|
year = {},
|
||||||
|
note = {(Accessed on 06/26/2023)}
|
||||||
|
}
|
||||||
|
@misc{ffmpeg,
|
||||||
|
author = {},
|
||||||
|
title = {FFmpeg},
|
||||||
|
howpublished = {\url{https://ffmpeg.org/}},
|
||||||
|
month = {},
|
||||||
|
year = {},
|
||||||
|
note = {(Accessed on 06/26/2023)}
|
||||||
|
}
|
||||||
|
@misc{keepass,
|
||||||
|
author = {},
|
||||||
|
title = {KeePassXC Password Manager},
|
||||||
|
howpublished = {\url{https://keepassxc.org/}},
|
||||||
|
month = {},
|
||||||
|
year = {},
|
||||||
|
note = {(Accessed on 06/26/2023)}
|
||||||
|
}
|
||||||
|
@misc{cyberark,
|
||||||
|
author = {},
|
||||||
|
title = {Identity Security and Access Management Leader | CyberArk},
|
||||||
|
howpublished = {\url{https://www.cyberark.com/}},
|
||||||
|
month = {},
|
||||||
|
year = {},
|
||||||
|
note = {(Accessed on 06/26/2023)}
|
||||||
|
}
|
||||||
|
@misc{docker,
|
||||||
|
author = {},
|
||||||
|
title = {Docker: Accelerated, Containerized Application Development},
|
||||||
|
howpublished = {\url{https://www.docker.com/}},
|
||||||
|
month = {},
|
||||||
|
year = {},
|
||||||
|
note = {(Accessed on 06/26/2023)}
|
||||||
|
}
|
||||||
|
@misc{opsview,
|
||||||
|
author = {},
|
||||||
|
title = {Opsview > Monitoring},
|
||||||
|
month = {},
|
||||||
|
year = {},
|
||||||
|
% TODO check this later
|
||||||
|
note = {Image generated, (Accessed on 06/29/2023), not accessible outside Sky UK}
|
||||||
|
}
|
||||||
|
@misc{grafana_charts,
|
||||||
|
author = {},
|
||||||
|
title = {Grafana - Files in Flight Dashboard Graphs},
|
||||||
|
month = {},
|
||||||
|
year = {},
|
||||||
|
% TODO check this later
|
||||||
|
note = {Screenshot of the page, (Accessed on 06/29/2023), not accessible outside Sky UK}
|
||||||
|
}
|
||||||
|
@misc{actual-intake,
|
||||||
|
author = {},
|
||||||
|
title = {Dashboard [Jenkins]},
|
||||||
|
month = {},
|
||||||
|
year = {},
|
||||||
|
note = {Screenshot of the page, (Accessed on 06/29/2023), not accessible outside Sky UK}
|
||||||
|
}
|
||||||
|
@misc{test-intake,
|
||||||
|
author = {},
|
||||||
|
title = {Dashboard [Jenkins]},
|
||||||
|
howpublished = {},
|
||||||
|
month = {},
|
||||||
|
year = {},
|
||||||
|
note = {Screenshot of the page locally hosted page, (Accessed on 06/29/2023), not accessible}
|
||||||
|
}
|
||||||
|
@misc{spoglight-api,
|
||||||
|
author = {},
|
||||||
|
title = {Swagger UI},
|
||||||
|
month = {},
|
||||||
|
year = {},
|
||||||
|
note = {Screenshot of the page, (Accessed on 06/29/2023), not accessible outside Sky UK}
|
||||||
|
}
|
||||||
|
@misc{spotlight,
|
||||||
|
author = {},
|
||||||
|
title = {Spotlight},
|
||||||
|
month = {},
|
||||||
|
year = {},
|
||||||
|
note = {Screenshot of the page, (Accessed on 06/29/2023), not accessible outside Sky UK}
|
||||||
|
}
|
||||||
|
@misc{spog,
|
||||||
|
author = {},
|
||||||
|
title = {Spog},
|
||||||
|
month = {},
|
||||||
|
year = {},
|
||||||
|
note = {Screenshot of the page, (Accessed on 06/29/2023), not accessible outside Sky UK}
|
||||||
|
}
|
||||||
|
@misc{spog-report,
|
||||||
|
author = {},
|
||||||
|
title = {Spog},
|
||||||
|
month = {},
|
||||||
|
year = {},
|
||||||
|
note = {Screenshot of the page, (Accessed on 06/29/2023), not accessible outside Sky UK}
|
||||||
|
}
|
||||||
|
@misc{launchpad,
|
||||||
|
author = {},
|
||||||
|
title = {Launchpad page},
|
||||||
|
month = {},
|
||||||
|
year = {},
|
||||||
|
note = {Screenshot of the page, (Accessed on 06/29/2023), not accessible outside Sky UK}
|
||||||
|
}
|
||||||
|
@misc{launchpad-code,
|
||||||
|
author = {Andre Henriques},
|
||||||
|
title = {Screenshot of the Code},
|
||||||
|
}
|
||||||
|
@misc{devops-vault,
|
||||||
|
author = {},
|
||||||
|
title = {Devops Vault},
|
||||||
|
howpublished = {},
|
||||||
|
month = {},
|
||||||
|
year = {},
|
||||||
|
note = {Screenshot of the page locally hosted page, (Accessed on 06/29/2023), not accessible}
|
||||||
|
}
|
||||||
|
@misc{typescript,
|
||||||
|
author = {},
|
||||||
|
title = {TypeScript: JavaScript With Syntax For Types.},
|
||||||
|
howpublished = {\url{https://www.typescriptlang.org/}},
|
||||||
|
month = {},
|
||||||
|
year = {},
|
||||||
|
note = {(Accessed on 08/07/2023)}
|
||||||
|
}
|
||||||
|
@misc{react,
|
||||||
|
author = {},
|
||||||
|
title = {React},
|
||||||
|
howpublished = {\url{https://react.dev/}},
|
||||||
|
month = {},
|
||||||
|
year = {},
|
||||||
|
note = {(Accessed on 08/07/2023)}
|
||||||
|
}
|
||||||
|
@misc{prisma,
|
||||||
|
author = {},
|
||||||
|
title = {Prisma | Next-generation ORM for Node.js \& TypeScript},
|
||||||
|
howpublished = {\url{https://www.prisma.io/}},
|
||||||
|
month = {},
|
||||||
|
year = {},
|
||||||
|
note = {(Accessed on 08/07/2023)}
|
||||||
|
}
|
||||||
|
@misc{postgres,
|
||||||
|
author = {},
|
||||||
|
title = {PostgreSQL: The world's most advanced open source database},
|
||||||
|
howpublished = {\url{https://www.postgresql.org/}},
|
||||||
|
month = {},
|
||||||
|
year = {},
|
||||||
|
note = {(Accessed on 08/07/2023)}
|
||||||
|
}
|
||||||
|
@misc{nginx,
|
||||||
|
author = {},
|
||||||
|
title = {Advanced Load Balancer, Web Server, \& Reverse Proxy - NGINX},
|
||||||
|
howpublished = {\url{https://www.nginx.com/}},
|
||||||
|
month = {},
|
||||||
|
year = {},
|
||||||
|
note = {(Accessed on 08/07/2023)}
|
||||||
|
}
|
||||||
|
@misc{dockerlogo,
|
||||||
|
author = {},
|
||||||
|
title = {Press and Media Resources - Docker},
|
||||||
|
howpublished = {\url{https://www.docker.com/company/newsroom/media-resources/}},
|
||||||
|
month = {},
|
||||||
|
year = {},
|
||||||
|
note = {(Accessed on 08/10/2023)}
|
||||||
|
}
|
||||||
|
@misc{jenkinslogo,
|
||||||
|
author = {},
|
||||||
|
title = {jenkins.png (742×1024)},
|
||||||
|
howpublished = {\url{https://www.jenkins.io/images/logos/jenkins/jenkins.png}},
|
||||||
|
month = {},
|
||||||
|
year = {},
|
||||||
|
note = {(Accessed on 08/10/2023)}
|
||||||
|
}
|
||||||
|
@misc{typescriptlogo,
|
||||||
|
author = {},
|
||||||
|
title = {TypeScript: Branding},
|
||||||
|
howpublished = {\url{https://www.typescriptlang.org/branding/}},
|
||||||
|
month = {},
|
||||||
|
year = {},
|
||||||
|
note = {(Accessed on 08/10/2023)}
|
||||||
|
}
|
||||||
|
@misc{ansiblelogo,
|
||||||
|
author = {},
|
||||||
|
title = {logos/logos/ansible.svg at main · gilbarbara/logos},
|
||||||
|
howpublished = {\url{https://github.com/gilbarbara/logos/blob/main/logos/ansible.svg}},
|
||||||
|
month = {},
|
||||||
|
year = {},
|
||||||
|
note = {(Accessed on 08/10/2023)}
|
||||||
|
}
|
||||||
|
@misc{reactlogo,
|
||||||
|
author = {},
|
||||||
|
title = {React},
|
||||||
|
howpublished = {\url{https://react.dev/}},
|
||||||
|
month = {},
|
||||||
|
year = {},
|
||||||
|
note = {(Accessed on 08/10/2023)}
|
||||||
|
}
|
||||||
|
@misc{gitlablogo,
|
||||||
|
author = {},
|
||||||
|
title = {Press kit | GitLab},
|
||||||
|
howpublished = {\url{https://about.gitlab.com/press/press-kit/}},
|
||||||
|
month = {},
|
||||||
|
year = {},
|
||||||
|
note = {(Accessed on 08/10/2023)}
|
||||||
|
}
|
||||||
|
@misc{atlassianlogo,
|
||||||
|
author = {},
|
||||||
|
title = {Logo library - Resources - Atlassian Design System},
|
||||||
|
howpublished = {\url{https://atlassian.design/resources/logo-library}},
|
||||||
|
month = {},
|
||||||
|
year = {},
|
||||||
|
note = {(Accessed on 08/10/2023)}
|
||||||
|
}
|
||||||
|
@misc{flasklogo,
|
||||||
|
author = {},
|
||||||
|
title = {Welcome to Flask — Flask Documentation (1.1.x)},
|
||||||
|
howpublished = {\url{https://flask.palletsprojects.com/en/1.1.x/}},
|
||||||
|
month = {},
|
||||||
|
year = {},
|
||||||
|
note = {(Accessed on 08/10/2023)}
|
||||||
|
}
|
||||||
|
@misc{skyaboutus,
|
||||||
|
author = {},
|
||||||
|
title = {About Us | Sky Group},
|
||||||
|
howpublished = {\url{https://www.skygroup.sky/about-us}},
|
||||||
|
month = {},
|
||||||
|
year = {},
|
||||||
|
note = {(Accessed on 08/10/2023)}
|
||||||
|
}
|
400
main.ts
Normal file
400
main.ts
Normal file
@ -0,0 +1,400 @@
|
|||||||
|
import process, { stdout } from 'node:process';
|
||||||
|
import fs from 'fs/promises';
|
||||||
|
import { FileHandle } from 'node:fs/promises';
|
||||||
|
import nPath from 'node:path';
|
||||||
|
|
||||||
|
type Command = {
|
||||||
|
type: 'command'
|
||||||
|
start: number;
|
||||||
|
text: string;
|
||||||
|
name: string;
|
||||||
|
options: Text[];
|
||||||
|
inner: Text[];
|
||||||
|
};
|
||||||
|
|
||||||
|
type Comment = {
|
||||||
|
type: 'comment'
|
||||||
|
start: number;
|
||||||
|
text: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
type Range = {
|
||||||
|
type: 'range'
|
||||||
|
start: number;
|
||||||
|
text: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
type Token = Command | Range | Comment;
|
||||||
|
|
||||||
|
type Text = {
|
||||||
|
start: number,
|
||||||
|
tokens: Token[];
|
||||||
|
};
|
||||||
|
|
||||||
|
function processComment(data: string, start: number): {comment: Comment, i: number} {
|
||||||
|
|
||||||
|
let comment: Comment = {
|
||||||
|
type: 'comment',
|
||||||
|
start,
|
||||||
|
text: "",
|
||||||
|
};
|
||||||
|
|
||||||
|
for (let i = start; i < data.length; i++) {
|
||||||
|
const char = data[i];
|
||||||
|
comment.text += char;
|
||||||
|
if (char == '\n')
|
||||||
|
return {comment, i};
|
||||||
|
}
|
||||||
|
|
||||||
|
return {comment, i: data.length - 1};
|
||||||
|
}
|
||||||
|
|
||||||
|
function isValid(test: string) {
|
||||||
|
return test.match(/[a-zA-Z_\\*]/);
|
||||||
|
}
|
||||||
|
|
||||||
|
function processCommand(data: string, start: number): {command: Command, i: number} {
|
||||||
|
let command: Command = {
|
||||||
|
type: 'command',
|
||||||
|
start,
|
||||||
|
text: "/",
|
||||||
|
name: "",
|
||||||
|
options: [],
|
||||||
|
inner: [],
|
||||||
|
};
|
||||||
|
|
||||||
|
start++;
|
||||||
|
|
||||||
|
for (let i = start; i < data.length; i++) {
|
||||||
|
const char = data[i]
|
||||||
|
|
||||||
|
if (char == '[') {
|
||||||
|
if (!command.name)
|
||||||
|
command.name = data.substring(command.start + 1, i);
|
||||||
|
const {text, i: tempI} = processText(data, i, ']', true)
|
||||||
|
i = tempI;
|
||||||
|
command.options.push(text);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (char == '{') {
|
||||||
|
if (!command.name)
|
||||||
|
command.name = data.substring(command.start + 1, i);
|
||||||
|
const {text, i: tempI} = processText(data, i, '}', true);
|
||||||
|
i = tempI;
|
||||||
|
command.inner.push(text);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isValid(char)) {
|
||||||
|
if (!command.name)
|
||||||
|
command.name = data.substring(command.start + 1, i);
|
||||||
|
return {command, i: i - 1};
|
||||||
|
}
|
||||||
|
|
||||||
|
command.text += char;
|
||||||
|
}
|
||||||
|
|
||||||
|
return {command, i: data.length - 1};
|
||||||
|
}
|
||||||
|
|
||||||
|
function processText(data: string, start: number = 0, delimiter: string = "", exclude = false): {text: Text, i: number} {
|
||||||
|
let text: Text = {
|
||||||
|
start,
|
||||||
|
tokens: [],
|
||||||
|
}
|
||||||
|
|
||||||
|
let range: Range = {
|
||||||
|
type: 'range',
|
||||||
|
start,
|
||||||
|
text: "",
|
||||||
|
};
|
||||||
|
|
||||||
|
if (exclude)
|
||||||
|
start++;
|
||||||
|
|
||||||
|
for (let i = start; i < data.length; i++) {
|
||||||
|
const char = String(data[i]);
|
||||||
|
//process.stdout.write(char);
|
||||||
|
|
||||||
|
if (delimiter == char) {
|
||||||
|
if (delimiter && !exclude)
|
||||||
|
range.text += char;
|
||||||
|
|
||||||
|
if (range.text.length > 0) {
|
||||||
|
text.tokens.push(range);
|
||||||
|
}
|
||||||
|
|
||||||
|
return {text, i: i + 1};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (char == '%') {
|
||||||
|
if (range.text.length > 0) {
|
||||||
|
text.tokens.push(range);
|
||||||
|
}
|
||||||
|
|
||||||
|
let {comment, i: tempI} = processComment(data, i);
|
||||||
|
|
||||||
|
i = tempI;
|
||||||
|
|
||||||
|
text.tokens.push(comment);
|
||||||
|
|
||||||
|
range = {
|
||||||
|
type: 'range',
|
||||||
|
start: i,
|
||||||
|
text: "",
|
||||||
|
};
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (char == '\\') {
|
||||||
|
if (range.text.length > 0) {
|
||||||
|
text.tokens.push(range);
|
||||||
|
}
|
||||||
|
|
||||||
|
let {command, i: tempI} = processCommand(data, i);
|
||||||
|
|
||||||
|
i = tempI;
|
||||||
|
|
||||||
|
text.tokens.push(command);
|
||||||
|
|
||||||
|
range = {
|
||||||
|
type: 'range',
|
||||||
|
start: i,
|
||||||
|
text: ""
|
||||||
|
};
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
range.text += char;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (delimiter) {
|
||||||
|
throw new Error(`Delimiter '${delimiter}'`);
|
||||||
|
}
|
||||||
|
|
||||||
|
return {text, i: data.length - 1, };
|
||||||
|
}
|
||||||
|
|
||||||
|
async function main() {
|
||||||
|
|
||||||
|
if (process.argv.length < 3) {
|
||||||
|
console.error("Not enogh arguments");
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
const path = process.argv[2];
|
||||||
|
const basePath =nPath.dirname(path);
|
||||||
|
|
||||||
|
const stat = await fs.stat(path);
|
||||||
|
|
||||||
|
if (!stat.isFile()) {
|
||||||
|
console.error(`'${path}' is not a file`);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
const data = (await fs.readFile(path)).toString();
|
||||||
|
|
||||||
|
let {text} = processText(data);
|
||||||
|
|
||||||
|
const file = (await fs.open('results.txt', 'w'));
|
||||||
|
|
||||||
|
await printText(text, file, basePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
function printItemize(text: Text, file: FileHandle, start: number): number {
|
||||||
|
for (let i = start; i < text.tokens.length; i++) {
|
||||||
|
const token = text.tokens[i];
|
||||||
|
|
||||||
|
if (token.type == 'range') {
|
||||||
|
file.write(token.text);
|
||||||
|
continue;
|
||||||
|
} else if (token.type == 'command') {
|
||||||
|
if (token.name == 'item') {
|
||||||
|
file.write('- ');
|
||||||
|
} else if (token.name == 'end') {
|
||||||
|
const inner = token.inner[0].tokens[0].text;
|
||||||
|
|
||||||
|
if (inner == 'itemize') {
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log('Do not know how to handle!');
|
||||||
|
console.log(token);
|
||||||
|
process.exit(1);
|
||||||
|
} else {
|
||||||
|
console.log('Do not know how to handle!');
|
||||||
|
console.log(token);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
} else if (token.type == 'comment') {
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
|
console.log('Do not know how to handle token type!');
|
||||||
|
console.log(token);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new Error('Did not find end at itemize!');
|
||||||
|
}
|
||||||
|
|
||||||
|
async function printText(text: Text, file: FileHandle, basePath: string, foundStart: boolean = false, start: number = 0) {
|
||||||
|
for (let i = start; i < text.tokens.length; i++) {
|
||||||
|
const token = text.tokens[i];
|
||||||
|
|
||||||
|
if (!foundStart) {
|
||||||
|
|
||||||
|
if (token.type === 'command') {
|
||||||
|
|
||||||
|
if (token.name === 'begin') {
|
||||||
|
const inner = token.inner[0].tokens[0].text;
|
||||||
|
if (inner === 'document') {
|
||||||
|
foundStart = true;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (token.type === 'command') {
|
||||||
|
|
||||||
|
let inner: string | undefined = undefined;
|
||||||
|
|
||||||
|
switch (token.name) {
|
||||||
|
case 'includepdf':
|
||||||
|
case 'maketitle':
|
||||||
|
case 'newpage':
|
||||||
|
case 'tableofcontents':
|
||||||
|
case 'printbibliography':
|
||||||
|
case 'supercite':
|
||||||
|
case 'includegraphics':
|
||||||
|
case 'vspace*':
|
||||||
|
continue;
|
||||||
|
case 'cref':
|
||||||
|
file.write('Fig. 1');
|
||||||
|
continue;
|
||||||
|
|
||||||
|
case 'section':
|
||||||
|
case 'section*':
|
||||||
|
inner = token.inner[0]?.tokens[0]?.text;
|
||||||
|
|
||||||
|
if (!inner) {
|
||||||
|
console.log(token);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
file.write('# ' + inner + '\n');
|
||||||
|
continue;
|
||||||
|
|
||||||
|
case 'subsection':
|
||||||
|
case 'subsection*':
|
||||||
|
inner = token.inner[0].tokens[0].text;
|
||||||
|
|
||||||
|
file.write('## ' + inner + '\n');
|
||||||
|
continue;
|
||||||
|
|
||||||
|
case 'subsubsection':
|
||||||
|
inner = token.inner[0].tokens[0].text;
|
||||||
|
file.write('## ' + inner + '\n');
|
||||||
|
continue;
|
||||||
|
|
||||||
|
case 'input':
|
||||||
|
inner = token.inner[0].tokens[0].text;
|
||||||
|
|
||||||
|
const path = basePath + '/' + inner + '.tex';
|
||||||
|
|
||||||
|
const nData = (await fs.readFile(path)).toString();
|
||||||
|
|
||||||
|
const {text: nText} = processText(nData);
|
||||||
|
|
||||||
|
await printText(nText, file, basePath, true);
|
||||||
|
continue;
|
||||||
|
|
||||||
|
case 'begin':
|
||||||
|
inner = token.inner[0].tokens[0].text;
|
||||||
|
|
||||||
|
switch(inner) {
|
||||||
|
case "figure":
|
||||||
|
case "minipage":
|
||||||
|
case "tabularx":
|
||||||
|
i = findEnd(inner, text, i);
|
||||||
|
continue;
|
||||||
|
|
||||||
|
case "itemize":
|
||||||
|
i = printItemize(text, file, i + 1);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log('Do not know how to handle begin', inner);
|
||||||
|
process.exit(1);
|
||||||
|
|
||||||
|
case 'end':
|
||||||
|
inner = token.inner[0].tokens[0].text;
|
||||||
|
|
||||||
|
if (inner === 'document') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log('Do not know how to handle end', inner);
|
||||||
|
process.exit(1);
|
||||||
|
|
||||||
|
case 'verb':
|
||||||
|
|
||||||
|
const nextToken = text.tokens[i + 1];
|
||||||
|
const pText = nextToken?.text;
|
||||||
|
|
||||||
|
if (!pText) {
|
||||||
|
console.log('Something wrong!');
|
||||||
|
console.log(token);
|
||||||
|
console.log(nextToken);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
let j = 1;
|
||||||
|
|
||||||
|
for (;j < nextToken.text.length;j++) {
|
||||||
|
if (nextToken.text[j] == '+') {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
i++;
|
||||||
|
|
||||||
|
file.write(nextToken.text.substring(1, j));
|
||||||
|
file.write(nextToken.text.substring(j + 1));
|
||||||
|
continue;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("Don't know how to handle", token.name);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (token.type === 'range') {
|
||||||
|
file.write(token.text);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function findEnd(target: string, text: Text, start: number): number {
|
||||||
|
for (let i = start; i < text.tokens.length; i++) {
|
||||||
|
const token = text.tokens[i];
|
||||||
|
|
||||||
|
if (token.type === 'command') {
|
||||||
|
if (token.name !== 'end') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
const inner = token.inner[0].tokens[0].text;
|
||||||
|
|
||||||
|
if (inner == target) {
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new Error('Could not find end for ' + target);
|
||||||
|
}
|
||||||
|
|
||||||
|
main();
|
12
notes.txt
Normal file
12
notes.txt
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
Change title to Sky -> Sky UK Limited
|
||||||
|
Say something about diferent devisions at Sky
|
||||||
|
Add pictures of campus
|
||||||
|
Change pictures to make readble
|
||||||
|
Make sure the images have references
|
||||||
|
Subscript images
|
||||||
|
Make better distigisable bettween projects and case sutdies
|
||||||
|
new pages bettween sections
|
||||||
|
more details in the case studies less in the naratives
|
||||||
|
in cases studies talked about problems that I had to over come
|
||||||
|
|
||||||
|
https://www.youtube.com/watch?v=PKfR6bAXr-c
|
16
package.json
Normal file
16
package.json
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
"name": "placement-year-docs",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "",
|
||||||
|
"main": "index.js",
|
||||||
|
"scripts": {
|
||||||
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
|
},
|
||||||
|
"keywords": [],
|
||||||
|
"author": "",
|
||||||
|
"license": "ISC",
|
||||||
|
"dependencies": {
|
||||||
|
"@types/node": "^20.4.8",
|
||||||
|
"ts-node": "^10.9.1"
|
||||||
|
}
|
||||||
|
}
|
132
pnpm-lock.yaml
Normal file
132
pnpm-lock.yaml
Normal file
@ -0,0 +1,132 @@
|
|||||||
|
lockfileVersion: '6.0'
|
||||||
|
|
||||||
|
settings:
|
||||||
|
autoInstallPeers: true
|
||||||
|
excludeLinksFromLockfile: false
|
||||||
|
|
||||||
|
dependencies:
|
||||||
|
'@types/node':
|
||||||
|
specifier: ^20.4.8
|
||||||
|
version: 20.4.8
|
||||||
|
ts-node:
|
||||||
|
specifier: ^10.9.1
|
||||||
|
version: 10.9.1(@types/node@20.4.8)(typescript@5.1.6)
|
||||||
|
|
||||||
|
packages:
|
||||||
|
|
||||||
|
/@cspotcode/source-map-support@0.8.1:
|
||||||
|
resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==}
|
||||||
|
engines: {node: '>=12'}
|
||||||
|
dependencies:
|
||||||
|
'@jridgewell/trace-mapping': 0.3.9
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/@jridgewell/resolve-uri@3.1.1:
|
||||||
|
resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==}
|
||||||
|
engines: {node: '>=6.0.0'}
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/@jridgewell/sourcemap-codec@1.4.15:
|
||||||
|
resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/@jridgewell/trace-mapping@0.3.9:
|
||||||
|
resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==}
|
||||||
|
dependencies:
|
||||||
|
'@jridgewell/resolve-uri': 3.1.1
|
||||||
|
'@jridgewell/sourcemap-codec': 1.4.15
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/@tsconfig/node10@1.0.9:
|
||||||
|
resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/@tsconfig/node12@1.0.11:
|
||||||
|
resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/@tsconfig/node14@1.0.3:
|
||||||
|
resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/@tsconfig/node16@1.0.4:
|
||||||
|
resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/@types/node@20.4.8:
|
||||||
|
resolution: {integrity: sha512-0mHckf6D2DiIAzh8fM8f3HQCvMKDpK94YQ0DSVkfWTG9BZleYIWudw9cJxX8oCk9bM+vAkDyujDV6dmKHbvQpg==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/acorn-walk@8.2.0:
|
||||||
|
resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==}
|
||||||
|
engines: {node: '>=0.4.0'}
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/acorn@8.10.0:
|
||||||
|
resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==}
|
||||||
|
engines: {node: '>=0.4.0'}
|
||||||
|
hasBin: true
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/arg@4.1.3:
|
||||||
|
resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/create-require@1.1.1:
|
||||||
|
resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/diff@4.0.2:
|
||||||
|
resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==}
|
||||||
|
engines: {node: '>=0.3.1'}
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/make-error@1.3.6:
|
||||||
|
resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/ts-node@10.9.1(@types/node@20.4.8)(typescript@5.1.6):
|
||||||
|
resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==}
|
||||||
|
hasBin: true
|
||||||
|
peerDependencies:
|
||||||
|
'@swc/core': '>=1.2.50'
|
||||||
|
'@swc/wasm': '>=1.2.50'
|
||||||
|
'@types/node': '*'
|
||||||
|
typescript: '>=2.7'
|
||||||
|
peerDependenciesMeta:
|
||||||
|
'@swc/core':
|
||||||
|
optional: true
|
||||||
|
'@swc/wasm':
|
||||||
|
optional: true
|
||||||
|
dependencies:
|
||||||
|
'@cspotcode/source-map-support': 0.8.1
|
||||||
|
'@tsconfig/node10': 1.0.9
|
||||||
|
'@tsconfig/node12': 1.0.11
|
||||||
|
'@tsconfig/node14': 1.0.3
|
||||||
|
'@tsconfig/node16': 1.0.4
|
||||||
|
'@types/node': 20.4.8
|
||||||
|
acorn: 8.10.0
|
||||||
|
acorn-walk: 8.2.0
|
||||||
|
arg: 4.1.3
|
||||||
|
create-require: 1.1.1
|
||||||
|
diff: 4.0.2
|
||||||
|
make-error: 1.3.6
|
||||||
|
typescript: 5.1.6
|
||||||
|
v8-compile-cache-lib: 3.0.1
|
||||||
|
yn: 3.1.1
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/typescript@5.1.6:
|
||||||
|
resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==}
|
||||||
|
engines: {node: '>=14.17'}
|
||||||
|
hasBin: true
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/v8-compile-cache-lib@3.0.1:
|
||||||
|
resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/yn@3.1.1:
|
||||||
|
resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==}
|
||||||
|
engines: {node: '>=6'}
|
||||||
|
dev: false
|
5
report/.gitignore
vendored
Normal file
5
report/.gitignore
vendored
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
*.log
|
||||||
|
*.aux
|
||||||
|
*.toc
|
||||||
|
UPDS-1-content.tex
|
||||||
|
UPDS-2-content.tex
|
65
report/report.tex
Normal file
65
report/report.tex
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
%%% Preamble
|
||||||
|
\documentclass[11pt, a4paper]{article}
|
||||||
|
|
||||||
|
\usepackage[english]{babel} % English language/hyphenation
|
||||||
|
\usepackage{url}
|
||||||
|
\usepackage{tabularx}
|
||||||
|
\usepackage{pdfpages}
|
||||||
|
\usepackage{float}
|
||||||
|
|
||||||
|
\usepackage{graphicx}
|
||||||
|
\graphicspath{ {../images for report/} }
|
||||||
|
|
||||||
|
\usepackage{hyperref}
|
||||||
|
\hypersetup{
|
||||||
|
colorlinks,
|
||||||
|
citecolor=black,
|
||||||
|
filecolor=black,
|
||||||
|
linkcolor=black,
|
||||||
|
urlcolor=black
|
||||||
|
}
|
||||||
|
|
||||||
|
\usepackage{cleveref}
|
||||||
|
|
||||||
|
%%% Custom headers/footers (fancyhdr package)
|
||||||
|
\usepackage{fancyhdr}
|
||||||
|
\pagestyle{fancyplain}
|
||||||
|
\fancyhead{} % No page header
|
||||||
|
\fancyfoot[L]{} % Empty
|
||||||
|
\fancyfoot[C]{\thepage} % Pagenumbering
|
||||||
|
\fancyfoot[R]{} % Empty
|
||||||
|
\renewcommand{\headrulewidth}{0pt} % Remove header underlines
|
||||||
|
\renewcommand{\footrulewidth}{0pt} % Remove footer underlines
|
||||||
|
\setlength{\headheight}{13.6pt}
|
||||||
|
|
||||||
|
\usepackage[style=numeric,sorting=none,backend=biber]{biblatex}
|
||||||
|
\addbibresource{../main.bib}
|
||||||
|
|
||||||
|
\title{
|
||||||
|
\normalfont \normalsize \textsc{University of Surrey} \\ %[25pt]
|
||||||
|
\Huge Final year project \\
|
||||||
|
}
|
||||||
|
\author{
|
||||||
|
\normalfont \normalsize
|
||||||
|
Andre Henriques\\[-3pt] \normalsize
|
||||||
|
\today
|
||||||
|
}
|
||||||
|
\date{}
|
||||||
|
|
||||||
|
%%% Begin document
|
||||||
|
\begin{document}
|
||||||
|
|
||||||
|
\maketitle
|
||||||
|
\newpage
|
||||||
|
|
||||||
|
\tableofcontents
|
||||||
|
\newpage
|
||||||
|
|
||||||
|
\section{Introduction}
|
||||||
|
|
||||||
|
\newpage
|
||||||
|
\section{References}
|
||||||
|
\printbibliography[heading=none]
|
||||||
|
|
||||||
|
% TODO add my job title
|
||||||
|
\end{document}
|
Loading…
Reference in New Issue
Block a user