├── .gitignore
├── src
├── main
│ └── java
│ │ └── com
│ │ └── github
│ │ └── leafee98
│ │ └── CSTI
│ │ └── core
│ │ ├── utils
│ │ ├── LocalTimeRange.java
│ │ ├── LocalDateTimeRange.java
│ │ ├── WeekUtilsNoException.java
│ │ ├── PairNumber.java
│ │ ├── CharacterEscape.java
│ │ ├── TimeFormatter.java
│ │ ├── VariableSubstitution.java
│ │ ├── LessonDateTimeCalculator.java
│ │ ├── RangeNumber.java
│ │ └── WeekUtils.java
│ │ ├── ics
│ │ ├── Component.java
│ │ ├── IcsWords.java
│ │ ├── model
│ │ │ ├── VAlarm.java
│ │ │ ├── VTimezone.java
│ │ │ ├── Daylight.java
│ │ │ ├── Standard.java
│ │ │ ├── VCalendar.java
│ │ │ └── VEvent.java
│ │ ├── Value.java
│ │ └── Property.java
│ │ ├── exceptions
│ │ ├── InvalidConfigure.java
│ │ ├── InvalidLessonRange.java
│ │ ├── TimeZoneException.java
│ │ ├── InvalidLessonSchedule.java
│ │ ├── InvalidComponentParams.java
│ │ └── InvalidScheduleFileStruct.java
│ │ ├── bean
│ │ ├── loader
│ │ │ ├── builder
│ │ │ │ ├── GenericScheduleObjectBuilder.java
│ │ │ │ ├── GenericLessonBuilder.java
│ │ │ │ └── GenericConfigureBuilder.java
│ │ │ └── JSONLoader.java
│ │ ├── LessonSchedule.java
│ │ ├── ScheduleObject.java
│ │ ├── LessonRanges.java
│ │ ├── Lesson.java
│ │ └── Configure.java
│ │ ├── configure
│ │ └── KeyWords.java
│ │ ├── App.java
│ │ ├── wrapper
│ │ └── schedule
│ │ │ └── BreakLine.java
│ │ └── generate
│ │ └── Generator.java
└── test
│ ├── java
│ └── com
│ │ └── github
│ │ └── leafee98
│ │ └── CSTI
│ │ └── core
│ │ ├── CharacterEscapeTest.java
│ │ ├── TimeFormatterTest.java
│ │ ├── RangeNumberTest.java
│ │ ├── TestIcs.java
│ │ ├── LocalTimeRangeTest.java
│ │ ├── BreakLineTest.java
│ │ ├── GeneratorTest.java
│ │ └── bean
│ │ └── loader
│ │ └── JSONLoaderTest.java
│ └── resources
│ └── csti-example.json
├── README.md
├── doc
├── example
│ ├── e1(deprecated)
│ │ ├── e1.csti
│ │ └── e1.ics
│ └── e2
│ │ └── e2.json
├── csti-json.md
└── csti-define(deprecated).md
└── pom.xml
/.gitignore:
--------------------------------------------------------------------------------
1 | /target/
2 | /.vscode/
3 | /.settings/
4 | /.idea/
5 | /*.iml
6 | /.project
7 |
--------------------------------------------------------------------------------
/src/main/java/com/github/leafee98/CSTI/core/utils/LocalTimeRange.java:
--------------------------------------------------------------------------------
1 | package com.github.leafee98.CSTI.core.utils;
2 |
3 | import java.time.LocalTime;
4 |
5 | public class LocalTimeRange {
6 |
7 | public LocalTime from;
8 | public LocalTime to;
9 |
10 | public LocalTimeRange(LocalTime from, LocalTime to) {
11 | this.from = from;
12 | this.to = to;
13 | }
14 |
15 | }
16 |
--------------------------------------------------------------------------------
/src/main/java/com/github/leafee98/CSTI/core/ics/Component.java:
--------------------------------------------------------------------------------
1 | package com.github.leafee98.CSTI.core.ics;
2 |
3 | import java.util.List;
4 | import java.util.Map;
5 |
6 | public abstract class Component {
7 |
8 | private final String name;
9 |
10 | public Component(String name) {
11 | this.name = name;
12 | }
13 |
14 | public String getName() {
15 | return name;
16 | }
17 |
18 | public abstract String toString();
19 |
20 | }
21 |
--------------------------------------------------------------------------------
/src/main/java/com/github/leafee98/CSTI/core/utils/LocalDateTimeRange.java:
--------------------------------------------------------------------------------
1 | package com.github.leafee98.CSTI.core.utils;
2 |
3 | import java.time.LocalDate;
4 | import java.time.LocalDateTime;
5 | import java.time.LocalTime;
6 |
7 | public class LocalDateTimeRange {
8 |
9 | public LocalDateTime from;
10 | public LocalDateTime to;
11 |
12 | public LocalDateTimeRange(LocalDateTime from, LocalDateTime to) {
13 | this.from = from;
14 | this.to = to;
15 | }
16 |
17 | }
18 |
--------------------------------------------------------------------------------
/src/test/java/com/github/leafee98/CSTI/core/CharacterEscapeTest.java:
--------------------------------------------------------------------------------
1 | package com.github.leafee98.CSTI.core;
2 |
3 | import com.github.leafee98.CSTI.core.utils.CharacterEscape;
4 | import org.junit.jupiter.api.Assertions;
5 | import org.junit.jupiter.api.Test;
6 |
7 | public class CharacterEscapeTest {
8 |
9 | @Test
10 | void testEscape() {
11 | String input = "abc,\n" + "def:\n" + "ghi;\n" + "\"hello\"\n" + "\\";
12 | String actual = CharacterEscape.escape(input);
13 | String expect = "abc\\,\\ndef:\\nghi\\;\\n\"hello\"\\n\\\\";
14 | Assertions.assertEquals(expect, actual);
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/src/main/java/com/github/leafee98/CSTI/core/utils/WeekUtilsNoException.java:
--------------------------------------------------------------------------------
1 | package com.github.leafee98.CSTI.core.utils;
2 |
3 | import com.github.leafee98.CSTI.core.exceptions.TimeZoneException;
4 |
5 | import java.time.Month;
6 |
7 | public class WeekUtilsNoException extends WeekUtils {
8 |
9 | @Override
10 | public int byIndicator(int dayOfMonthIndicator, Month month) {
11 | int result = 0;
12 | try {
13 | result = super.byIndicator(dayOfMonthIndicator, month);
14 | } catch (TimeZoneException e) {
15 | result = super.ordinalOfWeek(dayOfMonthIndicator);
16 | }
17 | return result;
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/src/test/java/com/github/leafee98/CSTI/core/TimeFormatterTest.java:
--------------------------------------------------------------------------------
1 | package com.github.leafee98.CSTI.core;
2 |
3 | import com.github.leafee98.CSTI.core.utils.TimeFormatter;
4 | import org.junit.jupiter.api.Assertions;
5 | import org.junit.jupiter.api.Test;
6 |
7 | import java.time.LocalDateTime;
8 |
9 | public class TimeFormatterTest {
10 |
11 | @Test
12 | public void testFormat() {
13 | LocalDateTime dateTime = LocalDateTime.of(2021, 1, 2, 12, 30);
14 | TimeFormatter formatter = new TimeFormatter("Asia/Shanghai");
15 |
16 | Assertions.assertEquals("20210102T123000", formatter.local(dateTime));
17 | Assertions.assertEquals("20210102T043000Z", formatter.utc(dateTime));
18 | }
19 |
20 | }
21 |
--------------------------------------------------------------------------------
/src/main/java/com/github/leafee98/CSTI/core/exceptions/InvalidConfigure.java:
--------------------------------------------------------------------------------
1 | package com.github.leafee98.CSTI.core.exceptions;
2 |
3 | public class InvalidConfigure extends RuntimeException {
4 |
5 | private static final long serialVersionUID = -5132496754132654987L;
6 |
7 | public InvalidConfigure() {
8 | super();
9 | }
10 |
11 | public InvalidConfigure(String message) {
12 | super(message);
13 | }
14 |
15 | public InvalidConfigure(String message, Throwable cause) {
16 | super(message, cause);
17 | }
18 |
19 | public InvalidConfigure(Throwable cause) {
20 | super(cause);
21 | }
22 |
23 | protected InvalidConfigure(String message, Throwable cause,
24 | boolean enableSuppression,
25 | boolean writableStackTrace) {
26 | super(message, cause, enableSuppression, writableStackTrace);
27 | }
28 |
29 | }
30 |
--------------------------------------------------------------------------------
/src/main/java/com/github/leafee98/CSTI/core/exceptions/InvalidLessonRange.java:
--------------------------------------------------------------------------------
1 | package com.github.leafee98.CSTI.core.exceptions;
2 |
3 | public class InvalidLessonRange extends RuntimeException {
4 |
5 | private static final long serialVersionUID = -3784919202339592450L;
6 |
7 | public InvalidLessonRange() {
8 | super();
9 | }
10 |
11 | public InvalidLessonRange(String message) {
12 | super(message);
13 | }
14 |
15 | public InvalidLessonRange(String message, Throwable cause) {
16 | super(message, cause);
17 | }
18 |
19 | public InvalidLessonRange(Throwable cause) {
20 | super(cause);
21 | }
22 |
23 | protected InvalidLessonRange(String message, Throwable cause,
24 | boolean enableSuppression,
25 | boolean writableStackTrace) {
26 | super(message, cause, enableSuppression, writableStackTrace);
27 | }
28 |
29 | }
30 |
--------------------------------------------------------------------------------
/src/main/java/com/github/leafee98/CSTI/core/exceptions/TimeZoneException.java:
--------------------------------------------------------------------------------
1 | package com.github.leafee98.CSTI.core.exceptions;
2 |
3 | public class TimeZoneException extends RuntimeException {
4 |
5 | private static final long serialVersionUID = 546781747196321695L;
6 |
7 | public TimeZoneException() {
8 | super();
9 | }
10 |
11 | public TimeZoneException(String message) {
12 | super(message);
13 | }
14 |
15 | public TimeZoneException(String message, Throwable cause) {
16 | super(message, cause);
17 | }
18 |
19 | public TimeZoneException(Throwable cause) {
20 | super(cause);
21 | }
22 |
23 | protected TimeZoneException(String message, Throwable cause,
24 | boolean enableSuppression,
25 | boolean writableStackTrace) {
26 | super(message, cause, enableSuppression, writableStackTrace);
27 | }
28 |
29 | }
30 |
--------------------------------------------------------------------------------
/src/main/java/com/github/leafee98/CSTI/core/exceptions/InvalidLessonSchedule.java:
--------------------------------------------------------------------------------
1 | package com.github.leafee98.CSTI.core.exceptions;
2 |
3 | public class InvalidLessonSchedule extends RuntimeException {
4 |
5 | private static final long serialVersionUID = -8237491283000239416L;
6 |
7 | public InvalidLessonSchedule() {
8 | super();
9 | }
10 |
11 | public InvalidLessonSchedule(String message) {
12 | super(message);
13 | }
14 |
15 | public InvalidLessonSchedule(String message, Throwable cause) {
16 | super(message, cause);
17 | }
18 |
19 | public InvalidLessonSchedule(Throwable cause) {
20 | super(cause);
21 | }
22 |
23 | protected InvalidLessonSchedule(String message, Throwable cause,
24 | boolean enableSuppression,
25 | boolean writableStackTrace) {
26 | super(message, cause, enableSuppression, writableStackTrace);
27 | }
28 |
29 | }
30 |
--------------------------------------------------------------------------------
/src/main/java/com/github/leafee98/CSTI/core/exceptions/InvalidComponentParams.java:
--------------------------------------------------------------------------------
1 | package com.github.leafee98.CSTI.core.exceptions;
2 |
3 | public class InvalidComponentParams extends RuntimeException {
4 |
5 | private static final long serialVersionUID = -995228257258251568L;
6 |
7 | public InvalidComponentParams() {
8 | super();
9 | }
10 |
11 | public InvalidComponentParams(String message) {
12 | super(message);
13 | }
14 |
15 | public InvalidComponentParams(String message, Throwable cause) {
16 | super(message, cause);
17 | }
18 |
19 | public InvalidComponentParams(Throwable cause) {
20 | super(cause);
21 | }
22 |
23 | protected InvalidComponentParams(String message, Throwable cause,
24 | boolean enableSuppression,
25 | boolean writableStackTrace) {
26 | super(message, cause, enableSuppression, writableStackTrace);
27 | }
28 |
29 | }
30 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Class Schedule To Icalendar (Core)
2 |
3 | 潜在的毕业设计项目, 在此之前会限制源码级别的使用.
4 |
5 | 根据指定格式的课程表定义文件的信息, 生成可供日历软件导入的`ics`文件. 本项目是逻辑实现的核心部分.
6 |
7 | ## 课程表定义文件(试验阶段, 未来有可能会进行格式上的修改)
8 |
9 | 见[csti-define.md](/doc/csti-define(csti-define(deprecated).md))(Deprecated), 预计在 0.1.0 版本移除.
10 |
11 | 新加入的课程表描述格式为 JSON , 其格式描述见 [csti-json](doc/csti-json.md), 在直接运行编译后的应用时, 此描述格式尚未起作用.
12 |
13 | ## 特征
14 |
15 | - 项目生成结果符合[rfc 5545](https://tools.ietf.org/html/rfc5545)标准
16 | - 生成结果中, 事件包括事件前的提醒
17 | - 生成结果中, 支持事件名称和事件描述的自定义
18 | - 支持Java库内已有的所有时区
19 |
20 | ## 使用
21 |
22 | 编译好的主程序有为命令行程序, 有两个参数可以使用.
23 |
24 | ```
25 | -i
26 | -o