diff --git a/docs/abstract.typst b/docs/abstract.typst deleted file mode 100644 index 0922e59..0000000 --- a/docs/abstract.typst +++ /dev/null @@ -1,55 +0,0 @@ -#pagebreak() - -#heading( - level: 1, - outlined: false, - numbering: none, - "Anotācija", -) - -Atmiņas kartītes (angl. flashcards) ir izplatīts veids, kā skolēni, -studenti un citi cilvēki, kas mācās vai studē, iegaumē materiālu. To veidošanai, -uzturēšanai un izmantošanai izmanto programmatūras risinājumus, taču -lielākoties neizmato pilnīgi caurspīdīgu vienkārša teksta formātu. Darbā -tiek aprakstīts risinājums, kas izmanto domēna specifisku valodu ar pilnīgu -informācijas glabāšanu vienkārša teksta failos. - -#par( - first-line-indent: 0cm, - [ - *Atslēgvārdi:* atmiņas kartītes, domēna specifiska valoda, vienkārša - teksts, apzīmēšanas valoda. - ], -) - -#text( - hyphenate: auto, - lang: "en", - [ - #pagebreak() - #heading( - level: 1, - outlined: false, - numbering: none, - "Abstract", - ) - - Flashcards are a common way for students to students and other studying - people memorize the material. To create them, software solutions are - used for maintenance and use, however most do not use a fully - transparent plain text format. This paper eplores a solution that uses a - domain-specific language with a complete is described information - storage using plain text files. - - #par( - first-line-indent: 0cm, - [ - *Keywords:* memory cards, domain specific language, simple text, markup - language. - ], - ) - - // EN keywords - - ], -) diff --git a/docs/img/ABDPD2.svg b/docs/img/ABDPD2.svg deleted file mode 100644 index 734b774..0000000 --- a/docs/img/ABDPD2.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - -
Kartīšu 
identifikācijas
dati
Kartīšu
identifikācijas dati
Kartīšu
pirmteksta dati
Kartīšu 
failu dati
Kartīšu
pirmteksta dati
Lappušu kartīšu
dati
Lappušu numuru
dati
Kartīšu failu
metadati
Lietotājs
Kārtīšu
failu dati
Failu glabātuve
Konfigurācijas
vērtību dati
Konfigurācijas
glabātuve
Kartīšu dati
Kartīšu
faila ielāde
Kartīšu saraksta lappušu izveidošana
Kartīšu dati
Kartīšu pievienošana
Rediģētu
kartīšu dati
Kartītes redigēšana
Dzēstu kartīšu dati
Kartītes
dzēšana
Kartīšu
failu dati
Kartītes faila saglabāšana
Konfigurācijas
vērtību dati
Kartīšu dati
Kartīšu
dati
Kartīšu dati
Kartīšu dati
Kartīšu failu
metadati
Pagaidu kartīšu glabātuve
Kartīšu
pirmteksta dati
Kartītes pirmteksta iegūšana
Atmiņas bāzes lappuses iegūšana
Kartīšu
lappušu dati
\ No newline at end of file diff --git a/docs/img/DPD0.svg b/docs/img/DPD0.svg deleted file mode 100644 index 13e68b1..0000000 --- a/docs/img/DPD0.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - -
Kartīšu
prezentācijas dati
Atjaunotie
kartīšu faila dati
Izmainīti
konfigurācijas
dati
Kartīšu dati
Esošās
konfigurācijas dati
Mdemory
Kartīšu
failu dati
Individuālo
kartīšu dati
Izmainīti
konfigurācijas dati
Mācīšanās
kontroles dati
Lietotājs
Kartīšu dati
Kartīšu
failu dati
Failu glabātuve
Esošo kartīšu dati
Pagaidu kartīšu glabātuve
Esošās konfigurācijas
dati
Konfigurācijas glabātuve
\ No newline at end of file diff --git a/docs/img/DPD1.svg b/docs/img/DPD1.svg deleted file mode 100644 index 45066cc..0000000 --- a/docs/img/DPD1.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - -
Kartīšu failu dati
Konfigurācijas
redigēšanas dati
Mācīšanās dati
Lietotājs
Kartīšu
sarakstu dati
Kartīšu dati
Atmiņas 
bāzes modulis
Izmainīti kartīšu dati
Kartīšu
dati un atbilžu dati
Mācīšanās modulis
Konfigurācijas 
izmaiņu dati
Konfigurācijas
vērtību dati
Konfigurācijas
modulis
Kartīšu
failu dati
Kartīšu dati
Kartīšu dati
Failu glabātuve
Esošās 
konfigurācijas dati

Konfigurācijas
vērtību dati
Konfigurācijas
vērtību dati
Konfigurācijas
glabātuve
Kartīšu pievienošanas,
dzēšanas, redigēšanas, dati
Kartīšu
dati
Pagaidu kartīšu glabātuve
\ No newline at end of file diff --git a/docs/img/KFDPD2.svg b/docs/img/KFDPD2.svg deleted file mode 100644 index 4074e2d..0000000 --- a/docs/img/KFDPD2.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - -
Konfigurāciju vārdnīcas
dati
Konfigurācijas vērtību iegūšana
Konfigurācijas vērtības iegūšana
Konfigurācijas
vērtību dati
Konfigurācijas vērtības izmaiņa
Konfigurācijas
ievades vērtību dati
Konfigurācijas vērtibu
 astlēgu dati
Lietotājvārds
Konfigurācijas
vērtību dati
Visu konfigurācijas
 vērtību dati
Konfigurācijas
glabātuve
Konfigurācijas
vērtību dati
Konfigurācijas vērtibu
 astlēgu dati
\ No newline at end of file diff --git a/docs/img/MADPD2.svg b/docs/img/MADPD2.svg deleted file mode 100644 index 0f9f982..0000000 --- a/docs/img/MADPD2.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - -
Kartīšu priekšas
un aizmugures dati
Nākamās kartītes noteikšana
Pārbaužu
dati
Izvēles kartītes pārbaude
Pārbaužu
dati
Kārtošanas kartītes pārbaude
Pārbaužu
dati
Grupēšanas kartītes pārbaude
Kartīšu dati
Intervāla grupas atbildes sniegšana
Atbilžu ievades
dati
Atbilžu ievades
dati
Grupēto un negrupēto
atbilžu ievades
dati
Intervāla grupu
ievades dati
Kartīšu
identifikācijas dati
Kartīšu identifikācijas
dati
Kartīšu identifikācijas
dati
Kartīšu identifikācijas
dati
Kartīšu identifikācijas
dati
Lietotājs
Kartīšu dati
Kartīšu atbildes
dati
Kartīšu atbildes
dati
Pagaidu kartīšu glabātuve
Kartīšu atbildes
dati
Konfigurācijas
vērtību dati
Konfigurācijas
glabātuve
\ No newline at end of file diff --git a/docs/img/conceptualER.svg b/docs/img/conceptualER.svg deleted file mode 100644 index b019e36..0000000 --- a/docs/img/conceptualER.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - -
Atbilde
1
Jautājums
Sākuma teksts
Pārtraukums
Grupa
N
1
Satur
N
Satur
Grupas
nosaukums
Grupas elements
1
N
Satur
Grupas
elementa teksts
Atbildes veids
Kartīšu fails
N
1
Satur
Nosaukums
Pēdējās mācīšanās datums un laiks
N
1
Satur
Atbildes sākuma simboli
Nosaukums
\ No newline at end of file diff --git a/docs/img/lexer_activity.svg b/docs/img/lexer_activity.svg deleted file mode 100644 index ed8c579..0000000 --- a/docs/img/lexer_activity.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - -
Iegūst nākamo simbolu
Simbols ir
jaunas rindas simbols
Pievieno 1 rindu skaitam; uzstāda kolonnas skaitli uz 0
Simbols ir simbols '\'
Pievieno bufferim nākamo simbolu pēc pašreizējā norādes, pamaina simbolu norādi uz nākamo simbolu
Pievieno simbolu bufferim
Ja teksts nav sācies
 Izveido viena simbola tekstvienību un pievieno objektu sarakstam,
Pārvieto iepriekšējā teksta norādi
Uzstāda teksta karodziņu uz "Patiess"
Pašreizējais simbols
atbilst viena simbola
tekstvienībai
Uzstāda teksta
 karodziņu uz "Nepatiess"
Pašreizējais
simbols ir identifikatora sākums
Pašreizējais
simbols ir
 identifikatora beigas
Uzstāda identifikatora
 karodziņu uz "Patiess"
Uzstāda identifikatora
 karodziņu uz "Nepatiess"
Palielina kolonnas skaitli par 1
Simboli beidzās?
Bufēri if teksts?
Izveido teksta tekstvienības objektu un pievieno to sarakstam
Simbolu virkne
Teksta tekstvienība
Iepriekšējā teksta norādi uzstāda uz tagadējo norādi
Viena simbola tekstvienība
Saraksts ar tekstvienībām
\ No newline at end of file diff --git a/docs/img/mde.svg b/docs/img/mde.svg deleted file mode 100644 index 5a04d42..0000000 --- a/docs/img/mde.svg +++ /dev/null @@ -1 +0,0 @@ -
Atmiņas kartīšu
prezentācijas dati
Atmiņas kartīšu...
Atjaunotie atmiņas
kartīšu faila dati
Atjaunotie atmiņas...
Mdemory
Mdemory
Atmiņas kartīšu
faila dati
Atmiņas kartīšu...
Individuālo
kartīšu dati
Individuālo...
Lietotnes
konfigurācijas dati
Lietotnes...
Mācīšanās
kontroles dati
Mācīšanās...
Lietotājs
Lietotājs
Text is not SVG - cannot display
\ No newline at end of file diff --git a/docs/img/next_question_activity.svg b/docs/img/next_question_activity.svg deleted file mode 100644 index 70c03d8..0000000 --- a/docs/img/next_question_activity.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - -
Algoritms ir "nejaušs"?
Algoritms ir "intervālu"?
Jautājumu norāžu saraksts, tagadējais jautājums, pēdējais mācīšanās laiks un algoritms
Izņem no pagaidu saraksta tagadējo jautājumu
Izveido pagaidu jautājumu norāžu sarakstu ar ievades saraksta vērtībām
Nosaka tagadējo laiku
Sarakstā paliek
neapskatīti jautājumi
Apskata nākamo jautājumu
Izveido pagaidu jautājumu norāžu sarakstu
Izņem no pagaidu saraksta tagadējo jautājumu
Pagaidu saraksts ar jautājumiem
Sarakstā ir jautājumi?
Tukša norāde
 uz jautājumu
Norāde uz jautājumu
Atņem no jautājuma pārtraukumu, kas jau ir pagājis
Aprēķinātais pārtaukums
 ir mazāks par nulli
Uzstāda pārtraukumu nulli
Uzstāda aprēķinātu pārtraukumu
Pagaidu sarakstā
 ir jautājumi?
Pagaidu saraksts ar jautājumiem
Tukša norāde
 uz jautājumu
Izvēlas jautājumu nejaušā kārtā
Sarakstā pēc norādes ir jautājumi?
Norāde uz jautājumu
Tukša norāde
 uz jautājumu
Norāde uz jautājumu
Izvēlas jautājumu nejaušā kārtā
\ No newline at end of file diff --git a/docs/img/parsing_activity.svg b/docs/img/parsing_activity.svg deleted file mode 100644 index c954c09..0000000 --- a/docs/img/parsing_activity.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - -
Sarakstā ir tekstvienības
Parsēšana ir veiksmīga
Parsēšanas kļūda
Pirmā tekstvienība ir datums un laiks
Sarakstā paliek tekstvienības
Saraksts ar tekstvienībam
Tukša izvade
Mēģina parsēt datumu un laiku
Apskata nākamās tekstvienības
Seko jautājuma 
sākums un secības modifikators
Parsēšanas kļūda
Datuma un laika objekts
Apskata nākamās tekstvienības
Seko pārtraukuma
specifikācija
Mēģina parsēt pārtraukuma skaitli
Parsēšana ir veiksmīga?
Pārtraukuma skaitlis
Parsēšanas kļūda
Mēģina parsēt atbildes elementu
Parsēšanā ir 
radusies kļūda
Parsēšanas kļūda
Atbildes parsēšanas rezultāts
Noteikta tipa jautājums
Datums un laiks un saraksts ar jautājumu objektiem
Datums un laiks un saraksts ar jautājumu objektiem
Parsēšana beidzās ar jautājuma sākumu
Pievieno jautājumu sarakstam
Pievieno jautājuma objektam sākuma tekstu
Nulles datums un laiks un tukšs saraksts ar jautājumiem
\ No newline at end of file diff --git a/docs/img/parsing_answer_activity.svg b/docs/img/parsing_answer_activity.svg deleted file mode 100644 index 30411fe..0000000 --- a/docs/img/parsing_answer_activity.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - -
Norāde tekstvienību sarakstā
Sekojošās tekstvienības
 atbilst jautājuma 
sākuma uzbūvei
Apskata nākamās tekstvienības
Jautājums un beigšanas pazīme - ir nākamais jautājums
Sekojošās tekstvienības
atbilst izvēles elementam
Sekojošās tekstvienības
atbilst secības elementam
Sekojošās tekstvienības
atbilst grupas elementam
Inicializē jautājuma veida karodziņus: secības, grupas, izvēles un beigšanas.
Izveido izvēles atbildes objektu, uzstāda izvēles karodziņu uz patiess
Grupas atbildes objekts
Sarakstā ir tekstvienības
Jautājums un beigšanas pazīme - nav nākamā jautājuma
Jautājumu veidu
karodziņi ir pretrunā
Izveido secības atbildes objektu, uzstāda secības karodziņu uz patiess
Izveido grupas atbildes objektu, uzstāda grupas karodziņu uz patiess
Grupas atbildes objekts
Grupas atbildes objekts
Izveido svītras atbildes objektu, uzstāda svītras karodziņu uz patiess
Parsēšanas kļūda
Apskata nākamās tekstvienības
Vairāki atbildes elementi neatbilst jautājuma veidam e.g., grupas elements secības jautājumā.
Karodziņi glabā informāciju par apskatāmo jautājumu
\ No newline at end of file diff --git a/docs/img/screens/answer_question.png b/docs/img/screens/answer_question.png deleted file mode 100644 index 8efd141..0000000 Binary files a/docs/img/screens/answer_question.png and /dev/null differ diff --git a/docs/img/screens/cloc.png b/docs/img/screens/cloc.png deleted file mode 100644 index bb55664..0000000 Binary files a/docs/img/screens/cloc.png and /dev/null differ diff --git a/docs/img/screens/config.png b/docs/img/screens/config.png deleted file mode 100644 index ff8a36b..0000000 Binary files a/docs/img/screens/config.png and /dev/null differ diff --git a/docs/img/screens/group_question.png b/docs/img/screens/group_question.png deleted file mode 100644 index c5f895b..0000000 Binary files a/docs/img/screens/group_question.png and /dev/null differ diff --git a/docs/img/screens/help.png b/docs/img/screens/help.png deleted file mode 100644 index 641b9cc..0000000 Binary files a/docs/img/screens/help.png and /dev/null differ diff --git a/docs/img/screens/interval_answer.png b/docs/img/screens/interval_answer.png deleted file mode 100644 index d5b52c0..0000000 Binary files a/docs/img/screens/interval_answer.png and /dev/null differ diff --git a/docs/img/screens/mdem_list.png b/docs/img/screens/mdem_list.png deleted file mode 100644 index 9c8f5ed..0000000 Binary files a/docs/img/screens/mdem_list.png and /dev/null differ diff --git a/docs/img/screens/multiple_answer_question.png b/docs/img/screens/multiple_answer_question.png deleted file mode 100644 index b6bd58e..0000000 Binary files a/docs/img/screens/multiple_answer_question.png and /dev/null differ diff --git a/docs/img/screens/order_question.png b/docs/img/screens/order_question.png deleted file mode 100644 index 0d94270..0000000 Binary files a/docs/img/screens/order_question.png and /dev/null differ diff --git a/docs/img/screens/question_editor.png b/docs/img/screens/question_editor.png deleted file mode 100644 index e21fc3e..0000000 Binary files a/docs/img/screens/question_editor.png and /dev/null differ diff --git a/docs/img/view_flow_diagram.svg b/docs/img/view_flow_diagram.svg deleted file mode 100644 index bb72f25..0000000 --- a/docs/img/view_flow_diagram.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - -
Amiņas kartīšu saraksta skats
Konfigurācijas skats
Atbildes jautājuma
skats
Izvēles jautājuma
skats
Secības jautājuma
skats
Grupēšanas
jautājuma skats
Apmācības skats
Redaktora skats
\ No newline at end of file diff --git a/docs/layout.typst b/docs/layout.typst deleted file mode 100644 index bf58402..0000000 --- a/docs/layout.typst +++ /dev/null @@ -1,205 +0,0 @@ -#import "@preview/i-figured:0.1.0" -#import "@preview/big-todo:0.2.0": * -#import "@preview/tablex:0.0.6": tablex - -#let indent = 1cm - -#let project( - university: "", - faculty: "", - title: [], - authors: (), - advisor: "", - date: "", - body, -) = { - set document(author: authors) - - set page( - margin: ( - left: 30mm, - right: 20mm, - top: 20mm, - bottom: 20mm, - ), - number-align: center, - paper: "a4", - ) - set text( - //font: "New Computer Modern", - font: "CMU", size: 12pt, hyphenate: auto, lang: "lv", region: "LV", - ) - show raw: set text(font: "New Computer Modern Mono") - - show math.equation: set text(weight: 400) - - // Formatting for regular text - set par( - justify: true, - leading: 1.5em, - first-line-indent: indent, - ) - show par: set block(spacing: 1.5em) // Set 1.5em gap between paragraphs - show heading: set block(spacing: 1.5em) - set terms(separator: [ -- ]) - - // Headings - set heading(numbering: "1.1.") - show heading: it => { - if it.level == 1 { - pagebreak(weak: true) // does not break ToC anymore (i think) - text( - 14pt, - align( - center, - upper(it), - ), - ) - } else { - it - } - "" // added - v(-indent) // added - } - - /* Title page config start */ - align( - center, - upper( - text( - size: 16pt, - [ - #university\ - #faculty - ], - ), - ), - ) - - v(1fr) - - align( - center, - text( - 20pt, - weight: "bold", - title, - ), - ) - - v(1fr) - - // Author information - align( - right, - [ - #if authors.len() > 1 { - text( - weight: "bold", - "Darba autori:", - ) - } else { - text( - weight: "bold", - "Darba autors:", - ) - }\ - #authors.join("\n") - - #v(2em) - - #if advisor != "" { - text( - weight: "bold", - "Darba vadītājs:\n", - ) - advisor - } - ], - ) - - v(0.5fr) - - - align( - center, - upper( - text(date), - ), - ) - /* Title page config end */ - - // WARNING: removove before sending - // todo_outline - - /* --- Figure/Table conf start --- */ - show heading: i-figured.reset-counters - show figure: i-figured.show-figure.with(numbering: "1.1.") - - show figure.where(kind: "i-figured-table"): set block(breakable: true) - show figure.where(kind: "i-figured-table"): set figure.caption(position: top) - - show figure: set par(justify: false) // disable justify for figures (tables) - - show figure.caption: it => { - if it.kind == "i-figured-table" { - align( - end, - emph(it.counter.display(it.numbering) + " tabula ") + text( - weight: "bold", - it.body, - ), - ) - } else if it.kind == "i-figured-image" { - align( - start, - emph(it.counter.display(it.numbering) + " att. ") + text( - weight: "bold", - it.body, - ), - ) - } else { - it - } - } - - set ref(supplement: it => { }) // disable default reference suppliments - /* --- Figure/Table conf end --- */ - - set list(marker: ( - [•], - [--], - [\*], - [·], - )) - set enum(numbering: "1aiA)") // TODO: make the same style as LaTeX: 1. | (a) | i. | A. - - // Abstract - include "abstract.typst" - - /* ToC config start */ - // Uppercase 1st level headings in ToC - show outline.entry.where(level: 1): it => { - upper(it) - } - - pagebreak() - outline( - depth: 3, - indent: 1cm, - title: text( - size: 14pt, - "SATURS", - ), - ) - /* ToC config end */ - - // Start page numering - set page( - numbering: "1", - number-align: center, - ) - - // Main bdy. - body -} diff --git a/docs/main.typst b/docs/main.typst deleted file mode 100644 index 8ecd62e..0000000 --- a/docs/main.typst +++ /dev/null @@ -1,2358 +0,0 @@ -#import "layout.typst": project -#import "@preview/i-figured:0.1.0" -#import "@preview/tablex:0.0.6": tablex, rowspanx, colspanx, cellx -#import "utils.typst": * - -#show: project.with( - university: "Latvijas Universitāte", - faculty: "Eksakto zinātņu un tehnoloģiju fakultāte", - title: [Atmiņas kartīšu lietotne ar domēna specifiskas valodas izmantošanu\ Kvalifikācijas darbs], - authors: ( "Jorens Štekeļs, js21283", ), - advisor: "prof. Dr. sc. comp. Laila Niedrīte", - date: "Rīga 2025", -) - -#set heading(numbering: none) - -#pagebreak(weak: true) -= Apzīmējumu saraksts - -#par( - first-line-indent: 0cm, - [ - *Iezīmēšanas valoda (angl. markup)* -- dokumentu formatēšanas sistēma, kas - izmanto birkas un citus simbolus, lai noteiktu dokumenta struktūru un - izkārtojumu. To izmanto, lai organizētu informāciju un kontrolētu dokumenta - izskatu; - - *Markdown* -- vienkārša un populāra iezīmēšanas valoda, kas galvenokārt - paredzēta teksta dokumentu (īpaši tīmekļa lapu) formatēšanai; - - *Transpilēšana* -- teksta pārvēršana programmas datu struktūrās vai - objektos, kas paredzēta kā starpposms starp dažādiem programmēšanas valodas - līmeņiem; - - *Detranspilēšana* -- programmas objektu atgriešana atpakaļ noteiktā teksta - formātā vai valodā, saglabājot objekta struktūru un īpašības; - - *Norāde* -- mainīgais vai datu struktūra, kas satur citu objektu vai - vērtību adresi, ļaujot piekļūt šiem objektiem netieši; - - *Nulles objekts* -- objekts, kas norāda uz tukšu vai neinicializētu - stāvokli, piemēram, lai apzīmētu, ka objekts nesatur derīgu vērtību vai ir - tukšs; - - *Vienkāršais teksts* -- teksta dati, kas attēlo simbolus bez grafiskām vai - citām struktūrām, piemēram, attēliem vai formatētiem elementiem, un ir - viegli lasāms jebkurā teksta redaktorā; - - *Metadati* -- dati, kas apraksta citus datus, sniedzot informāciju par to - īpašībām, piemēram, saturu, izcelsmi un struktūru; - - *CSV* -- formāts, kas satur vērtības, kas ir atdalīti ar komatiem; - - *Parsēšana* -- tekstvienību pārveidošana dažāda objektos; - - *Buferis* -- saraksts ar kāda tipa vērtībām, kas tiek tiek piepildināts un - atbrīvots kāda procesa ietvaros; - - *HTML (angl. HyperText Markup Language)* -- hiperteksta iezīmēšanas valoda, - ko izmantojot, ir uzbūvēta lielākā daļa no tīmekļa mājaslapu; - ], -) - -#pagebreak(weak: true) - -= Ievads - -== Nolūks - -Šī darba nolūks ir specificēt lietotnes programmatūras prasības un -aprakstīt tās projektējumu, kas tiek aprakstīta un izstrādāta -kvalifikācijas darba ietvaros. - -== Darbības sfēra - -// Kas ir atmiņas kartes -Atmiņas kartītes (angl. flashcards) ir izplatīts veids, kā skolēni, -studenti un citi cilvēki, kas mācās vai studē, iegaumē materiālu. Šādu -kartīšu pamatā parasti ir priekša un aizmugure. Priekšā atrodas jautājums -vai uzdevums vai cita informācija, kas uzstāda mentālu vai praktisku -uzdevumu, iespējams iekļaujot arī mājieni. Aizmugurē atrodas atbildes -teksts, kas ar sevi atbild vai parāda pareizu atbildi uz priekšā uzstādītu -jautājumu vai uzdevumu. - -// Mācīšanās process un spaced-repetition -Mācīšanās nolūkiem tiek veidotas vairākas atmiņas kartītes uz līdzīgu tēmu, -veidojas kartīšu kaudzes. Mācīšanas seansā, tiek vērtēts, cik grūti vai viegli -jautājumi vai uzdevumi ir attiecīgi atbildami vai atrisināmi. Balstoties uz -grūtību vai iespēju atbildēt, kartītes tiek grupētas noteiktās grupās, kas, -savukārt, nosaka intervālu, pēc kura kartīte figurēs nākamā mācīšanās seansā. -Piemēram, grupas - ļoti viegli, vidēji, grūti, neizdevās -, kam atbilst 5 -dienas, 3 dienas, 1 diena, 0 dienas attiecīgi. Balstoties uz subjektīvu -piepūli, atbildot uz jautājumu vai risinot uzdevumu, tiek izvēlēta atbilsoša -intervālu grupa, kas nosaka laiku pirms nākamās reizes, kad šī kartīte būs -izmantota. Šī mācīšanās metode ir atkārtošana ar intervāliem. Mācīšanās metode -vai līdzīgas metodes var uzlabot atcerēšanās līmeni pēc mācīšanās -(#link()[Alison Voice and Arran Stirton, 2020]). - -// Stuff mdemory does -Veidojot atmiņas kartītes manuāli tās var pazaudēt, var kļūdīties, sagatavojot -to tekstu. Tāpēc ir iespējams kartītes veidot un uzturēt, izmantojot tīmekļa -vai lokālo lietotni. Aprakstāmās programmatūras mērķis ir vienkāršot atmiņas -kartīšu veidošanu ar iespēju veidot, mainīt un glabāt atmiņas kartītes -vienkāršā tekstā un mācījies izmantojot atkārtošanu ar intervāliem. Atmiņas -kartītes ir glabātas teksta failos un glabājas direktorijā, kas pilnībā -paliek lietotāja pārvaldē. Vienkārša teksta kartīšu glabāšana paredz, ka -lietotājs var brīvi pārvietot un mainīt kartīšu saturu, turpinot izmantot -programmatūras mācīšanās funkcionalitāti. - -Uzsvars ir uz pilnīgu atmiņas kartīšu glabāšanas pilnīgu caurspīdīgumu - -kartītes glabājas bez slēptas informācijas. Vienkārša teksta izmantošana bez -slēptas informācijas atbrīvo lietotāju no atkarības no šīs programmatūras ar -iespēju pārslēgties uz citu risinājumu ar dažām teksta izmaiņām. - -// @Improve: add some text?; - -// The name -Programmatūras produkta nosaukums ir "Mdemory", kas ir darināts nosaukums no -"MD" (iezīmēšanas valodas Markdown abreviatūra) un "memory" (angl. atmiņa), kas -parāda produkta saistību ar atmiņu. - -== Saistība ar citiem dokumentiem - -Programmatūras prasībus specifikācijas ir izstrādāta, ievērojot LVS 68:1996 -"Programmatūras prasību specifikācijas ceļvedis" standarta un LVS 72:1996 -"Ieteicamā prakse programmatūras projektējuma aprakstīšanai" standarta -prasības. - -== Pārskats - -// apraksts: Ievads - -Ievadā tiek definēts nolūks darbības sfēra, aprakstīta galvenā programmatūras -produkta būtība un mērķi, saistītie dokumenti. - -Vispārējā apraksta sadaļā tiek aprakstīts esošais stāvoklis, pasūtītājs, produkta perspektīva, -galvenās darījumprasības, pieņēmumi un atkarības. - -Programmatūras prasību specifikācijas sadaļā tiek aprakstīts risinājumā -izmantots karītes formāts un ar to saistītas datu struktūras, risinājuma datu -plūsmas, funkcijas un risinājuma nefunkcionālās prasības. - -// @Complete: apraksts -- Programmatūras projektējuma apraksts -// @Complete: other things - -#pagebreak(weak: true) -#set heading(numbering: "1.1.") -= Vispārējais apraksts - -== Esošā stāvokļa apraksts - -// @TODO: go over the thing - -"Mdemory" lietotne piedāvā vairāku specializēto atmiņas kartīšu veidu -funkcionalitāti un pilnīgu vienkārša teksta atmiņas kartīšu definēšanu un -pārvāldību. Vairāki esošie risinājumi piedāvā daļu no minētām iespējām, bet -gan nepiedāvā abas iespējas. - -// Quizlet -Daži risinājumi iekļauj vairākus specializētus jautājumu veidus, kā grupēšanas -jautājumi, vairāku atbilžu jautājumi un secības jautājumi. Tādu risinājumu -piemērs ir #link()["Quizlet"] lietotne. Quizlet importa -funkcionalitāte realizē vienkāršu importu, kas visbiežāk ir izmantots ar mērķi -pārnest atmiņas kartītes vienas lietotnes ietvaros, nevis veidot kartītes šajā -formātā. Quizlet vienkārša teksta imports ir realizēts, izmantojot CSV formātu. - -// org-drill -Diezgan tuvs pēc funckionalitātes mērķiem ir "Emacs" teksta redaktora -papildinājums "org-drill". Tas piedāvā vienkārša teksta atmiņas kartīšu -veidošanu un glabāšanu ar vienkāršu tekstu. Lietotojot "ord-drill", ir -nepieciešams izmantot "Emacs" teksta redaktoru. Programmas funkcionalitāte ir -domāta pieredzējošākiem lietotājiem. Risinājums liek uzsvaru uz vienkāršām -kartītēm, kas neiekļauj specializētus kartīšu jautājumu veidus -(#link()[Paul Sexton]). -// @Improve: should I add date here? - -// # Org-mode functions -// Simple: Basic question and answer. -// Cloze Deletion: Creates fill-in-the-blank cards where specific terms are -// masked and must be recalled. -// Multicloze: Allows multiple cloze deletions within the same card, which is -// ideal for complex information. - -Visu jautājumu importa funkcija parasti nav pieejama esošos risinājumos. -Pašlaik neviens no esošiem risinājumiem neatbalsta specializēto atmiņas kartīšu -veidu importu. "Org-mode" dod iespēju glabāt kartītes vienkāršā teksta failos, -taču tas fokusējas uz vienkāršumu ar klasisku kartīšu veidu bez specializētiem -jautājumu veidiem. Lielākā daļa risinājumu glabā kartītes savā, pielāgotā, -slēptā formātā, kas apgrūtina kartīšu pārvaldību un pārnešanu. - -== Pasūtītājs - -Programmatūras produkts tiek izstrādāts pēc darba autora iniciatīvas -kvalifikācijas darba ietvaros. - -== Produkta perspektīva - -Risinājums ir patstāvīga darbvirsmas lietotne. Lietotnes izstrādē ir izmantotas -lietotnes saskarnes bibliotēkas un programmēšanas valodas standarta bibliotēka. -Risinājums lasīs un izmainīs teksta failus no lietotāja norādītās direktorijas. - -== Risinājuma lietotāji - -Risinājumam ir viena lietotāju grupa, kam ir pieejamas visas risinājuma -iespējas un funkcijas. -Risinājuma augsta līmeņa datu plūsmas ir attēlota 0. līmeņa datu plūsmas -diagrammā (DPD; skat. @fig:dpd0 attēls). Lietotāju galvenā datu apmaiņa ir -atmiņas kartīšu dati un dati par saskarni ar kartītēm. DPD ir iekļautas trīs -datu glabātuves: failu glabātuve, pagaidu kartīšu glabātuve un konfigurācijas -glabātuve. - -Failu glabātuve ir vieta, kur tiek glabātas kartītes vienkārša teskta formātā. -Tas ir direktorijs ar noteikta formāta failiem (skat. attēlu @fig:conceptual-er -un tabulas @tbl:DF01\-@tbl:DF06). Šo glabātuvi pārvalda lietotājs -- brīvi pievieno, -modificē un pārstrukturē direktorijā esošos failus un apakšdirektorijus. - -Pagaidu kartīšu glabātuve glabā apskatāmās kartītes un visus izmainītos atmiņas -failiem atbilstošus kartīšu sarakstus. Glabātuve ir spēkā risinājuma programmas -darba laikā. Sākot darbu ar risinājumu, kartītes tiek ielādētas no failu -glabātuves pagaidu glabātuvē. Darbu beidzot vai pēc lietotāja izvēles, kartītes -tiek saglabātas failos, no kuriem katītes tika ielādētas. Izmaiņas pagaidu -glabātuves datos notiek ar risinājuma saskarni. - -Konfigurācijas glabātuve ir fails(/-i), kuros tiek glabātas konfigurācijas -vērtības, ko uzstāda un saglabā lietotājs. Konfigurācijas glabātuvi pārvalda -lietotājs -- ir iespējams mainīt konfigurācijas faila saturu ar nosacījumu, ka -faila formāts paliek korekts un ievadītās vertības ir korektas un ir pieejamā -vērtību diapazonā. - -#figure( - caption: "0.līmeņa datu plūsmas diagramma", - placement: auto, - image("img/DPD0.svg"), -) - -== Darījumprasības - -+ Kartīšu failu apstrāde, izmantojot definēto domēna specifikas valodu; -+ Kartīšu saraksta veidošana; -+ Definēto jautājumu veidu tekstuāla atspoguļošana; -+ Definēto jautājumu veidu interaktīva mācīšanas funkcija; -+ Mācīšanās ar atkārtošanu ar intervāliem; -+ Kartīšu pievienošana, modifikācija un dzēšana sarakstā; -+ Vairāku kartīšu failu apstrāde direktorijā; -+ Kartīšu saglabāšana no saraksta. - -== Vispārējie ierobežojumi - -+ Risinājums nepieslēdzas internetam; -+ Risinājums ir lokāla darbvirsmas programma; -+ Atmiņas kartītes un kofigurācija ir glabāta vienkārša teksta failos, ko - lietotājs var modificēt pilnībā; - -== Pieņēmumi un atkarības - -+ Lietotnes var tikt uzbūvēta darbam uz Windows vai Linux sistēmām, uz kurām ir - pieejamas risinājumā izmantotas saskarnes bibliotēkas; -+ Lietotājs atbild par atmiņas kartīšu failu glabāšanu; - -#pagebreak(weak: true) -= Programmatūras prasību specifikācija - -Šajā sadaļā tiks aprakstīts datu glabāšanas konceptuālais modelis, funkcionālās -prasības, kas iekļauj lietotnes datu plūsmas diagrammas, funckiju, datu formātu -un datu struktūru definīcijas un lietotnes nefunkcionālās prasības. - -== Konceptuālais entitāšu-relāciju modelis - -Risinājuma glabātie dati iekļauj atmiņas kartīšu un konfigurācijas datus, kas -tiek glabāti vienkāršos failos. Risinājums neizmantos datubāzi datu glabāšanai. -Risinājumā entitātes ir attēlotas konceptuālā entitāšu-relāciju modelī (skat. attēlu -@fig:conceptual-er). - -Atmiņas kartītes tiek organizētas noteikta paplašinājuma failos, kas satur -kartītes noteiktā formātā. Kartītes ir dažādu veidu jautājumi, kas ietver -sākuma -- jautājuma tekstu un vairākus saistītus jautājuma atbildes elementus. -Ir atbildes jautājumi, kas satur vairākus vienlīdzīgus elementus, un ir grupas -jautājumi, kas satur vairākas grupas ar vairākiem tai piederošiem elementiem. -Atbildes elementiem piemīt veids, katrs atšķiras ar to, kā elements sākas, ko -nosaka sākuma simboli. Grupas elementi sastāv no teksta un pieder kādai grupai, -kam ir nosaukums. - -Modelī ir iekļauti metadati, kā pēdējās mācīšanās laiks, jautājuma pārtraukuma -laiks un faila nosaukums. Pēdējās mācīšanās laiks tiek izmantots intervālu -metodē, lai reģistrētu laiku un pielietot intervālu metodi turpmākās mācību -reizēs. Jautājuma pārtraukuma laiks nosaka, cik ilgam laikam jāpaiet, lai -jautājums atkal būtu iekļauts intervālu metodes mācīšanās. Faila nosaukums tiek -izmantots kā kartīšu saraksta nosaukums -- to var izmanot, lai nosauktu failā -esošās kartītes, piemēram, to tēmu vai nolūku. Fails var saturēt pēdējās -mācīšanās datumu un laiku, kas tiek izmantota vienā no mācīšanās algoritmiem, -ko izmanto lietotne. - -#figure( - caption: "Konceptuālais entitāšu-relāciju modelis", - placement: auto, - image("img/conceptualER.svg"), -) - -== Funkcionālās prasības - -#let questionSource = [ - simbolu virkne, kas satur jautājumus formātā, kas atbilst datu formātiem - #link()[DF02], - #link()[DF03], - #link()[DF04], - #link()[DF05] (skat. tabulas @tbl:DF02\-@tbl:DF05) -]; -#let questionList = [saraksts ar objektiem, kas atbilst datu struktūrai #link()[DS01] (skat. tabulu @tbl:DS01)]; -#let question = [objekts, kas atbilst datu struktūrai #link()[DS01] (skat. tabulu @tbl:DS01)]; -#let pageList = [saraksts ar objektiem, kas atbilst datu struktūrai #link()[DS02] (skat. tabulu @tbl:DS02)]; -#let datetime = [simbola virkne formātā, kas atbilst datu struktūrai #link()[DS03] (skat. tabulu @tbl:DS03)]; - -#let uint = [vesels pozitīvs skaitlis]; -#let mdemFilePath = [simbolu virkne, kas atbilst failam ar noteitu paplašinājumu]; -#let listWithCorrectFlags = [Izvēlēto atbilžu simbolu virkņu saraksts ar pareizuma karodziņu vērtībām]; -#let configValue = [viens no: skaitlis, simbolu virkne, karodziņš]; -#let changeIndicator = [Saskarnē parādās indikators, ka atmiņas kartīšu fails tika izmainīts]; - - -=== Augsta līmeņa kartīšu valodas specifikācija - -Šajā apakšsadaļā tiks aprakstīta domēna specifiska valodas formāta -vienības, kas ir sastāvdaļas no valodas, kas ir izmantota risinājumā, -definējot, glabājot un rediģējot atmiņas kartītes. Formāti ir aprakstīti -tabulās @tbl:DF01\-DF06. - -==== Kartīšu veidi - -#format-table( - "Jautājuma sākums", - "DF01", - [ - Kartīšu veidošanai vienkāršā tekstā tiek izmantota vienkārša domēna specifiska - valoda. Ir 4 jautājumu veidi, kuru struktūra ir līdzīga ar dažām atšķirībām. - Katram jautājumam ir sākums, kam var būt skaitlis, kas apzīmē intervālu - stundās, pēc kura tas būs atkārtoti izmantots. Priekša ir sākas ar "-" un - beidzas ar ">". - ], - [ - ``` - - Ka sauc Latvijas galvaspilsētu? > - - [12.5] Ka sauc Igaunijas galvaspilsētu? > - ``` - ] -) - - -#format-table( - "Vienkāršs atbilžu jautājums", - "DF02", - [ - Vienkāršs atbilžu jautājums ir jautājums, kam ir viena vai - vairākas pareizas atbildes, katra atbilde sākas ar "-". - ], - [ - ```markdown - - Ka sauc Lietuvas galvas pilsētu? > - - Viļņa - - Nosauciet Baltijas valstis > - - Latvija - - Igaunija - - Lietuva - ``` - ] -) - -#format-table( - "Izvēles jautājums", - "DF03", - [ - Izvēles jautājums ir jautājums, kam ir viens vai vairākas pareizas - atbildes, pareizās atbildes sākas ar "+", nepareizās -- ar "-". - ], - [ - ```markdown - - Kuras no valstīm ir Baltijas valstis > - + Latvija - - Rumānija - + Lietuva - - Spānija - ``` - ] -) - -#format-table( - "Secības jautājums", - "DF04", - [ - Secības jautājums -- jautājums ar vairākām vērtībām, kam ir noteikta secība, - vērtības sākas ar "-^". - ], - [ - ``` - - Sakārtojiet zinātniskās metodes soļus pareizā secībā > - -^ Uzdod jautājumu - -^ Izvirza hipotēzi - -^ Veic eksperimentu - -^ Analizē datus - ``` - ] -) - -#format-table( - "Grupēšanas jautājums", - "DF05", - [ - Grupēšanas jautājums -- jautājums, kur ir vairākas grupas, kurām pieder nulle - vai vairāki elementi. Grupas sākas ar "-" un beidzas ar ":". Grupas elementi - sākas ar "-". - ], - [ - ``` - - Savienojiet planētas ar to īpašībām > - - Zeme: - - Ir dzīve - - Jupiters: - - Lielākā planēta - - Ir gredzeni - - Venēra: - - Merkurs: - - Mazākā planēta - - Saturns: - - Ir gredzeni - - Neptūns: - - Tālākā no Saules - - Ir gredzeni - ``` - ] -) - -// TODO: replace every jautājums -> kartīte except where its really needed. - -#format-table( - "Kartītes faila pirmteksts", - "DF06", - [ - Kartītes pirmteksta failā var tikt iekļauti vairāki dažādu veidu jautājumi. - Sākumā var būt datuma un laika simbolu virkne, kas atbilst datu struktūrai #link()[DS02] (skat. tabulu @tbl:DS02). - ], - [ - ``` - 21.10.2024 12:54 - - Savienojiet dzīvniekus ar to īpašībām > - - Kaķis: - - Murrā - - Suns: - - Ir uzticīgs - - Draudzīgs - - Zivs: - - Varde: - - Dzīvo gan ūdenī, gan uz sauszemes - - Zirgs: - - Ir ātrs - - Putns: - - Spēj lidot - - Dzīvo kokā - - Sakārtojiet cilvēka dzīves posmus pareizā secībā > - -^ Bērnība - -^ Pusaudža gadi - -^ Pieaugšana - -^ Vecumdienas - ``` - ] -) - -=== Formātu un datu struktūru specifikācija - -Šajā apakšsadaļā tiks apskatīti ievades un izvades vērtību formāti, kas tiks -izmantoti funkciju aprakstos. Formāti ir aprakstīti tabulās -@tbl:DS01\-@tbl:DS04. - -#io-table( - "Kartīšu datu struktūra", - "DS01", - [ - Jautājumu datu struktūra satur informāciju par atmiņas kartīti ar papildus - informāciju, kas atbils noteiktam jautājuma veidam. - - Pamatā jautājumam ir: - - - Teksts -- simbola virkne; - - Ilgums, cik kartīte nebūs izmantota atkal intervālu metodē -- pozitīvs daļu skaitlis; - - Papildus informācija iedalās vairākos veidos. - - + Vairāku elementu veids: - - Veids -- uzskaitījums, kurš no - vairāku variantu, secības, vienkāršs - - jautājums ir; - - Saraksts ar objektiem, kas sastāv no simbolu - virknes un korektuma karodziņu; - + Grupas veids: - - Saraksts ar objektiem, kas sastāv no: - - Nosaukuma -- simbolu virkne; - - Elementiem -- saraksts ar simbolu virknēm. - - ], -) - -#io-table( - "Lappuses datu struktūra", - "DS02", - [ - Lappuse ir ir saraksts ar referencēm uz vairākiem jautājuma objektiem, kam ir - noteikts lappuses skaitlis. - ], -) - -#io-table( - "Datuma un laika simbolu virkne", - "DS03", - [ - Datuma un laika simbolu virknē tiek izmantots sekojošs formāts - - [dienas_numurs].[mēneša_numurs].[gads] [stunda]:[minūte] -, piemēram, - "13.05.2024 12:02". - ], -) - -#io-table( - "Transpilēšanas kļūdas datu struktūra", - "DS04", - [ - Datu struktūra satur kļūdas aprakstu, kas notika transpilēšanas - laikā. Papildus ir pievienots rindas numurs un kolonnas numurs. - ], -) - -=== Funkciju sadalījums moduļos - -Risinājuma moduļi ar to saistītām datu plūsmām un datu glabātuvēm ir attēlots -1\. līmeņa DPD (skat. @fig:dpd1 attēls). Funkciju sadalījums moduļos ir -apraksīts sadalījuma tabulā (skat. @tbl:function_table tabula). - -#figure( - caption: "1. līmeņa datu plūsmas diagramma", - placement: auto, - image("img/DPD1.svg"), -) - -#pagebreak(weak: true) -#figure( - caption: "Funkciju sadalījums pa moduļiem", - kind: table, - tablex( - columns: 3, - /* --- header --- */ - [*Modulis*], [*Funkcija*], [*Identifikators*], - /* -------------- */ - - rowspanx(8)[Atmiņas bāzes modulis], - [Kartīšu faila ielāde], [#link()[AB01]], - [Kartīšu saraksta lappušu izveidošana], [#link()[AB02]], - [Atmiņas bāzes lappuses iegūšana], [#link()[AB03]], - [Kartīšu pievienošana], [#link()[AB04]], - [Kartītes pirmteksta iegūšana], [#link()[AB05]], - // @Fix: rediģēšana everywhere - [Kartītes rediģēšana], [#link()[AB06]], - [Kartītes dzēšana], [#link()[AB07]], - [Kartītes faila saglabāšana], [#link()[AB08]], - - rowspanx(5)[Mācīšanās modulis], - [Nākamās kartītes noteikšana], [#link()[MA01]], - [Izvēles kartītes pārbaude], [#link()[MA02]], - [Kārtošanas kartītes pārbaude], [#link()[MA03]], - [Grupēšanas kartītes pārbaude], [#link()[MA04]], - [Intervāla grupas atbildes sniegšana], [#link()[MA05]], - // un meta datu saglabāšana - - rowspanx(3)[Konfigurācijas modulis], - [Konfigurācijas vērtības iegūšana], [#link()[KF01]], - [Konfigurācijas vērtību iegūšana], [#link()[KF02]], - [Konfigurācijas vērtības izmaiņa], [#link()[KF03]], - - ), -) - -=== Kopīgas procedūras - -Vairākas prasībās definētās funkcijas izmanto kopīgas procedūras, kas tiek -definētas tabulās @tbl:PR01 un @tbl:PR02. - -#procedure-table( - "Teksta jautājumu transpilēšana", - "PR01", - [ - Procedūra apstrādā simbolu virkni, iegūstot jautājumu datu struktūru - objektus. Ir sagaidāms, ka simbolu virkne atbilst specificētai valodai. Ja - simbolu virkne valodai neatbilst, tiek izvadīta kļūda. Simbolu virkne tiek - apstrādāta vairākos posmos. - ], - [ - + Jautājumu pirmteksts -- #questionSource\; - ], - [ - + Tiek nolasīti simboli, sagrupējot to tekstvienībās; - + Tiek veikta virspusēja gramatikas pārbaude; - + Ja tiek sastapta tekstvienība, kas nav sagaidāma kādā kontekstā, beidz - apstrādi, izvadē pievienojot kļūdu ar tās pozīciju; - + Tiek nolasīti jautājumi, nosakot to veidu pēc to struktūras: - + Jautājuma sākums; - + Veidojot jautājumus tiek pielasīts arī intervāla laiks, ja tāds ir; - + Pēc jautājuma sākuma ir viens vai vairākas atbildes jeb apakšpunkti; - + Vairāki apakšpunkti ar "-" -- atbilžu jautājums; - + Vairāki apakšpunkti ar "+" -- izvēles jautājums; - + Vairāki apakšpunkti ar "-^" -- secības jautājums; - + Vairāki apakšpunkti, kas beidzas ar ":", - kam seko apakšpunkti ar "-" (iespējams tos nenorādīt); - + Jautājumu veidi ir nosakāmi bez tiešas vieda norādīšanas; - + Ja nolasīšanas laikā parādās nesagaidīta tekstvienība, beidz apstrādi, - izvadē pievienojot kļūdu ar tās pozīciju; - ], - [ - + Saraksts ar jautājumiem -- #questionList\; - + Kļūda ar tekstu un tās pozīciju saturā -- paziņojuma objekts, kas atbilst - datu struktūrai #link()[DS04] (skat. tabulu @tbl:DS04)\; - ], -) - -#procedure-table( - "Teksta jautājumu detranspilēšana", - "PR02", - [ - Procedūra apstrādā jautājumu sarakstu un izveido tam atbilstošu - simbolu virkni, kas atbilst specificētai valodai. - Papildus sākumā tiek pievienots datums un laiks, ja tas tiek padots, - kas ir daļa no metadatiem. - ], - [ - + Jautājumu saraksts -- #questionList\; - + Datums un laiks -- #datetime\; - ], - [ - + Iegūst konfigurācijas vērtības, kas nosaka cik garš ir tabulācijas simbols - un kāds ir maksimāls rindiņas platums pirms tiek veidots jaunās rindas simbols; - + Ja datums un laiks ir padots, pievieno datumu un laiku atbilstoši formātam; - + Katram jautājumam veic sekojošo: - + Pievieno jautājuma sākumu ar intervāla skaitli, ja tāds ir; - + Pievieno apakšpunktus atbilstoši tā veidam; - + Vairāki apakšpunkti ar "-" -- atbilžu jautājums; - + Vairāki apakšpunkti ar "+" -- izvēles jautājums; - + Vairāki apakšpunkti ar "-^" -- izvēles jautājums; - + Vairāki apakšpunkti, kas beidzas ar ":", kam seko apakšpunkti ar "-"; - + Veidojot jautājumus ievēro iegūtās konfigurācijas vērtības; - ], - [ - + Jautājumu pirmeksts -- #questionSource\; - ], -) - - -=== Atmiņas bāzes modulis - -Atmiņas bāze ir direktorijs ar atmiņas kartīšu failiem. Modulis atbild par -mijiedarbību ar atmiņas šiem failiem un atmiņas kartīšu prezentēšanu. Šī moduļa -funkcijas ir izmantotas atmiņu kartīšu saraksta funkcionalitātei. Funkcijas -mijiedarbojas ar pagaidu glabātuvē esošām atmiņas kartītēm un failu glabātuves -failiem, kas satur atmiņu kartīšu informāciju. Ar funkcijām saistītas datu plūsmas -ir attēlotas moduļa 2. līmeņa DPD (skat. @fig:abdpd2 attēlu). -Moduļa funkcijas tiek definētas tabulās @tbl:AB01\-@tbl:AB08. - -#figure( - caption: "Atmiņas bāzes moduļa 2.līmeņa datu plūsmas diagramma", - placement: auto, - image("img/ABDPD2.svg"), -) - -#pagebreak(weak:true) -#function-table( - "Kartīšu faila ielāde", - "AB01", - [ - Funkcija apstrādā faila saturu. Iegūstot objektus ar jautājumu dati - un ar to saistītiem metadatiem. Ieejas failam jāatbilst valodas - specifikācijai. - ], - [ - + Faila atrašanās ceļš -- #mdemFilePath\; - ], - [ - + Faila saturs tiek ielādēts atmiņā: - + Ja faila ielāde ir neveiksmīga, parāda 1. paziņojumu. - + Tiek nolasīts datums un laiks no faila sākuma, ja tāds eksistē: - + Ja datuma un laika formāts nav korekts, parāda 2. paziņojumu - ar atbilstošu iemeslu un kļūdas pazīmi, beidz apstrādi. - + Tiek iegūti jautājuma objekti, izmantojot procedūru #link()[PR01] (skat. tabulu @tbl:PR01)\; - + Ja radās kļūda, parāda 2. paziņojumu ar kļūdas informāciju, beidz - apstrādi. - + Ja kādā no apstrādes posmiem radās kļūda, parāda 2. paziņojumu - ar atbilstošu iemeslu un kļūdas pozīciju, beidz apstrādi. - ], - [ - + Saraksts ar jautājumiem -- #questionList\; - + Faila reģistrēts datums un laiks -- #datetime\; - ], - [ - + Ielādes kļūda: neizdevās atvērt failu; - + Ielādes kļūda: [kļūdas iemesls] [kļūdas rinda]:[kļūdas kolonna]; - ], -) - -#pagebreak(weak:true) -#function-table( - "Kartīšu saraksta lappušu izveidošana", - "AB02", - [ - Funkcija izveido vairākas lappuses, sadalot atmiņā esošus jautājumu - objektus intervālos. Lappušu izmērs ir noteikts ar konfigurācijas - parametrus. - ], - [ - + Jautājumu saraksts -- #questionList\; - ], - [ - + No konfigurācijas tiek iegūts jautājumu skaits lappusē, un rādāmo lappušu - pogu skaits; - + Jautājumi tiek sadalīti lappusēs, veidojot lappušu objektus, katrā tiek - ievietotas references uz jautājumiem. Lappušu pogu skaits atbilst - konfigurācijas vērtībai; - ], - [ - + Lappušu saraksts -- #pageList\; - ], - [ - Funkcijai nav paziņojumu. - ], -) - -#function-table( - "Atmiņas bāzes lappuses iegūšana", - "AB03", - [ - Funkcija iegūst jautājumu objektu intervālu - no pagaidu glabātuves. - ], - [ - + Lappuses numurs -- #uint\; - ], - [ - + No pagaidu atmiņas kartīšu glabātuves tiek iegūtas atmiņas kartīšu lappuses; - + Tiek meklēts lappušu objekts ar norādīto numuru; - + Ja lappuse tiek atrasta, saistītie atmiņas kartīšu objekti tiek atgriezti; - + Ja tāda lappuse netiek atrasta, parāda 1. paziņojumu; - ], - [ - + Jautājumu saraksts -- #questionList\; - + Datums un laiks -- #datetime\; - // @Maybe: Add 'metadata' into DPD (datums un laiks); - ], - [ - + Pieprasītā lappuse neeksistē; - ], -) - - -// TODO: for all things that save someth somewhere, say that in the Izvade - -#function-table( - "Kartīšu pievienošana", - "AB04", - [ - Funkcija pieņem lietotāja ievadīto tekstu un pārveido to jautājumu - objektos, kas pievieno tos jau esošiem jautājumiem. - ], - [ - + Kartītes pirmteksts -- #questionSource\; - ], - [ - + Ja ievadīts teksts, parāda 1. paziņojumu, beidz apstrādi; - + Apstrādā simbolu virkni, izmantojot procedūru #link()[PR01] (skat. tabulu @tbl:PR01)\; - + Ja tiek izvadīta kļūda, parāda 2. paziņojumu ar kļūdas informāciju, - beidz apstrādi; - ], - [ - Izvades jautājuma objekts tiek atjaunots atbilstošam ierakstu jautājumu pagaidu - glabātuvē. #changeIndicator\. - - + Jautājumu saraksts -- #questionList\; - ], - [ - + Nav ievadīts neviens jautājums; - + Ielādes kļūda: [kļūdas iemesls] [kļūdas rinda]:[kļūdas kolonna]; - ], -) - -#function-table( - "Kartītes pirmteksta iegūšana", - "AB05", - [ - Funkcija iegūst kartītes pirmtekstu, kas atbilst valodas specifikācijai. - Funkcija ir specializēts procedūras izmantošanas gadījums, kurā tiek - detranspilēts tikai viens jautājums. - - Funkcija ir izmantota rediģēšanas iespējai. - ], - [ - + Jautājums -- #question\; - ], - [ - + Izmantojot procedūru #link()[PR01] (skat. tabulu @tbl:PR01), jautājums tiek detranspilēts - pirmtekstā\; - ], - [ - + Kartītes pirmteksts -- #questionSource\; - ], - [ - Funkcijai nav paziņojumu. - Saskarnē parādās indikators, ka atmiņas kartīšu fails tika izmainīts. - ], -) - -#function-table( - "Kartītes rediģēšana", - "AB06", - [ - Funkcija izmaina esošo jautājumu, pēc to pirmteksta, kas atbilst - valodas specifikācijai. - ], - [ - + Norāde uz jautājumu -- #question\; - + Jautājuma pirmteksts -- #questionSource\; - ], - [ - + Ja ievades teksts ir tukšs, parāda 1. paziņojumu, beidz apstrādi; - + Izmantojot procedūru #link()[PR01] (skat. tabulu @tbl:PR01), tiek iegūts jautājuma objekts no sniegtā - pirmteksta; - + Ja tiek izvadīta kļūda, parāda 1. paziņojumu ar atbilstošu kļūdas informāciju, - beidz apstrādi; - + Padotais jautājuma objekts tiek atjaunots ar iegūta objekta datiem; - ], - [ - Izvades jautājuma objekts tiek atjaunots atbilstošam ierakstu jautājumu - pagaidu glabātuvē. #changeIndicator\. - - + Izmainīts jautājums -- #question\; - ], - [ - + Nav ievadīts neviens jautājums; - + Rediģēšanas kļūda: [kļūdas iemesls] [kļūdas rinda]:[kļūdas kolonna]; - ], -) - -#function-table( - "Kartītes dzēšana", - "AB07", - [ - Funkcija izdēš kartīti no pagaidu glabātuves. - ], - [ - + Norāde uz jautājumu -- #question\; - ], - [ - + Jautājums tiek sameklēts un izdzēsts; - ], - [ - Izvades jautājuma objekts tiek atjaunots atbilstošam ierakstu jautājumu - pagaidu glabātuvē. #changeIndicator\. - ], - [ - Funkcijai nav paziņojumu. - ], -) - -#function-table( - "Kartītes faila saglabāšana", - "AB08", - [ - Funkcija saglabā kartīšu jautājumus un metadatus tam atbilstošā - failā, pārveidojot tos valodai atbilstošā formātā. - ], - [ - + Faila atrašanās ceļš -- #mdemFilePath\; - + Jautājumu saraksts -- #questionList\; - + Datums un laiks -- #datetime\; - ], - [ - + Iegūst pirmtekstu padotajiem objektiem, izmantojot procedūru #link()[PR02] (skat. tabulu @tbl:PR02)\; - + Ja tiek izvadīta kļūda, parāda 2. paziņojumu ar kļūdas informāciju, beidz apstrādi; - + Izveido vai atver failu padotā ceļā; - + Ja atvēršana vai izveidošana neizdevās, parāda 1. paziņojumu; - + Pievienot iegūto saturu failam un saglabā to; - ], - [ - Fails tiks atjaunots failu sistēmā. - Saskarnē pazūd indikators, ka atmiņas kartīšu fails tika izmainīts. - - + Fails ar kartītes informāciju, kas atbilst datu formātam #link()[DF06] (skat. tabulu @tbl:DF06)\; - ], - [ - + Neizdevās atvērt vai izveidot atmiņas kartīšu failu; - + Rediģēšanas kļūda: [kļūdas iemesls] [kļūdas rinda]:[kļūdas kolonna]; - ], -) - - -=== Mācīšanās modulis - -Mācīšanās risinājuma kontekstā ir kartīšu prezentēšana ar interaktīvu atbildes -funkcionalitāti, atbilstoši atmiņas kartītes tipam. Šī moduļa funkcijas ir -izmantotas mācīšanās loga funkcionalitātei. Funkcijas ietver darbības ar pagaidu -glabātuvē esošām atmiņas kartītēm. Ar funkcijām saistītas datu plūsmas ir -attēlotas moduļa 2. līmeņa DPD (skat. @fig:madpd2 attēlu). -Moduļa funkcijas tiek definētas tabulās @tbl:MA01\-@tbl:MA05. - -#figure( - caption: "Mācīšanās moduļa 2.līmeņa datu plūsmas diagramma", - placement: auto, - image("img/MADPD2.svg"), -) - -#pagebreak(weak: true) -#function-table( - "Nākamās kartītes noteikšana", - "MA01", - [ - Funkcija nosaka nākamo kartīti, kas tiks parādīta lietotājam - mācīšanas procesā. Kartīšu secību nosaka mācīšanās algoritms. - ], - [ - + Norāde uz pašreizējo jautājums -- #question\; - + Algoritms -- viens no vērtībām: "fizisks", "nejaušs", "intervālu"\; - ], - [ - + Ja pagaidu kartīšu glabātuvē nav nevienas kartītes, beidz apstrādi, neatgriežot - kartīti; - + Ja padotais algoritms ir "fizisks"; - + Ja pašreizējā kartīte ir padota, izvēlās nākamo kartīti starp pagaidu kartīšu glabātuves; - + Citādi izvēlas pirmo kartīti no pagaidu kartīšu glabātuves; - + Ja padotais algoritms ir "nejaušs"; - + Izvēlas nākamo kartīti nejaušā kārtībā starp pagaidu kartīšu - glabātuves, izņemot pašžreizējo jautājumu; - + Ja padotais algoritms ir "intervālu"; - + No pagaidu kartīšu glabātuves izvēlas tikai to, kur nav norādīts intervāls - vai intervāls ir 0, izņemot pašžreizējo jautājumu; - + No šī saraksta izvēlas nākamo kartīti nejaušā kārtībā; - ], - [ - // Add null explanation - + Nākamās kartītes objekts (iespējams nulles objekts) -- #question\; - ], - [ - Funkcijai nav paziņojumu. - ], -) - -#function-table( - "Izvēles kartītes pārbaude", - "MA02", - [ - Veic jautājuma atbildes pārbaudi izvēles kartītes jautājuma veidam. - ], - [ - + Izvēlēto atbilžu simbolu virkņu saraksts ar pazīmi, vai atbilde ir izvēlēta; - + Norāde uz izvēles kartītes objektu -- #question; - ], - [ - + Izskata abus sarakstus paralēli; - + Ja atbildes un jautājuma objektu izvēles elementa pazīmes sakrīt - (piemēram, "pareizs" un "pareizs"); - + Atbilžu elementam uzstāda pareizuma pazīmi kā "pareizs"; - + Citādi uzstāda atbildes pareizuma atbildi kā "nepareizs"; - ], - [ - + #listWithCorrectFlags\; - ], - [ - Funkcijai nav paziņojumu. - ], -) - -#function-table( - "Kārtošanas kartītes pārbaude", - "MA03", - [ - Veic jautājuma atbildes pārbaudi kārtošanas kartītes jautājuma veidam. - ], - [ - + Atbilžu simbolu virkņu saraksts; - + Norāde uz kārtošanas kartītes objektu -- #question; - ], - [ - + Izskata abus sarakstus paralēli; - + Ja atbildes un jautājuma objektu izvēles elementa sakrīt, atbilžu - elementam uzstāda pareizuma pazīmi kā "pareizs"; - + Citādi uzstāda atbildes pareizuma atbildi kā "nepareizs"; - ], - [ - + #listWithCorrectFlags\; - ], - [ - Funkcijai nav paziņojumu. - ], -) - -#function-table( - "Grupēšanas kartītes pārbaude", - "MA04", - [ - Veic jautājuma atbildes pārbaudi grupēšanas kartītes jautājuma veidam. - ], - [ - + Negrupēto elementu simbolu virkņu saraksts; - + Grupētu simbolu virkņu sarakstu saraksts; - + Norāde uz grupēšanas kartītes objektu -- #question; - ], - [ - + Katram nesagrupētam elementam uzstāda pareizuma pazīmi uz "nepareizs"; - + Katru grupai atbilžu un jautājuma objekta saraksta grupu izskata paralēli; - + Elementiem, kas sakrīt abos sarakstos, atbilžu sarakstā uzstāda pareizuma - pazīmi uz "pareizs"; - + Elementiem, kas nav jautājuma atbildes grupā pareizuma pazīmi uz "nepareizs"; - ], - [ - + Negrupēto elementu simbolu virkņu saraksts ar pareizuma karodziņu vērtībām; - + Grupētu simbolu virkņu sarakstu saraksts ar pareizuma karodziņu vērtībām; - ], - [ - Funkcijai nav paziņojumu. - ], -) - -#function-table( - "Intervāla grupas atbildes sniegšana", - "MA05", - [ - Izmaina jautājuma objektu atbilstoši izvēlētam grūtības vai izpildījuma - vērtējumam veicot kartītes atbildi. Atbilstošie intervāli tiek iegūti no - konfigurācijas. - ], - [ - + Intervāla atbilde -- viens no: "nav atbildēts", "grūti", "vidēji", - "viegli", "ļoti viegli"; - + Jautājums -- #question\; - ], - [ - + No konfigurācijas glabātuves tiek iegūts intervāls, kas atbilst sniegtai - atbildei; - + Jautājumam tiek uzstādīts intervāls; - ], - [ - + Izmainīts jautājums -- #question\; - ], - [ - Funkcijai nav paziņojumu. - ], -) - -=== Konfigurācijas modulis - -Konfigurācijas modulis nodrošina parametru apstrādi, ko var personalizēt -saistībā ar mācīšanās procesu, prezentāciju uc. Šī moduļa funkcijas ir -izmantotas konfigurējot vērtības, kas tiek glabātas konfigurācijas failā un -tiek izmantotas risinājuma funkcionalitātei piemīt konfigurējamas -vērtības. Ar funkcijām saistītas datu plūsmas ir attēlotas moduļa 2. līmeņa -DPD (skat. @fig:kfdpd2 attēlu). Moduļa funkcijas tiek definētas tabulās -@tbl:KF01\-@tbl:KF03. - -#figure( - caption: "Konfigurācijas moduļa 2.līmeņa datu plūsmas diagramma", - placement: auto, - image("img/KFDPD2.svg"), -) - - -#function-table( - "Konfigurācijas vērtības iegūšana", - "KF01", - [ - Funkcijas iegūst vienu definēto konfigurācijas vērtību. - ], - [ - + Vērtības atslēga -- simbolu virkne; - ], - [ - + Ja konfigurācija vēl nebija ielādēta, tiek ielādēts konfigurācijas fails; - + Ielādētā konfigurācijā tiek sameklēts konfigurācijas vērības ieraksts; - ], - [ - + Konfigurācijas vērtība -- #configValue\; - ], - [ - + Konfigurācijas fails nav korekts, nevar nolasīt konfigurāciju; - ], -) - -#function-table( - "Konfigurācijas vērtību iegūšana", - "KF02", - [ - Funkcija iegūst visas definētās konfigurācijas vērtības. - ], - [ - + Vērtības atslēga -- simbolu virkne; - ], - [ - + Ja konfigurācija vēl nebija ielādēta, tiek ielādēts konfigurācijas fails; - + Ielādētā konfigurācijā tiek iegūtas vērtības; - ], - [ - + Konfigurācijas vērtību vārdnīca -- konfigurācijas vērtības atslēga uz #configValue\; - ], - [ - + Konfigurācijas fails nav korekts, nevar nolasīt konfigurāciju; - ], -) - -#function-table( - "Konfigurācijas vērtības izmaiņa", - "KF03", - [ - Funkcija izmaina vērtību no definētām konfigurācijas vērtībām. - ], - [ - + Vērtības atslēga -- simbolu virkne; - + Konfigurācijas vērtība -- #configValue\; - ], - [ - + Ja konfigurācija vēl nebija ielādēta, tiek ielādēts konfigurācijas fails; - + Konfigurācijas vērtība ar ievadīto atslēgu tiek izmainītu uz ievadīto konfigurācijas vērtību; - ], - [ - + Izmainīta konfigurācijas faila saturs; - ], - [ - + Konfigurācijas fails nav korekts, nevar rediģēt konfigurāciju; - ], -) - -== Nefunkcionālās prasības - -Šajā sadaļā tiks apskatītas risinājuma nefunkcionālās prasības. - -=== Veikspējas prasības - -Uz dinamisko veikspēju ir sekojošas prasības: - -+ Failu transpilēšanas ātrums ir vismaz 50000 rindas sekundē, ja teksta vērtību - garumi nepārsniedz 15 simbolus; -+ Failu transpilēšanas ātrums ir vismaz 25000 rindas sekundē, ja teksta vērtību - garumi nepārsniedz 40 simbolus; -+ Failu detranspilēšanas (saglabāšanas) ātrums ir vismaz 25000 rindas sekundē, - ja teksta vērtību garumi nepārsniedz 40 simbolus; - -=== Atribūti - -==== Lietojamība - -Uz risinājuma lietojamību ir sekojošas prasības: - -+ Visiem datiem jābūt maināmiem un redzamiem no vienkārša teksta failiem; -+ Bieži izmantojamām darbībām jābūt atbilstošiem tastatūras taustiņu īsceļiem; - -// @Complete: add some additional points - -==== Pirmkoda īpašības un uzturamība - -Pirmkodam jābūt izstrādātam ar sekojošiem nosacījumiem: - -+ Risinājuma pirmkods ir realizēts galvenokārt procedurālā stilā; -+ Transpilatora funkcionalitātes testu pārklājums ir 90%; - -==== Pārnesamība - -Uz pārnesamību risinājumam ir sekojoša prasība: kartīšu failiem ir jābūt pārnesamiem -pārkopējot visu direktoriju uz citu mašīnu. Nosacījums saglabā atgriezenisko savietojamību -vienas galvenās versijas ietvaros. - -==== Drošība - -Uz drošību risinājumam ir sekojošas prasības: - -+ Risinājuma pirmkods ir iekļauts kopā ar izpildāmo failu; -+ Risinājums nemodificē un nelasa failus, izņemot izmantotās bibliotēkas, failu - glabātuvi, standarta konfigurācijas vietu; - -#pagebreak(weak: true) -= Programmatūras projektējuma apraksts - -== Daļējs funkciju projektējums - -Apstrādājot jautājumu tekstu, tas tiek sadalīts tekstvienībās. -Tekstvienībai piemīt saturs, kas ir viens vai vairāki simboli. Tekstvienību -sarakstu ir vieglāk pārveidot jautājumu sarakstu parsēšanās procesā. Dažas -tekstvienības nesatur neko, bet ir izmantotas, lai atvieglotu parsēšanu. -Lielākā daļa no tekstvienībām satur vienu vai divus simbolus, kas veido -jautājumu struktūru un norāda jautājumu veidu. saturs ir aprakstīts tabulā -(skat. tabulu @tbl:token-table). - -Leksiskā analīzes process pieņem simbolu virkni un veido tekstvienību sarakstu -no tās. Procesa laikā tiek uzturēts un papildināts simbolu buferis, no kā tiek -iegūtas tekstvienības. Veidojot tekstvienības, tiek saglabāta informācija par -atrašanos vietu - rindu un kolonnu. Leksiskās analīzes process ir aprakstīts -aktivitāšu diagrammā (skat. attēlu @fig:lexing-activity). - -#figure( - caption: "Tekstvienības", - kind: table, - tablex( - columns: 2, - [*Tekstvienība*], [*Saturs*], - - [Jautājuma beigas], - [Simbols ">"], - - [Grupas beigas], - [Simbols ":"], - - [Svītras elementa sākums], - [Simbols "-"], - - [Plusa elementa sākums], - [Simbols "+"], - - [Secības elementa modifikators], - [Simbols "^"], - - [Pārtraukuma sākums], - [Simbols "\["], - - [Pārtraukuma beigas], - [Simbols "\]"], - - [Teksta fragments], - [ - Visi simboli, izņemot ">", ":", "-", "+", "^", "[", "]" un "\\". - Minētus simbolus var ierakstīt, ja pirms tiem ieraksta simbolu "\\". - ], - - [Pārtaukums], - [Decimāls skaitlis], - - [Faila sākums], - [Nav satura], - - [Faila beigas], - [Nav satura], - ), -) - -#figure( - caption: "Leksiskās analīzes aktivitātes diagramma", - placement: auto, - image("img/lexer_activity.svg"), -) - -Parsēšanas procesā tekstvienības tiek pārveidotas uz jautājumu objektu sarakstu -un pēdējās mācīšanās laiku, ja tāds ir norādīts. Process sākas ar mācīšanās -datuma un laika noteikšanu, kas atrodas apstrādājamās virknes sākumā. Tālāk -tiek apstrādāti jautājumi un dažādu veidu atbildes elementi, veidojot -apstrādātu jautājumu sarakstu. Process turpinās līdz visas tekstvienības ir -apstrādātas. Ja procesā rodas kļūdas -- sastopamas negaidāmas tekstvienības, -neveiksmīga datuma un laika formāta parsēšana, pārtraukuma parsēšana u.c. -- -tiek atgriezta kļūda, kas paskaidro kļūdas cēloni. Parsēšanas process ir -aprakstīts aktivitāšu diagrammā (skat. attēlu @fig:parsing-activity). - -Aktivitātē ir izmantota jautājumu parēšanas: apakšaktivitāte (skat. attēlu -@fig:parsing-answer-activity), kas apraksta viena jautājuma tekstvienību -jautājumu apstrādi. Process sākas ar vairāku karodziņu uzstādīšanu, kas tiek -izmantoti jautājumu veidu noteikšanai. Tiek noteikts atbildes elementa veids no -tekstvienību secības. Tiek veidots saraksts ar jautājumu elementiem, kurā tiek -pievienotas apskatāmas vērtības. Ja elementu vērtībās ir pretrunas, piemēram, -izvēles elements ar secības jautājumu, secības modifikators elementā ar grupas -atdalītāju u.c., apstrāde tiek beigta, izvadot kļūdu. Process turpinās līdz -tiek sastapts nākamā jautājuma sākums vai tekstvienību saraksta beigas. - -#figure( - caption: "Parsēšanas aktivitātes diagramma", - placement: auto, - image("img/parsing_activity.svg"), -) - -#figure( - caption: "Atbilžu parsēšanas aktivitātes diagramma", - placement: auto, - image("img/parsing_answer_activity.svg"), -) - -Mācīšanas procesā jautājumi tiek izvēlēti, izmantojot trīs algoritmus pēc -lietotāja izvēles (katrs algoritms neiekļauj pašreizējo jautājumu izvēlē): - -+ intervālu -- nākamais jautājums tiek izvēlēts nejaušā kārtībā starp tiem - jautājumiem, kā pārtraukums pēc pēdējās mācīšanās reizes ir beidzies vai - nemaz tas nebija uzstādīts; -+ nejaušais -- nākamais jautājums tiek izvēlēts nejaušā kārtībā; -+ primārais -- nākamais jautājums ir nākamais pēc pozīcijas failā. - -Nākamā jautājuma izvēles process atajauno jautājumu pārtraukumus, balstoties uz -tagadējo laiku, un izvēlas nākamo jautājumu atbilstoši izvēlētam algoritmam. -Process ir aprakstīts nākamā jautājuma noteikšanas aktivitātes diagrammā -(skat. @fig:next-question-activity). - -#figure( - caption: "Nākamā jautājuma noteikšanas aktivitātes diagramma", - placement: auto, - image("img/next_question_activity.svg"), -) - -#pagebreak(weak: true) -== Saskarnes projektējums - -// TODO vai LIETOTNĒ ir pēdējais mācīšanās laiku ar INTERFĀLU metodi - -Lietotnes pamatā ir kartīšu saraksta skats (skat. @fig:mdem-list-view) satur -informāciju par atmiņas kartīšu direktoriju un kartīšu faila saturu. Kartīšu -informācija iekļauj kartīšu faila direktorija nosaukumu, apskatāmā atmiņas -kartīšu faila nosaukumu un tā pēdējo mācīšanās laiku. Atmiņas bāzes faila -saraksts rāda visus atmiņas kartītes failus un apakšdirektorijus ar atmiņas -kartīšu failiem, kas tiek izmantoti organizēšanai. Atmiņas kartīšu saraksts -attēlo pagaidu atmiņas kartīšu glabātuves sarakstu. Katrai kartītei sarakstā -var apskatīties atbildi, to rediģēt vai dzēst. - -Konfigurācijas skats (skat. attēlu @fig:config-view), redaktora skats (skat -attēlu @fig:editor-view), un apmācības skats (skat. attēlu @fig:help-view) un -jautājumu skati (skat. attēlus -@fig:answer-question-view\-@fig:group-question-view) ir logi, kas ir atverami -no atmiņas kartīšu skata. Jautājumu skats tiek pārveidots uz citu jautājuma -veida skatu viena loga ietvaros. Katra skata logs var būt tikai vienā -eksemplārā, i.e., var tikt atvērts tikai viens katra veida logs vienas -lietotnes instances ietvaros. Ekrānskatu plūsma ir attēlota ekrānskatu plūsmas -diagrammā. - -//lietotnes TODO termin instance - -#figure( - caption: "Ekrānskatu plūsmas diagramma", - placement: auto, - image("img/view_flow_diagram.svg"), -) - - -Kartītes var pievienot un rediģēt, izmantojot kartīšu redaktoru (skat. attēlu -@fig:editor-view). Kartīšu redaktors ir logs, kas tiek parādīts, uzpiežot -uz "Pievienot" vai "Rediģēt", kur var ievadīt tekstu. Ja kartīte tiek rediģēta, -tajā tiek uzģenerēts jautājuma pirmteksts, ko var izmainīt un saglabāt sarakstā -esošai kartītei. Ja kartīti(/-es) pievieno, redaktors ir tukšs un tajā var -ierakstīt vienu vai vairākas kartītes vienlaicīgi. Redaktora poga "Saglabāt" -izsauc ievadītās kartītes(/-šu) transpilēšanu, rediģē vai pievieno -kartīti(/-tes), ja transpilēšana veiksmīga, un parāda kļūdu, ja transpilēšana -nav veiksmīga. - -// TODO: all document teksts -> pirmteksts for questions - -#figure( - caption: "Kartīšu saraksta skats", - placement: auto, - image("img/screens/mdem_list.png"), -) - -#figure( - caption: "Kartīšu redaktora skats", - placement: auto, - image("img/screens/question_editor.png"), -) - -// Overall -Ja atrodoties faila sarakstā ar kartītēm, uzspiež pogu "Mācīties", parādās -viens no jautājumu skatiem. Jautājumu skati tiek rādīti pēc kārtas spiežot pogu -"Nākamais", atbilstoši mācīšanās algoritmam. Katram jautājumam ir sava -mācīšanās skata variācija. Katra variācija satur jautājuma priekšas tesktu. -Atkarībā no jautājuma ir pieejama pārbaudīšanas un atbildes parādīšanas -funkcija. - -// Question type -Atbildes jautājuma skatā ir paslēptas atbildes teksts ar vienu vai vairākiem -atbildes teksta elementiem (skat. attēlu @fig:answer-question-view). Izvēles -jautājuma skatā (skat. attēlu @fig:choice-question-view) ir saraksts ar izvēlēm -ar pārbaudes funkciju. Secības jautājuma skatā (skat. attēlu -@fig:order-question-view) ir saraksts ar vairākiem elementiem, kuru secību var -pārkārtot. Secības jautājumam ir pieejama pārbaudes un pareizās atbildes -parādīšanas funkcijas. Grupēšanas jautājuma skatā ir saraksts ar visiem grupu -elementiem un tukšiem sarakstiem katrai grupai. Tā ietvaros var sagrupēt -elementus pa grupām, pārbaudīt un parādīt pareizo atbildi. - -#figure( - caption: "Atbildes jautājuma skats", - placement: auto, - image("img/screens/answer_question.png"), -) - -#figure( - caption: "Izvēles jautājuma skats", - placement: auto, - image("img/screens/multiple_answer_question.png"), -) - -#figure( - caption: "Secības jautājuma skats", - placement: auto, - image("img/screens/order_question.png"), -) - -#figure( - caption: "Grupēšanas jautājuma skats", - placement: auto, - image("img/screens/group_question.png"), -) - -Ja tiek izmantots "Intervālu" mācišanās algoritms, tad pēc atbildes parādīšanas -un pārbaudes, ja tāda ir, tiek parādīta izvēle ar intervāliem, ko izvēloties -jautājumiem tiek pievienots pārtraukums atbilstoši konfigurācijā uzstādītu -vērtību (skat. attēlu @fig:interval-answer). Ja pārtraukums nav vajadzīgs, -intervālu var neizvēlēties. Ja tika uzspiests nepareizs intervāls, izvēli var -pamainīt, uzspiežot uz citu intervāla pogu. Mācīšanas laiks un intervālu -atbildes tiek piefiksētas sesijas laikā pagaidu glabātuvē. Lai mācīšanās laiks -un pārtraukumi pēc norādītām atbildēm ir saglabāti pēc lietotāja pieprasījuma -spiežot uz "Saglabāt progresu". - -#figure( -caption: "Intervāla atbildes izvēle", - placement: auto, - image("img/screens/interval_answer.png"), -) - -Konfigurācijas skats (skat. attēlu @fig:config-view) satur vairākus laukus -pieejamo lietotnes konfigurācijas parametru vērtību norādīšanai. Skata lejā ir -pieejamas konfigurācijas ielādes un saglabāšanas funckijas. Spiežot uz pogu -"Saglabāt" konfigurācija tiek saglabāta konfigurācijas glabātuvē. Savukārt, -spiežot uz pogu "Ielādēt" konfigurācija tiek ielādeta konfigurācijas glabātuves. - -#figure( - caption: "Konfigurācijas skats", - placement: auto, - image("img/screens/config.png"), -) - -Apmācības skats (skat. attēlu @fig:help-view) satur pamācību par lietotnes -informāciju. Apmācības skata saturs ir definēts ar statisku HTML dokumentu, kas -tiek ielādēts ar kompilācijas. Dokuments satur aprakstu par lietotnes izmantošanu -- -atmiņas kartīšanas definēšanu, kārtīšu pārvaldību, mācīšanos u.c. -// @Check: check if I said what is in the document corretly - -#figure( - caption: "Apmācības skats", - placement: auto, - image("img/screens/help.png"), -) - -#pagebreak(weak: true) -= Testēšanas dokumentācija - -== Testēšanas apraksts - -Lietotnes programmatūra ir testēta, izmantojot automatizētus vienību un -integrācijas testus un manuālus integrācijas testus. Funkcionālie testi ir -veikti, izmantojot melnās kastes tehnikas. Veiktais nefunkcionālais tests ir -automatizēts veiktspējas tests. - -Automatizētie funkcionālie un nefunkcionālie testi ir veikti, izmantojot -bibliotēku "GTest". Testi ir darbināmi ar kompilācijas procesā izveidotu -izpildāmo failu. Izpildot testus konsolē tiek izvadīti testu rezultāti. -Rezultāti atspoguļo, vai testa failu definētās testa funkciju apgalbojumi -piepildās vai ne. Automatizēti testi ir iekļauti pamata pirmkoda repozitorijā -(skat. nodaļu #link()["Konfigurācijas pārvaldība"]). -Automatizēti testi tiek izmantoti, testējot transpilatora moduļa funkcionalitātei. - -Manuālie integrācijas testi tiek veikti, izmantojot lietotāju saskarni. Testi -ir dokumentēti tabulās norādot testa gadījuma nosaukumu, pirmsnosacījumus, -aprakstu, ievadi, izpildi, sagaidāmo rezultātu un rezultātu ("OK" -- rezultāts -atbilst sagaidāmam, "NOK" -- rezultāts neatbilst sagaidāmam). Daļa no testa -gadījumiem ir aprakstīti tabulās @tbl:TG01\-TODO. Pamata testēšanas gadījumu -dokumentācija ir veidota izklājlapā. - -== Manuālā testēšana - -/* -#testcase-table( - "", - "TG00", - "", - [ - ], - [ - ], - [ - ], - [ - ], - "", -) -*/ - -#testcase-table( - "Dažāda veida jautājumu apstrāde", - "TG01", - "Ir atvērta atmiņas bāze, ar testējamiem failiem.", - [ - Tests pārbauda vai tiek ielādēts fails ar dažādiem jautājumu veidiem. - ], - [ - Jautājuma fails, kur ir vairāki jautājumi ar dažādiem veidiem: atbildes - jautājums, izvēles jautājums, secības jautājums, grupēšanas jautājums. - ], - [ - Ievades fails tiek izvēlēts atmiņas bāzes sarakstā. - ], - [ - Visi jautājumi ir pareizi atspoguļoti sarakstā -- parādās to sākums un atbildes elementi. - ], - "", -) - - -#testcase-table( - "Transpilācijas kļūda parāda paziņojumu par kļūdu", - "TG02", - "", - [ - ], - [ - ], - [ - ], - [ - ], - "", -) - -#testcase-table( - "Jautājums tiek izdzēst tikai pagaidu glabātuvē", - "TG03", - "", - [ - ], - [ - ], - [ - ], - [ - ], - "", -) - -#testcase-table( - "Tiek pievienots viens jautājums", - "TG04", - "", - [ - ], - [ - ], - [ - ], - [ - ], - "", -) - -#testcase-table( - "Tiek pievienoti vairāki dažādu veidu jautājumi", - "TG05", - "", - [ - ], - [ - ], - [ - ], - [ - ], - "", -) - -#testcase-table( - "Tiek pievienoti vairāki dažādu veidu jautājumi", - "TG06", - "", - [ - ], - [ - ], - [ - ], - [ - ], - "", -) - -// @Question: Cik testu dokumentācijas gadījumus jāiekļauj? -// @Improvement: Describe (introduce) what is "atmiņas bāze explicitly". - -#pagebreak(weak: true) -= Projekta organizācija - -== Projekta organizācijas apraksts - -Kvalifikācijas darba prasības nosaka, ka programmatūras produktu un -dokumentāciju izstrādā darba autors patstāvīgi. Projektam ir noteikts un -stingrs termiņš. Patstāvīga projekta veidošana atvieglo organizāciju, jo darbs -ir jāorganizē tikai vienam cilvēkam un nevar rasties komunikācijas problēmas. -Datu specifikācijas savākšana ir atvieglota, jo pasūtītājs šī darba ietvaros ir -darba autors. - -Programmatūras un dokumentācijas izstrāde bija veikta iteratīvi, pielietojot -spējo metodi. Izstrādes gaita tika sadalīta aptuvenās fāzēs: prototipēšana, -specifikācija izstrāde un testēšana. Fāzes aktivitātes nav ierobežotas tikai uz fāzei -atbilstošām aktivitātēm. Dokumentācijas veidošana bija veikta katras fāzes -ietvaros. - -== Prototipēšanas fāze - -== Specifikācijas un izstrādes fāze - -== Testēšanas fāze - -/* -# Questions -- Ko var pielikt saistībā ar programmatūras izstrādi -- bibliotēkas etc?; -*/ - -#pagebreak(weak: true) -= Kvalitātes nodrošināšana - -#pagebreak(weak: true) -= Konfigurācijas pārvaldība - -Pirmkods ir pārvaldīts, izmantojot konfigurācijas pārvaldības sistēmu "git". -Pirmkoda repozitorijs, saturot vienu zaru "main" vienkāršumam. Repozitorijs ir -mitināts, izmantojot "GitHub" platformu. Repozitorijā ir iekļauta dokumentācija -programmatūras pirmkods un tās konfigurācijas faili un uzbūvēšanas sistēmas -"CMake faili". - -#pagebreak(weak: true) -= Darbietiplības novērtējums - -Tā kā programmatūras produkts ir izstrādāts, darbietilpību novertēt, izmantojot -loģiskās koda rindiņu skaitu projektā. - -#figure( - caption: "CLOC rīka rezultāts", - placement: auto, - image("img/screens/cloc.png"), -) - -#pagebreak(weak: true) -= Secinājumi - - -#pagebreak(weak: true) -#heading(numbering: none, "Izmantotā literatūra un avoti") - -+ #hyperlink-source( - "Alison Voice and Arran Stirton", - [Spaced Repetition: towards more effective learning in STEM, 2020. TODO], - "https://web.archive.org/web/20171019211402/https://www.loc.gov/standards/datetime/ISO_DIS%208601-1.pdf", - std.datetime( - year: 2024, - month: 10, - day: 12, - ), -) - -+ #hyperlink-source( - "Institūcija \"Latvijas standarts\"", - [LVS 68:1996 "Programmatūras prasību specifikācijas ceļvedis". 1996. marts], - "", - none -) - -+ #hyperlink-source( - "Institūcija \"Latvijas standarts\"", - [LVS 72:1996 "Ieteicamā prakse programmatūras projektējuma aprakstīšanai". 1996, marts], - "", - none -) - - -+ #hyperlink-source( - "Paul Sexton", - [Org-drill.el – flashcards and spaced repetition for org-mode], - "https://orgmode.org/worg/org-contrib/org-drill.html", - std.datetime( - year: 2024, - month: 10, - day: 21, - ), -) - -+ #hyperlink-source( - "", - [What are flashcard sets?], - "https://help.quizlet.com/hc/en-us/articles/360032006352-What-are-flashcard-sets", - std.datetime( - year: 2024, - month: 10, - day: 21, - ), -) - -+ #hyperlink-source( - "OMG (Object Management Group)", - [Unified Modeling Language (v2.5). 2015. jūnijs], - "https://www.omg.org/spec/UML/2.5/PDF", - std.datetime( - year: 2024, - month: 11, - day: 04, - ), -) - - -#pagebreak(weak: true) -#heading(numbering: none, "Pielikumi") - -// TODO caption -```cpp -std::vector tokens; -std::vector buffer; -int32_t row; -int32_t column; -int32_t previousRow; -int32_t previousColumn; -bool textStarted = false; -bool identifierStarted = false; -bool sof; - -/* - * TODO - */ -void trimString(std::string &str, std::string trimChars) { - - // Noņem kreisās puses simbolus. - int padSize = 0; - bool pad = false; - for (size_t i = 0; i < str.size(); ++i) { - for (size_t k = 0; k < trimChars.size(); ++k) { - if (str[i] == trimChars[k]) { - padSize++; - pad = true; - break; - } - } - if (!pad) { - break; - } - pad = false; - } - if (padSize > 0) { - str.erase(0, padSize); - } - - // Noņem labās puses simbolus. - padSize = 0; - pad = false; - for (size_t i = str.size(); i-- > 0;) { - for (size_t k = 0; k < trimChars.size(); ++k) { - if (str[i] == trimChars[k]) { - padSize++; - pad = true; - break; - } - } - if (!pad) { - break; - } - pad = false; - } - if (padSize > 0) { - str.erase(str.end() - padSize, str.end()); - } -} - -/* - * Izveido tekstvienību, iegūstot to no bufera beigām. - * Ja buferī ir teksta vienība pirms tekstvienības, pievieno to pirms beigu - * tekstvienības. - */ -void tokenWithBuffer( - TokenType ttype, - size_t tokenLen, - TokenType textType -) { - std::string token(buffer.end() - tokenLen, buffer.end()); - if (buffer.size() > tokenLen) { - std::string prevFragment(buffer.begin(), buffer.end() - tokenLen); - trimString(prevFragment, " \n\t"); - if (prevFragment.length() > 0) { - tokens.push_back(Token{ - textType, - prevFragment, - previousRow, - previousColumn - }); - } - } - buffer.clear(); - - tokens.push_back(Token{ - ttype, - token, - row, - column - }); - - previousRow = row; - previousColumn = column; - buffer.clear(); -} - -/* - * Pārveido simbolu virkni tekstvienību sarakstā. - * */ -Result> tokenizeMdem(const std::string& content) { - row = 1; - column = 1; - previousRow = 1; - previousColumn = 1; - textStarted = false; - tokens.clear(); - buffer.clear(); - - // Beidz, ja satur tikai tukšumus vai neko. - if (content.find_first_not_of(" \n\t") == std::string::npos) { - return {tokens, ""}; - } - - for (size_t i = 0; i < content.size(); ++i) { - char c = content[i]; - - // Apstrādā īpašos simbolus un tekstu. - if (c == '\n') { - row += 1; - column = 0; - } - if (c == '\\') { - i += 1; - if (i < content.size()) { - buffer.push_back(content[i]); - } - continue; - } else { - buffer.push_back(c); - } - if (!textStarted) { - if (c == '\n') { - previousRow += 1; - previousColumn = 1; - } else if (c == ' ') { - previousColumn += 1; - } else if (c == '\t') { - previousColumn += 4; - } else { - textStarted = true; - } - } - - // Emitē tekstvienības. - switch (c) { - case '[': { - tokenWithBuffer( - TokenType::CooldownStart, - 1, - TokenType::TextFragment - ); - previousRow = row; - previousColumn = column; - textStarted = false; - identifierStarted = true; - } break; - case ']': { - if (!identifierStarted) { - return { - tokens, - "Cannot end identifier if it is not started", - tokens[i].row, - tokens[i].column - }; - } - tokenWithBuffer( - TokenType::CooldownEnd, - 1, - TokenType::Cooldown - ); - previousRow = row; - previousColumn = column; - textStarted = false; - identifierStarted = false; - } break; - case '-': { - tokenWithBuffer( - TokenType::ElementDashStart, - 1, - TokenType::TextFragment - ); - previousRow = row; - previousColumn = column; - textStarted = false; - } break; - case '^': { - tokenWithBuffer( - TokenType::ElementOrderModifier, - 1, - TokenType::TextFragment - ); - previousRow = row; - previousColumn = column; - textStarted = false; - } break; - case ':': { - tokenWithBuffer( - TokenType::MatchGroupEnd, - 1, - TokenType::TextFragment - ); - previousRow = row; - previousColumn = column; - textStarted = false; - } break; - case '>': { - tokenWithBuffer( - TokenType::QuestionEnd, - 1, - TokenType::TextFragment - ); - previousRow = row; - previousColumn = column; - textStarted = false; - } break; - case '+': { - tokenWithBuffer( - TokenType::ElementPlusStart, - 1, - TokenType::TextFragment - ); - previousRow = row; - previousColumn = column; - textStarted = false; - } break; - } - - column += 1; - } - - // Pievieno beigu simbolu, lai atvieglotu parsēšanu. - tokenWithBuffer( - TokenType::EndOfFile, - 0, - TokenType::TextFragment - ); - - if (debug) { - std::cout << "SECTION: Lexer output:\n"; - std::cout << std::format("Token count: {}", tokens.size()) << std::endl; - for (const Token& token : tokens) { - std::cout << token.toString(); - } - std::cout << "SECTION END: Lexer output\n"; - } - - return {tokens, ""}; -} - -std::string Token::toString(const TokenType* ttype) { - switch (*ttype) { - case TokenType::TextFragment: return "text fragment"; - case TokenType::QuestionEnd: return "question end symbol"; - case TokenType::MatchGroupEnd: return "match group end"; - case TokenType::ElementDashStart: return "dash element start"; - case TokenType::ElementOrderModifier: return "order element modifier"; - case TokenType::ElementPlusStart: return "plus element start"; - case TokenType::Cooldown: return "cooldown"; - case TokenType::CooldownStart: return "start of cooldown"; - case TokenType::CooldownEnd: return "end of cooldown"; - case TokenType::StartOfFile: return "start of the file"; - case TokenType::EndOfFile: return "end of file"; - default: return "unrecognized token"; - } -} -``` - -// TODO caption - -```cpp -typedef std::map> TokenAutomata; - -TokenAutomata *automata = nullptr; -/* - * Tekstvienību secības pārejas, kas nosaka, kādā secībā tekstvienības var būt. - * */ -void initParserAutomata() { - automata = new TokenAutomata; - (*automata)[TokenType::TextFragment] = { - TokenType::QuestionEnd, - TokenType::ElementDashStart, - TokenType::ElementPlusStart, - TokenType::MatchGroupEnd, - TokenType::EndOfFile, - }; - (*automata)[TokenType::MatchGroupEnd] = { - TokenType::ElementDashStart - }; - (*automata)[TokenType::QuestionEnd] = { - TokenType::ElementDashStart, - TokenType::ElementPlusStart - }; - (*automata)[TokenType::ElementDashStart] = { - TokenType::CooldownStart, - TokenType::TextFragment, - TokenType::ElementOrderModifier - }; - (*automata)[TokenType::ElementOrderModifier] = { - TokenType::TextFragment - }; - (*automata)[TokenType::ElementPlusStart] = { - TokenType::TextFragment - }; - (*automata)[TokenType::Cooldown] = { - TokenType::CooldownEnd, - }; - (*automata)[TokenType::CooldownStart] = { - TokenType::Cooldown - }; - (*automata)[TokenType::CooldownEnd] = { - TokenType::TextFragment - }; - (*automata)[TokenType::StartOfFile] = { - TokenType::TextFragment, - TokenType::ElementDashStart, - TokenType::EndOfFile - }; - (*automata)[TokenType::EndOfFile] = {}; -} - -/* - * Pārbauda, vai vai tekstvienību sarakstu akceptē atbilst atbilst valodas - * automāts. - * */ -Result ValidateGrammar(const std::vector& tokens) { - if (!automata) { - initParserAutomata(); - } - for (size_t i = 0; i < tokens.size() - 1; ++i) { - Token token = tokens[i]; - Token nextToken = tokens[i + 1]; - if ( - std::find( - (*automata)[token.tokenType].begin(), - (*automata)[token.tokenType].end(), - nextToken.tokenType - ) == (*automata)[token.tokenType].end()) { - - auto capitalize = [](const std::string& str) { - if (str.empty()) return str; - std::string result = str; - result[0] = std::towupper(result[0]); - return result; - }; - return { - .error=std::format( - "Invalid token sequence: {} cannot precede {}", - std::string(capitalize(Token::toString(&token.tokenType))), - std::string(capitalize(Token::toString(&nextToken.tokenType))) - ), - .row=token.row, - .column=token.column - }; - } - } - return {}; -} - -// @Fix: Prevent duplicate group names and questions in ordered question (to -// simplify checking in practice). -Result parseQuestions(const std::vector& tokens) { - auto questions = std::vector(); - time_t time = 0; - - auto makeResult = [&questions, &time](std::string error, Token token) -> Result { - return { - { questions, time }, - error, - token.row, - token.column - }; - }; - - if (tokens.size() == 0) { - return makeResult("", Token()); - } - - auto result = ValidateGrammar(tokens); - if (result.error.length() > 0) { - return makeResult( - result.error, - Token{.row=result.row, .column=result.column} - ); - } - - std::string section; - size_t i = 0; - - if (debug) { - std::cout << "SECTION: Parser output:\n"; - } - - auto isInBounds = [tokens](size_t i) { - return i < tokens.size() && tokens[i].tokenType != TokenType::EndOfFile; - }; - - if (isInBounds(i) && tokens[i].tokenType == TokenType::TextFragment) { - try { - auto parseToUTCTime = [](const std::string datetime, std::string format) { - std::tm tm = {}; - std::istringstream ss(datetime); - ss >> std::get_time(&tm, format.c_str()); - if (ss.fail()) { - throw std::runtime_error("Failed to parse datetime string"); - } - std::time_t time = timegm(&tm); - return time; - }; - - time = parseToUTCTime(tokens[i].content.c_str(), "%d.%m.%Y %H:%M"); - } catch (std::exception e) { - return makeResult( - std::format("cannot parse the time - {}", e.what()), - tokens[i] - ); - } - i++; - } - - while (i < tokens.size()) { - if (tokens[i].tokenType == TokenType::ElementDashStart) { - std::string questionText; - std::vector questionElements; - double cooldown; - bool isOrderQuestion = false; - bool isGroupQuestion = false; - bool isPlusQuestion = false; - - // Start element parsing & add to the offset. - if (isInBounds(i + 1) && tokens[i + 1].tokenType == TokenType::ElementOrderModifier) { - return makeResult( - "cannot have order modifier ('^') in the question definition", - tokens[i + 1] - ); - } - if (isInBounds(i + 1) && tokens[i + 1].tokenType == TokenType::CooldownStart) { - try { - cooldown = std::stod(tokens[i + 2].content); - } catch (std::exception e) { - return makeResult( - "error parsing cooldown", - tokens[i + 1] - ); - } - questionText = tokens[i + 4].content; - i += 6; - } else { - cooldown = 0; - questionText = tokens[i + 1].content; - i += 3; - } - - // Parse elements of a question. - while (isInBounds(i)) { - - // Check question end. - if (isInBounds(i + 3) && tokens[i].tokenType == TokenType::ElementDashStart) { - // Distance to the possible question end. - size_t offset; - if (tokens[i + 1].tokenType == TokenType::ElementOrderModifier) { - offset = tokens[i + 2].tokenType == TokenType::CooldownStart ? 6 : 3; - } else { - offset = tokens[i + 1].tokenType == TokenType::CooldownStart ? 5 : 2; - } - if (isInBounds(i + offset) && tokens[i + offset].tokenType == TokenType::QuestionEnd) { - break; - } - if (offset == 5 && tokens[i + 5].tokenType != TokenType::QuestionEnd) { - // Cannot place the identifier on the ordinary element. - return makeResult( - "Invalid identifier placement", - tokens[i] - ); - } - } - - // Determine element type. - bool isDash; - bool isGroup = false; - bool isOrder = false; - if (tokens[i].tokenType == TokenType::ElementDashStart) { - isDash = true; - } else { - isDash = false; - isPlusQuestion = true; - } - if (isInBounds(i+1) && tokens[i + 1].tokenType == TokenType::ElementOrderModifier) { - isOrder = true; - isOrderQuestion = true; - if (!isDash) { - return makeResult( - "order questions can only be used with dashes ('-')", - tokens[i] - ); - } - if (isGroupQuestion) { - return makeResult( - "question with groups cannot be ordered ('-^' and ':')", - tokens[i] - ); - } - if (isInBounds(i + 3) && tokens[i + 3].tokenType == TokenType::MatchGroupEnd) { - return makeResult( - "cannot have groups in order question('-^' and ':')", - tokens[i] - ); - } - } - if (isInBounds(i + 2) && tokens[i + 2].tokenType == TokenType::MatchGroupEnd) { - isGroup = true; - isGroupQuestion = true; - if (!isDash) { - return makeResult( - "group questions can only be used with dashes ('-')", - tokens[i] - ); - } - } - - QuestionElement questionElement; - questionElement.isDash = isDash; - questionElement.isGroup = isGroup; - if (isOrder) { - questionElement.content = tokens[i + 2].content; - } else { - questionElement.content = tokens[i + 1].content; - } - questionElements.push_back(questionElement); - - size_t offset = 2; - if (isOrder) { - offset += 1; - } - if (isGroup) { - offset += 1; - } - - i += offset; - } - - if (questionElements.size() > 0) { - if (isGroupQuestion) { - auto *question = new GroupQuestion(); - question->cooldown = cooldown; - question->questionText = questionText; - question->section = section; - int32_t k = -1; - for (size_t i = 0; i < questionElements.size(); ++i) { - auto questionElement = questionElements[i]; - if (questionElement.isGroup) { - ++k; - auto group = Group(); - group.name = cleanContent(questionElement.content); - question->groups.push_back(group); - } else { - if (k >= 0) { - question->groups[k].elements.push_back( - cleanContent( - questionElement.content - ) - ); - } - } - } - questions.push_back(question); - if (debug) { - std::cout << question->toString() << "\n"; - } - } else { - auto *question = new MultiElementQuestion(); - question->cooldown = cooldown; - question->questionText = cleanContent(questionText); - question->section = section; - for (const auto& elem : questionElements) { - Choice choice; - choice.answer = cleanContent(elem.content); - choice.isCorrect = !elem.isDash; - question->choices.push_back(choice); - } - questions.push_back(question); - if (isPlusQuestion) { - question->type = MultiElementType::MultiChoice; - } else if (isOrderQuestion) { - question->type = MultiElementType::Order; - } else { - question->type = MultiElementType::Regular; - } - if (debug) { - std::cout << question->toString() << "\n"; - } - } - } - } else if (tokens[i].tokenType == TokenType::EndOfFile) { - if (debug) { - std::cout << "File terminated: EndOfFile\n"; - } - break; - } else { - return makeResult( - "Unexpected token encountered", - tokens[i] - ); - } - } - - if (debug) { - std::cout << "SECTION END: Parser output:\n"; - } - return makeResult( - "", - Token() - ); -} - -std::string MultiElementQuestion::toString() const { - std::stringstream ss; - for (const auto& choice : choices) { - char opener; - if (type == MultiElementType::Order) { - opener = '^'; - } else if (choice.isCorrect) { - opener = '+'; - } else { - opener = '-'; - } - ss << opener << " " << choice.answer << "; "; - } - return std::format( - "\nsection:{}\nid:{}\n{}\n{}", - section, - cooldown, - questionText, - ss.str() - ); -} - -std::string GroupQuestion::toString() const { - std::stringstream ss; - for (auto group: groups) { - ss << group.name << ": "; - for (auto el: group.elements) { - ss << el << ", "; - } - ss << "; "; - } - return std::format( - "\nsection:{}\nid:{}\n{}\n{}", - section, - cooldown, - questionText, - ss.str() - ); -} -``` - -#pagebreak(weak: true) -#heading(numbering: none, "Dokumentārā lapa") - diff --git a/docs/questions.md b/docs/questions.md deleted file mode 100644 index 7eb688e..0000000 --- a/docs/questions.md +++ /dev/null @@ -1,23 +0,0 @@ -Labvakar! - -Funkcionālās prasības ievilkās, jo nevarēju koncentrēties uz tām, jo vēlējos ķerties klāt pie programmēšanas, jo tas būtu sarežģītākais. - -Realizēju iedomāto pamata funkcionalitāti (testus vēl neizstrādāju). Pašlaik repozitorijā ir 2728 koda rindiņas. Pieņemsim, ka testi aizņems vismaz 400 rindiņas. -Pielikumā nosūtu dokumentu ar ievadu, vispārējo aprakstu un PPS. Sākšu veidot PPA ar saskarnes aprakstu un diagrammām. - -- Dažās funkcijās kartītes (saraksts ar objektiem) iet kopā ar datumu un laiku (simbolu virkni). Vai var uzskatīt šos datus kā "kartīšu datus" vai labāk tos atdalīt DPD kā "kartīšu dati" un "metadati"? - -- Dzirdēju no Ārijas info lekcijā, ka ar tādām tabulām (izvade, apraksts, utt.), piemēram, funckiju tabulām var rasties problēmas ar plagiātu. Vai manu tabulu detalizācija ir pietiekama, lai tādas problēmas nebūtu? - -- Saskarni veidoju, izmantojot angļu valodu. Vai saskarni būtu labāk pārtulkot? - -Gaidīšu Jūsu ieteikumus par iesūtīto dokumentu. - - -Cieņā -Jorens Štekeļs - - -- Pieteikuma nosaukumā pieļāvu kļūdu: korektāk būtu "specifiskas" nevis "specifiskās"; -- TODO note about the function that doesnt have inputs from user -- TODO order the book diff --git a/docs/utils.typst b/docs/utils.typst deleted file mode 100644 index 4ff88bc..0000000 --- a/docs/utils.typst +++ /dev/null @@ -1,212 +0,0 @@ -#import "@preview/tablex:0.0.6": tablex -#import "@preview/big-todo:0.2.0": todo as TODO - -#let custom-block( - item, -) = { - set align(start) - block( - inset: 8pt, - stroke: black, - width: 100%, - spacing: 0pt, - breakable: true, - item, - ) -} - -#let longtable( - title: "", - titles: (), - caption: "", - ..items, -) = { - figure( - gap: 1.5em, - kind: table, - caption: if caption != "" { - caption - } else { - if titles.len() == 0 { - title - } else { - titles.first() - } - }, - [ - // set par(first-line-indent: 0pt) - #if titles.len() == 0 { - custom-block( - text( - weight: "bold", - title, - ), - ) - } - #for i in range( - items.pos().len(), - ) { - if titles.len() > 0 { - custom-block( - text( - weight: "bold", - titles.at(i), - ), - ) - } - custom-block( - items.pos().at(i), - ) - } - ], - ) - // linebreak() -} - -#let procedure-table( - caption: "", - ..items, -) = { - if caption == "" { - caption = items.pos().first() - } - longtable( - titles: ( - "Procedūras nosaukums", - "Procedūras identifikators", - "Procedūras apraksts", - "Ievade", - "Apstrāde", - "Izvade", - ), - caption: caption, - ..items, - ) -} - -#let format-table( - caption: "", - ..items, -) = { - if caption == "" { - caption = items.pos().first() - } - longtable( - titles: ( - "Formāta nosaukums", - "Formāta identifikators", - "Apraksts", - "Piemērs", - ), - caption: caption, - ..items, - ) -} - -#let io-table( - caption: "", - ..items, -) = { - if caption == "" { - caption = items.pos().first() - } - - longtable( - titles: ( - "Ievades/izvades vērtības nosaukums", - "Identifikators", - "Apraksts", - ), - caption: caption, - ..items, - ) -} - -#let function-table( - caption: "", - ..items, -) = { - if caption == "" { - caption = items.pos().first() - } - longtable( - titles: ( - "Funkcijas nosaukums", - "Funkcijas identifikators", - "Apraksts", - "Ievade", - "Apstrāde", - "Izvade", - "Paziņojumi", - ), - caption: caption, - ..items, - ) -} - -Manuālie integrācijas testi tiek veikti, izmantojot lietotāju saskarni. Testi -ir dokumentēti tabulās norādot testa gadījuma nosaukumu, pirmsnosacījumus, -aprakstu, ievadi, izpildi, sagaidāmo rezultātu. - -#let testcase-table( - caption: "", - ..items, -) = { - if caption == "" { - caption = items.pos().first() - } - longtable( - titles: ( - "Testa gadījuma nosaukums", - "Testa gadījuma identifikators", - "Pirmsnosacījumi", - "Apraksts", - "Ievade", - "Izpilde", - "Sagaidāmais rezultāts", - "Rezultāts", - ), - caption: caption, - ..items, - ) -} - -#let todo( - ..body, -) = { - TODO( - ..body, - inline: true, - big_text: 14pt, - small_text: 12pt, - ) -} - -#let hyperlink-source( - author, - title, - link_str, - date, -) = { - let author_part = "" - if author != "" { - author_part = [#author. ] - } - - let title_part = "" - if title != "" { - title_part = [#title. ] - } - - let link_part = "" - if link_str != "" { - link_part = [Pieejams: #link(link_str). ] - } - - let date_part = "" - if date != none { - date_part = [Aplūkots #date.display("[day].[month].[year]"). ] - } - - [#author_part#title_part#link_part#date_part] -}