Skip to content

Commit f76b04a

Browse files
authored
Merge pull request #1 from BaseChip/1.1.4
v 1.1.4
2 parents 88ec2e8 + 8ba1a41 commit f76b04a

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

56 files changed

+441
-342
lines changed

README.md

+27-1
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,37 @@
11
# Physik LK APP
2-
> Eine App die alle Themen für den Physik LK vom GSG Wetter nochmal zusammen fassen soll
2+
> Eine App die alle Themen für den Physik LK vom GSG Wetter zusammen fassen soll
33
44
![stars][github-stars]
55
![issues][github-issues]
6+
[![Codemagic build status][status-badge]][last-build]
67
![License][github-license]
78

9+
:us:
10+
11+
This app is designed to help you prepare for the Abitur examination in NRW by summarising all relevant topics. The app loads all summaries of the topics from an api written by me especially for this purpose. You can also register and login and write notes, which are available from the web app as well as from the mobile version. It should be mentioned that all articles and notes support Markdown and LaTex and the app offers many possibilities for customization.
12+
13+
You can download the app from the Google Playstore: https://play.google.com/store/apps/details?id=de.thebotdev.physik_lp_app
14+
15+
Web App: http://srv2.thebotdev.de/web/physik
16+
17+
:de:
18+
19+
Diese App soll einem helfen sich auf die Abiturprüfung in NRW vorbereiten zu können, indem sie alle Abiturreleavanten Themen zusammenfasst. Dabei lädt die App alle Zusammenfassungen der Themen aus einer von mir extra dafür geschriebenen Api. Zudem kann man in der App sich registrieren und anmelden und dann Notizen schreiben, welche sowohl aus der Web App als auch aus der Mobilen Variante erreichbar sind. Dabei sollte erwähnt werden, dass alle Artikel und Notizen Markdown und LaTex unterstützen und die App viele möglichkeiten der Anpassung gibt.
20+
21+
Die App gibt es im Google Playstore als Download: https://play.google.com/store/apps/details?id=de.thebotdev.physik_lp_app
22+
Web App: http://srv2.thebotdev.de/web/physik
23+
24+
## API
25+
Die Api zu der App kann [hier][link_api] gefunden werden.
26+
827
## Artikel erstellen
928
Um zu erfahren, wie Artikel für die App erstellt werden, lies dir bitte die [Wiki][wiki] durch. Dort findest du alle Informationen zum erstellen eines Artikels und Beispiele für jeden Artikeltypen der unterstützt wird.
1029

1130
## Changelog
31+
* 1.1.4
32+
* Added: Markdown Articel type
33+
* Added: Unit testing for content feature
34+
* Fixed: Code Cleanup
1235
* 1.1.3
1336
* Added: Web version / checks
1437
* Added: CDot option (use \cdot instead of \times)
@@ -51,3 +74,6 @@ Veröffentlicht unter der GNU General Public License 3 Lizenz. Sieh ``LICENSE``
5174
[github-issues]: https://img.shields.io/github/issues-raw/BaseChip/App-Physik
5275
[github-license]: https://img.shields.io/github/license/BaseChip/App-Physik
5376
[wiki]: https://github.com/BaseChip/App-Physik/wiki
77+
[link_api]: https://github.com/BaseChip/Api-Physik
78+
[status-badge]: https://api.codemagic.io/apps/5f37ba24dd1056311a5e949f/5f37ba24dd1056311a5e949e/status_badge.svg
79+
[last-build]: https://codemagic.io/apps/5f37ba24dd1056311a5e949f/5f37ba24dd1056311a5e949e/latest_build

lib/core/ui/pages/settings/settings_page.dart

+4-7
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
11
import 'package:flutter/material.dart';
2-
import 'package:list_tile_switch/list_tile_switch.dart';
3-
import 'package:physik_lp_app_rewrite/core/ui/pages/settings/widgets/cdots_chooser.dart';
4-
import 'package:physik_lp_app_rewrite/core/util/shared_prefrences/shared_prefs_cdots.dart';
5-
import 'package:physik_lp_app_rewrite/features/intro_slider/presentation/slider_page.dart';
6-
import '../../../../features/login/presentation/pages/delete_account_page.dart';
72

8-
import '../../../../injection_container.dart';
3+
import '../../../../features/intro_slider/presentation/slider_page.dart';
4+
import '../../../../features/login/presentation/pages/delete_account_page.dart';
95
import '../../../platform/appinfo.dart';
6+
import 'widgets/cdots_chooser.dart';
107
import 'widgets/drop_down_rendering_engine.dart';
118
import 'widgets/widgets.dart';
129

@@ -49,7 +46,7 @@ class _SettingsPageState extends State<SettingsPage> {
4946
child: Text("Rendering Engine:",
5047
style: Theme.of(context).primaryTextTheme.bodyText1),
5148
)),
52-
Expanded(child: dropDownRenderingEngine())
49+
Expanded(child: DropDownRenderingEngine())
5350
],
5451
),
5552
Row(

lib/core/ui/pages/settings/widgets/drop_down_rendering_engine.dart

+19-19
Original file line numberDiff line numberDiff line change
@@ -6,36 +6,36 @@ import '../../../../util/shared_prefrences/shared_prefs_rendering_engine.dart';
66
/// Dieses DropDownMenü ist als StatefulWidget geschrieben, damit sich das value immer auf den gleichen Wert setzt
77
/// wie die gerade ausgewählte Rendering Engine.
88
/// Würde dies kein StatefulWidget sein müsste die seite jedes mal vom Benutzer neu geladen werden, damit die Änderungen sichtbar werden.
9-
class dropDownRenderingEngine extends StatefulWidget {
10-
dropDownRenderingEngine({Key key}) : super(key: key);
9+
class DropDownRenderingEngine extends StatefulWidget {
10+
DropDownRenderingEngine({Key key}) : super(key: key);
1111

1212
@override
13-
_dropDownRenderingEngineState createState() => _dropDownRenderingEngineState();
13+
_DropDownRenderingEngineState createState() =>
14+
_DropDownRenderingEngineState();
1415
}
1516

16-
class _dropDownRenderingEngineState extends State<dropDownRenderingEngine> {
17+
class _DropDownRenderingEngineState extends State<DropDownRenderingEngine> {
1718
@override
1819
Widget build(BuildContext context) {
1920
String _engine = sl<SharedPrefsRenderingEngine>().renderingEngine;
2021
return DropdownButton<String>(
21-
items: <String>[ "Katex", "MathJax"].map((String value) {
22+
items: <String>["Katex", "MathJax"].map((String value) {
2223
return new DropdownMenuItem<String>(
2324
value: value,
2425
child: new Text(value),
2526
);
2627
}).toList(),
27-
value: _engine,
28-
dropdownColor: Theme.of(context).accentColor,
29-
style: TextStyle(color: Theme.of(context).primaryTextTheme.bodyText1.color),
30-
onChanged: (value) {
31-
sl<SharedPrefsRenderingEngine>().renderingEngine = value;
32-
setState(() {
33-
_engine = sl<SharedPrefsRenderingEngine>().renderingEngine;
34-
});
35-
},
36-
underline: Container(
37-
color: Colors.transparent
38-
),
39-
);
40-
}
28+
value: _engine,
29+
dropdownColor: Theme.of(context).accentColor,
30+
style:
31+
TextStyle(color: Theme.of(context).primaryTextTheme.bodyText1.color),
32+
onChanged: (value) {
33+
sl<SharedPrefsRenderingEngine>().renderingEngine = value;
34+
setState(() {
35+
_engine = sl<SharedPrefsRenderingEngine>().renderingEngine;
36+
});
37+
},
38+
underline: Container(color: Colors.transparent),
39+
);
40+
}
4141
}

lib/core/ui/pages/tools/menu_item_card.dart

+13-15
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,22 @@ import 'package:flutter/material.dart';
22

33
class MenuItem extends StatelessWidget {
44
final String name;
5-
var page;
6-
MenuItem({
7-
@required this.name,
8-
@required this.page});
5+
final page;
6+
MenuItem({@required this.name, @required this.page});
97

108
@override
119
Widget build(BuildContext context) {
1210
return Container(
13-
child: Card(
11+
child: Card(
1412
child: ListTile(
15-
contentPadding: EdgeInsets.symmetric(horizontal: 26, vertical: 8),
16-
title: Text(name, style: Theme.of(context).primaryTextTheme.bodyText1),
17-
trailing: Icon(
18-
Icons.arrow_forward_ios,
19-
color: Theme.of(context).dividerColor,
20-
),
21-
onTap: () => Navigator.push(context, MaterialPageRoute(builder: (context) =>page)),
22-
))
23-
);
13+
contentPadding: EdgeInsets.symmetric(horizontal: 26, vertical: 8),
14+
title: Text(name, style: Theme.of(context).primaryTextTheme.bodyText1),
15+
trailing: Icon(
16+
Icons.arrow_forward_ios,
17+
color: Theme.of(context).dividerColor,
18+
),
19+
onTap: () => Navigator.push(
20+
context, MaterialPageRoute(builder: (context) => page)),
21+
)));
2422
}
25-
}
23+
}

lib/core/ui/pages/tools/toolspage.dart

-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import 'package:flutter/material.dart';
2-
import 'package:physik_lp_app_rewrite/features/notes/presentation/pages/markdown_editor/advanced_editor.dart';
32

43
import '../../../../features/login/presentation/pages/login_page.dart';
54
import '../../../../features/notes/presentation/pages/notes_list_page.dart';

lib/core/ui/widgets/error_display.dart

-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
import 'dart:developer';
2-
31
import 'package:flushbar/flushbar.dart';
42
import 'package:flutter/material.dart';
53

lib/core/util/parser/markdown_html_parser.dart

+37-24
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
import 'dart:developer';
2-
31
/// Eine Klasse die einen Übergebenen String mit normalen Markdown symbolen
42
/// in einen String mit umgewandelten html elementen verwandelt, da TeXView
53
/// html unterstützt und man so Markdown in den Artikeln und den Notizen
@@ -20,46 +18,61 @@ class MarkDownParser {
2018
/// (Sorgt dafür, dass möglichst wenige ausgewählt werden -> sonst wäre
2119
/// **bold 1** **bold 2** das gleiche (match = **bold 1** **bold 2**) und
2220
/// so sind es dann zwei verschiedene Matches (match1 = **bold 1**, match2=...))
23-
final RegExp bold_regex = RegExp(r"([*][*].{1,}?[*][*])+");
21+
final RegExp boldRegex = RegExp(r"([*][*].{1,}?[*][*])+");
2422

2523
/// [^z] = schließt das Zeichen z aus
26-
final RegExp italic_regex = RegExp(r"([*][^*].{1,}?[^*][*])+");
27-
final RegExp code_regex = RegExp(r"([`].{1,}?[`])+");
24+
final RegExp italicRegex = RegExp(r"([*][^*].{1,}?[^*][*])+");
25+
final RegExp codeRegex = RegExp(r"([`].{1,}?[`])+");
2826

2927
/// \S* es können null oder mehr Lehrzeichen dazwischen sein
30-
final RegExp h1_reges = RegExp(r"([#]\S*.{1,})+");
28+
final RegExp h1Reges = RegExp(r"([#]\S*.{1,})+");
29+
30+
/// Aufbau Bilder in MarkDown ![[bildname]]
31+
final RegExp imageRegex = RegExp(r"[!]['\[']['\['].{1,}?['\]']['\]']");
3132

3233
String parseString(String string) {
33-
String string_with_html_markdown = string;
34-
for (var match in _allStringMatches(string, bold_regex)) {
34+
String stringWithHtmlMarkdown = string;
35+
for (var match in _allStringMatches(string, boldRegex)) {
3536
String after = match.replaceFirst("**", "<b>");
3637
after = after.replaceAll("**", "</b>");
37-
string_with_html_markdown =
38-
string_with_html_markdown.replaceFirst(match, after);
38+
stringWithHtmlMarkdown =
39+
stringWithHtmlMarkdown.replaceFirst(match, after);
3940
}
40-
for (var match in _allStringMatches(string, italic_regex)) {
41+
for (var match in _allStringMatches(string, italicRegex)) {
4142
String after = match.replaceFirst("*", "<em>");
4243
after = after.replaceAll("*", "</em>");
43-
string_with_html_markdown =
44-
string_with_html_markdown.replaceFirst(match, after);
44+
stringWithHtmlMarkdown =
45+
stringWithHtmlMarkdown.replaceFirst(match, after);
4546
}
46-
for (var match in _allStringMatches(string, code_regex)) {
47+
for (var match in _allStringMatches(string, codeRegex)) {
4748
String after = match.replaceFirst("`", "<code>");
4849
after = after.replaceAll("`", "</code>");
49-
string_with_html_markdown =
50-
string_with_html_markdown.replaceFirst(match, after);
50+
stringWithHtmlMarkdown =
51+
stringWithHtmlMarkdown.replaceFirst(match, after);
5152
}
52-
for (var match in _allStringMatches(string, h1_reges)) {
53+
for (var match in _allStringMatches(string, h1Reges)) {
5354
String after = match.replaceFirst("#", "<h1>");
5455
after = after + "</h1>";
55-
string_with_html_markdown =
56-
string_with_html_markdown.replaceFirst(match, after);
56+
stringWithHtmlMarkdown =
57+
stringWithHtmlMarkdown.replaceFirst(match, after);
58+
}
59+
for (var match in _allStringMatches(string, imageRegex)) {
60+
String dateiname = match.replaceFirst("![[", "").replaceFirst("]]", "");
61+
String after;
62+
String extras =
63+
"alt=\"Image from articel\" style=\"max-width: 100%; max-height: 100%;\"";
64+
if (dateiname.startsWith("http")) {
65+
after = "<img src=\"$dateiname\" $extras/>";
66+
} else {
67+
after =
68+
"<img src=\"http://srv2.thebotdev.de/img/physik/$dateiname\" $extras/>";
69+
}
70+
stringWithHtmlMarkdown =
71+
stringWithHtmlMarkdown.replaceFirst(match, after);
5772
}
58-
string_with_html_markdown =
59-
string_with_html_markdown.replaceAll("\n", "<br>");
60-
string_with_html_markdown =
61-
string_with_html_markdown.replaceAll("---", "<hr>");
62-
return string_with_html_markdown;
73+
stringWithHtmlMarkdown = stringWithHtmlMarkdown.replaceAll("\n", "<br>");
74+
stringWithHtmlMarkdown = stringWithHtmlMarkdown.replaceAll("---", "<hr>");
75+
return stringWithHtmlMarkdown;
6376
}
6477

6578
Iterable<String> _allStringMatches(String text, RegExp regExp) =>

lib/core/util/shared_prefrences/shared_prefs_auth.dart

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@ class SharedPrefsAuth {
55
final SharedPreferences prefs;
66
SharedPrefsAuth({@required this.prefs});
77

8-
String get auth_key {
8+
String get authKey {
99
return prefs.getString("auth_key");
1010
}
1111

12-
set auth_key(String value) {
12+
set authKey(String value) {
1313
prefs.setString("auth_key", value);
1414
}
1515

lib/core/util/shared_prefrences/shared_prefs_rendering_engine.dart

+25-22
Original file line numberDiff line numberDiff line change
@@ -2,40 +2,43 @@ import 'package:flutter/cupertino.dart';
22
import 'package:flutter_tex/flutter_tex.dart';
33
import 'package:shared_preferences/shared_preferences.dart';
44

5-
class SharedPrefsRenderingEngine{
5+
class SharedPrefsRenderingEngine {
66
// default, da sie inline equations zulässt und Katex nicht
7-
final String _default_engine = "MathJax";
7+
final String _defaultEngine = "MathJax";
88
final SharedPreferences prefs;
9-
SharedPrefsRenderingEngine({
10-
@required this.prefs
11-
});
9+
SharedPrefsRenderingEngine({@required this.prefs});
1210

1311
/// gibt die aktuelle Rendering Engine zurück, falls keine gesetzt ist wird 'MathJax' zurück gegegben
14-
String get renderingEngine{
15-
return prefs.getString("rendering_engine") ?? _default_engine;
12+
String get renderingEngine {
13+
return prefs.getString("rendering_engine") ?? _defaultEngine;
1614
}
1715

18-
TeXViewRenderingEngine get renderingEngineAsTeXEngine{
19-
String _engine = prefs.getString("rendering_engine") ?? _default_engine;
20-
switch(_engine){
21-
case "Katex": {
22-
return TeXViewRenderingEngine.katex();
23-
} break;
24-
case "MathJax": {
25-
return TeXViewRenderingEngine.mathjax();
26-
} default: {
27-
// Auch wenn dieser Part niemals eintreten kann, ist er vorsichtshalber da
28-
return TeXViewRenderingEngine.mathjax();
29-
}
16+
TeXViewRenderingEngine get renderingEngineAsTeXEngine {
17+
String _engine = prefs.getString("rendering_engine") ?? _defaultEngine;
18+
switch (_engine) {
19+
case "Katex":
20+
{
21+
return TeXViewRenderingEngine.katex();
22+
}
23+
break;
24+
case "MathJax":
25+
{
26+
return TeXViewRenderingEngine.mathjax();
27+
}
28+
default:
29+
{
30+
// Auch wenn dieser Part niemals eintreten kann, ist er vorsichtshalber da
31+
return TeXViewRenderingEngine.mathjax();
32+
}
3033
}
3134
}
3235

3336
/// Speichert die übergebene RenderingEngine (Katex / Mathjax) als neue Rendering Engine
34-
///
37+
///
3538
/// Katex = am schnellsten
3639
/// MathJax = etwas bessere Qualität, dafür etwas langsamer, zudem unterstützt die MathJax engine inzwischen inline equtations,
3740
/// weshalb diese standartmäßig ausgewählt ist
38-
set renderingEngine(String engine){
41+
set renderingEngine(String engine) {
3942
prefs.setString("rendering_engine", engine);
4043
}
41-
}
44+
}

0 commit comments

Comments
 (0)