#import "layout.typst": project, indent-par
#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,
  [
    / API: lietojumprogrammu saskarne (angl. Application Program Interface);
    / Markdown: TODO;
    / Atzīmēšanas valoda: TODO;
	// TODO: add all the terms
  ],
)


#pagebreak(weak: true)

= Ievads

== Nolūks

#indent-par([
	Šī 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 

// 1) identificēt programmatūras produkta nosaukumu, piemēram, "Pārskatu ģenerators", utt.,
// 2) paskaidrot kas programmatūras produktam jādara un, ja nepieciešams, kas
// nav jādara;
// 3) aprakstīt programmatūras produkta pielietojumu.
// a) Aprakstīt, cik iespējams precīzi, iespējas, centienus un mērķi. Piemēram,
// teikums: iespēja efektīvi izstrādāt pārskatus nav tik labs, kā parametrizēti,
// lietotāja vadīti un definēti pārskati divu stundu laikā, ar iespēju ievadīt
// lietotāja parametrus dialoga režīmā.
// b) Nepieļaut pretrunas, lietojot terminus, kas līdzīgi terminiem augstāka
// līmeņa LVS 68:1996 lpp. 15. (22) specifikācijā (piemēram, Sistēmprasību


// Kas ir atmiņas kartes
#indent-par([
	Atmiņas kartītes (angl. flashcards) ir izplatīts veids, kā skolēni, studenti un
	citi macošies cilvēki iegaumē materiālu. Šādu kartīšu pamatā parasti ir priekša
	un aizmugura. 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 atbildāmi 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. Jo lielāka ir subjektīva
piepūle, atbildot uz jautājumu vai risinot uzdevumu, jo tiek uzturēts garāks
pārtraukums pirms nākamās reizes, kad šī kartīte būs izmantota. Šī mācīšanās 
metode ir atkārtošana ar intervāliem.
// TODO: add reference.

// 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īies izmantojot atkārtošanu ar intervāliem. Atmiņas
kartītī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īšanu 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. 

// TODO: add someth??

// The name
Programmatūras produkta nosaukums ir "Mdemory", kas ir darināts nosaukums no
"MD" (atzī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


== 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.

// apraksts: Vispārējs apraksts
// TODO

// apraksts: Programmatūras prasību specifikācija
// TODO

// apraksts: Programmatūras projektējuma apraksts
// TODO

#pagebreak(weak: true)
#set heading(numbering: "1.1.")
= Vispārējais apraksts

== Esošā stāvokļa apraksts

Esošie atmiņas kartīšu risinājumi galvenokārt atbalsta atmiņas 
kartīšu importu ar vienkāršu tekstu. Taču lielākā daļa nedod iespēju
uzturēt kartītes bez vienkāršā tekstā, jo risinājumi glabā kartītes
savā, pielāgotā formātā. 

Daži risinājumi iekļauj arī vairākus specializētus jautājumu veidus, kā grupēšanas 
jautājumi, vairāku atbilžu jautājumus un secības jautājumus. Tādu risinājumu piemērs ir 
"Quizlet" lietotne. Minētā importa funkcija parasti nav pieejama esošos risinājumos.
To importa funkcionalitāte realizē vienkāršu importu visbiežāk ar mērķi migrēt atmiņas kartītes
vienas lietotnes ietvaros. 

// org-drill
Diezgan tuvs pēc funckionalitātes mērķiem ir "Emacs" teksta editora
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 ar augstu pielāgojamību. Toties tas pieprasa
"Emacs" teksta editora izmantošanu un ir domāta tehniskākiem lietotājiem mazāk 
lietotājiem draudzīgas funkcionalitātes dēļ. 

Pašlaik neviens no esošiem risinājumiem neatbalsta minēto specializēto atmiņas
kartīšu veidu importu.

== 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 darbvirmas 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.

#figure(
  caption: "0.līmeņa datu plūsmas diagramma",
  placement: auto,
  image("img/DPD0.svg"),
) <dpd0>

== 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.

== 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

== Funkcionālās prasības

=== Augsta līmeņa valodas specifikācija 

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. Katrs jautājums sākas ar priekšu, kam
var būt skaitlis, kas apzīmē intervālu stundās, pēc kura tas būs atkārtoti izmantots.

```
- Ka sauc Latvijas galvaspilsētu? >
	[...]
- [12.5] Ka sauc Igaunijas galvaspilsētu? >
	[...]
```

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ļņus
- Nosauciet Baltijas valstis >
	- Latvija 
	- Igaunija 
	- Lietuva 
```

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
```
Secības jautājums.

```
- Sakārtojiet zinātniskās metodes soļus pareizā secībā > 
	-^ Uzdod jautājumu
	-^ Izvirza hipotēzi
	-^ Veic eksperimentu
	-^ Analizē datus
```

==== Grupēšanas jautājums

// TODO

```
- Savienojiet planētas ar to īpašībām >
		- Zeme:
				- Satur dzīvi
		- Jupiters:
				- Lielākā planēta
				- Ir gredzeni
		- Venēra:
		- Merkurs:
			- Mazākā
		- Saturns:
			- Ir gredzeni
		- Neptūns:
			- Tālākā no saules
			- Ir gredzeni
```

=== Jautājumu datu struktūra

// TODO jautājumu veidi

// TODO lappuse

=== 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"),
) <dpd1>

#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>)[AB01]],
    [Kartīšu saraksta lappušu izveidošana],  [#link(<AB02>)[AB02]],
    [Atmiņas bāzes lappuses iegūšana],       [#link(<AB03>)[AB03]],
    [Kartīšu pievienošana],                  [#link(<AB04>)[AB04]],
	[Kartītes pirmteksta iegūšana],          [#link(<AB05>)[AB05]],
	[Kartītes redigēšana],                   [#link(<AB06>)[AB06]],
    [Kartītes dzēšana],                      [#link(<AB07>)[AB07]],
    [Kartītes faila saglabāšana],            [#link(<AB08>)[AB08]],

    rowspanx(5)[Mācīšanās modulis],
    [Nākamās kartītes noteikšana],           [#link(<MA01>)[MA01]],
    [Izvēles kartītes pārbaude],             [#link(<MA02>)[MA02]],
    [Kārtošanas kartītes pārbaude],          [#link(<MA03>)[MA03]],
    [Grupēšanas kartītes pārbaude],          [#link(<MA04>)[MA04]],
    [Intervāla grupas atbildes sniegšana],   [#link(<MA05>)[MA05]],
	// un meta datu saglabāšana

    rowspanx(3)[Konfigurācijas modulis],
    [Konfigurācijas vērtības iegūšana],      [#link(<KF01>)[KF01]],
    [Konfigurācijas vērtību iegūšana],       [#link(<KF02>)[KF02]],
    [Konfigurācijas vērtības izmaiņa],       [#link(<KF03>)[KF03]],

  ),
) <function_table>

=== Kopīgas procedūras

Vairākas prasībās definētās funkcijas izmanto kopīgas procedūras, kas tiek 
definētas tabulās: #link(<PR01>)[PR01], #link(<PR02>)[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.
  ],
  [
  	+ Simbolu virkne;
  ],
  [
	+ 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 (jeb kartītes priekša);
		+ 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 "-^" -- izvēles 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;
	+ Kļūda ar tekstu un tās pozīciju saturā;
  ],
) <PR01>

#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;
	+ Datums un laiks;
  ],
  [
  	+ Iegūst konfigurācijas vērtības, kas nosaka cik plats ir tabulācijas simbols 
	  un kāds ir maksimāls rindiņas platums pirms tiek veidots jaunās rindas simbols;
  	// TODO: define datetime format
  	+ Ja datums un laiks ir padots, pievieno datumu un laiku atbilsoši formātam;
	+ Katram jautājumam veic sekojošo:
		+ Pievieno jautājuma sākumu (jeb priekšu) 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;
  ],
  [
  	+ Simbolu virkne;
  ],
) <PR02>


=== 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āju. Ar funkcijām saistītas datuplūsmas
ir attēlotas moduļa 2. līmeņa DPD (skat. @fig:abdpd2 attēlu).
Moduļa funkcijas tiek definētas tabulās: 
	#link(<AB01>)[AB01],
	#link(<AB02>)[AB02],
	#link(<AB03>)[AB03],
	#link(<AB04>)[AB04],
	#link(<AB05>)[AB05],
	#link(<AB06>)[AB06],
	#link(<AB07>)[AB07],
	#link(<AB08>)[AB08].

#figure(
  caption: "Atmiņas bāzes moduļa 2.līmeņa datu plūsmas diagramma",
  placement: auto,
  image("img/ABDPD2.svg"),
) <abdpd2>

#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.
  ],
  [
	+ Ievades faila ceļš ar noteiktu paplašinājumu; 
  ],
  [
  	+ 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 atbilsošu iemeslu un kļūdas pazīmi, beidz apstrādi.
	+ Tiek iegūti jautājuma objekti, izmantojot procedūru #link(<PR01>)[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;
	+ Faila reģistrēts datums un laiks;
  ],
  [
  	+ Ielādes kļūda: neizdevās atvert failu;
  	+ Ielādes kļūda: [kļūdas iemesls] [kļūdas rinda]:[kļūdas kolonna];
  ],
) <AB01>

#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 objektu saraksts;
  ],
  [
	+ 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 objektu saraksts;
  ],
  [
  	Funkcijai nav paziņojumu.
  ],
) <AB02>

#function-table(
  "Atmiņas bāzes lappuses iegūšana",
  "AB03",
  [
  	Funkcija iegūst jautājumu objektu intervālu 
	no pagaidu glabātuves.
  ],
  [
	+ Lappuses numurs;
  ],
  [
	+ No pagaides 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;
	+ 
  ],
  [
	+ Saraksts ar lappuses atmiņas kartīšu objektiem;
  ],
  [
  	+ Pieprasītā lappuse neeksistē;
  ],
) <AB03>

#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.
  ],
  [
  	+ Simbolu virkne;
  ],
  [
  	+ Ja ievadīts teksts, parāda 1. paziņojumu, beidz apstrādi; 
	+ Apstrādā simbolu virkni, izmantojot #link(<PR01>)[PR01]\;
		+ Ja tiek izvadīta kļūda, parāda 2. paziņojumu ar kļūdas informāciju,
		  beidz apstrādi;
  ],
  [
	Izvades jautājuma objekti tiek pievienoti jautājumu pagaidu 
	glabātuvē.
	Saskarnē parādās indikators, ka atmiņas kartīšu fails tika izmainīts.

	+ Lappušu objektu saraksts;
  ],
  [
  	+ Nav ievadīts neviens jautājums;
  	+ Ielādes kļūda: [kļūdas iemesls] [kļūdas rinda]:[kļūdas kolonna];
  ],
) <AB04>

#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 redigēšanas iespējai.
  ],
  [
  	+ Jautājuma objekts;
  ],
  [
  	+ Izmantojot procedūru #link(<PR01>)[PR01], jautājums tiek detranspilēts 
	  pirmtekstā\;
  ],
  [
  	+ Simbolu virkne -- jautājuma pirmteskts;
  ],
  [
  	Funkcijai nav paziņojumu.
	Saskarnē parādās indikators, ka atmiņas kartīšu fails tika izmainīts.
  ],
) <AB05>

#function-table(
  "Kartītes redigēšana",
  "AB06",
  [
	Funkcija izmaina esošo jautājumu, pēc to pirmteksta, kas atbilst 
	valodas specifikācijai.
  ],
  [
  	+ Jautājuma objekts;
  	+ Jautājuma pirmteksts;
  ],
  [
  	+ Ja ievades teksts ir tukšs, parāda 1. paziņojumu, beidz apstrādi;
  	+ Izmantojot #link(<PR01>)[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;
  ],
  [
  	+ Jautājuma objekts;
  ],
  [
	Izvades jautājuma objekts tiek atjaunots atbilsošam ierakstu jautājumu pagaidu 
	glabātuvē.
	Saskarnē parādās indikators, ka atmiņas kartīšu fails tika izmainīts.

  	+ Nav ievadīts neviens jautājums;
  	+ Redigēšanas kļūda: [kļūdas iemesls] [kļūdas rinda]:[kļūdas kolonna];
  ],
) <AB06>

#function-table(
  "Kartītes dzēšana",
  "AB07",
  [
  	Funkcija izdēš kartīti no pagaidu glabātuves. 
  ],
  [
  	+ Jautājuma reference;
  ],
  [
  	+ Jautājums tiek sameklēts un izdzēsts;
  ],
  [
  	Funkcijai nav izvades.
  ],
  [
  	Funkcijai nav paziņojumu.
  ],
) <AB07>

#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ļš;
	+ Jautājumu saraksts;
	+ Datums un laiks;
  ],
  [
  	+ Iegūst pirmtekstu padotajiem objektiem, izmantojot procedūru #link(<PR02>)[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 atverš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.
  ],
  [
  	+ Neizdevās atvērt vai izveidot atmiņas kartīšu failu;
  	+ Redigēšanas kļūda: [kļūdas iemesls] [kļūdas rinda]:[kļūdas kolonna];
  ],
) <AB08>


=== Mācīšanās modulis

Mācīšanās risinājuma kontekstā ir kartīšu prezentēšana ar interaktīvu atbildes 
funkcionalitāti, atbilsoš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 datuplūsmas ir 
attēlotas moduļa 2. līmeņa DPD (skat. @fig:madpd2 attēlu).
Moduļa funkcijas tiek definētas tabulās: 
	#link(<MA01>)[MA01],
	#link(<MA02>)[MA02],
	#link(<MA03>)[MA03],
	#link(<MA04>)[MA04],
	#link(<MA05>)[MA05].

#figure(
  caption: "Mācīšanās moduļa 2.līmeņa datu plūsmas diagramma",
  placement: auto,
  image("img/MADPD2.svg"),
) <madpd2>

#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.
  ],
  [
	+ Pašreizējais kartīte -- kartītes objekts;
	+ Algoritms -- viens no vertībām: "fizisks", "nejaušs", "intervālu"\;
  ],
  [
  	+ Ja pagaidu kartīšu glabāvē 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;
	+ 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;
		+ 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);
  ],
  [
  	Funkcijai nav paziņojumu.
  ],
) <MA01>

#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;
 	+ Izvēles jautājuma objekts;
  ],
  [
  	+ 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"; 
  ],
  [
 	+ Izvēlēto atbilžu simbolu virkņu saraksts ar pareizuma karodziņu vērtībām;
  ],
  [
	Funkcijai nav paziņojumu.
  ],
) <MA02>

#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;
 	+ Jautājuma objekts;
  ],
  [
  	+ 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"; 
  ],
  [
 	+ Atbilžu simbolu virkņu saraksts ar pareizuma karodziņu vērtībām;
  ],
  [
	Funkcijai nav paziņojumu.
  ],
) <MA03>

#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;
	+ Jautājuma objekts;
  ],
  [
	+ 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.
  ],
) <MA04>

#function-table(
  "Intervāla grupas atbildes sniegšana",
  "MA05",
  [
	Izmaina jautājuma objektu atbilstoši izvēlētam grūtības vai izpuldījuma
	vērē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ājuma objekts;
  ],
  [
	+ 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ājuma objekts;
  ],
  [
	Funkcijai nav paziņojumu.
  ],
) <MA05>

=== Konfigurācijas modulis

Konfigurācijas modulis iekļauj parametrus, 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ātē, kur tās aspektiem piemīt konfigurējamas
vērtības. Ar funkcijām saistītas datuplūsmas ir attēlotas moduļa 2. līmeņa DPD
(skat. @fig:kfdpd2 attēlu).
Moduļa funkcijas tiek definētas tabulās: 
	#link(<KF01>)[KF01],
	#link(<KF02>)[KF02],
	#link(<KF03>)[KF03].
	
#figure(
  caption: "Konfigurācijas moduļa 2.līmeņa datu plūsmas diagramma",
  placement: auto,
  image("img/KFDPD2.svg"),
) <kfdpd2>


#function-table(
  "Konfigurācijas vērtības iegūšana",
  "KF01",
  [
	Funkcijas iegūst vienu definēo 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 -- viens no: skaitlis, simbolu virkne, karodziņs;
  ],
  [
  	+ Konfigurācijas fails nav korekts, nevar nolasīt konfigurāciju;
  ],
) <KF01>

#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 saraksts -- viens no: skaitlis, simbolu virkne, karodziņs;
  ],
  [
  	+ Konfigurācijas fails nav korekts, nevar nolasīt konfigurāciju;
  ],
) <KF02>

#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 -- viens no: skaitlis, simbolu virkne, karodziņs;
  ],
  [
	+ 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;
  ],
) <KF03>

#pagebreak(weak: true)
= Programmatūras projektējuma apraksts

