iobroker.ical 1.12.2 → 1.13.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/main.js CHANGED
@@ -22,7 +22,9 @@ const crypto = require('crypto');
22
22
  const fs = require('fs');
23
23
  const path = require('path');
24
24
  const adapterName = require('./package.json').name.split('.').pop();
25
- const request = require('request');
25
+ const axios = require('axios').default;
26
+ const https = require('https');
27
+
26
28
  let adapter;
27
29
  let stopped = false;
28
30
  let killTimeout = null;
@@ -172,59 +174,73 @@ function getICal(urlOrFile, user, pass, sslignore, calName, cb) {
172
174
  } else {
173
175
  // Find out whether SSL certificate errors shall be ignored
174
176
  const options = {
175
- uri: urlOrFile
177
+ method: 'get',
178
+ url: urlOrFile
176
179
  };
177
180
 
178
181
  if (sslignore === 'ignore' || sslignore === 'true' || sslignore === true) {
179
- options.rejectUnauthorized = false;
182
+ options.httpsAgent = new https.Agent({
183
+ rejectUnauthorized: false
184
+ });
180
185
  }
181
186
 
182
187
  if (user) {
183
188
  options.auth = {
184
- user: user,
185
- pass: pass,
186
- sendImmediately: true
189
+ username: user,
190
+ password: pass
187
191
  };
188
192
  }
189
193
 
190
- // Call library function with the "auth object" and credentials provided
191
- request(options, (err, r, _data) => {
192
- const calHash = crypto.createHash('md5').update(user + pass + urlOrFile).digest('hex');
193
- const cachedFilename = path.join(__dirname, calHash);
194
- if (err || !_data || (r && r.statusCode !== 200)) {
195
- let cachedContent;
196
- let cachedDate;
197
- try {
198
- if (fs.existsSync(cachedFilename)) {
199
- cachedContent = fs.readFileSync(cachedFilename, 'utf-8');
200
- const stat = fs.statSync(cachedFilename);
201
- cachedDate = stat.mtime;
202
- }
203
- } catch (err) {
204
- adapter.log.info(`Cannot read cached calendar file for "${urlOrFile}": ${err.message}`);
205
- }
206
- if (err) {
207
- adapter.log.warn(`Error reading from URL "${urlOrFile}": ${(err && err.code === 'ENOTFOUND') ? 'address not found!' : err}`);
208
- if (!cachedContent) {
209
- return cb && cb(err || `Cannot read URL: "${urlOrFile}"`);
210
- }
211
- } else if (r) {
212
- adapter.log.warn(`Error reading from URL "${urlOrFile}": Server responded HTTP-Statuscode=${r.statusCode}: ${_data}`);
213
- if (!cachedContent) {
214
- return cb && cb(`Cannot read URL: "${urlOrFile}" HTTP-Status ${r.statusCode}`);
215
- }
216
- }
217
- adapter.log.info(`Use cached File content for for "${urlOrFile}" from ${cachedDate}`);
218
- cb && cb(null, cachedContent);
219
- } else {
194
+ const calHash = crypto.createHash('md5').update(user + pass + urlOrFile).digest('hex');
195
+ const cachedFilename = path.join(__dirname, calHash);
196
+
197
+ axios(options).then(function (response) {
198
+ if (response.data) {
220
199
  try {
221
- fs.writeFileSync(cachedFilename, _data, 'utf-8');
200
+ fs.writeFileSync(cachedFilename, response.data, 'utf-8');
222
201
  adapter.log.debug(`Successfully cached content for calendar "${urlOrFile}" as ${cachedFilename}`);
223
202
  } catch (err) {
224
203
  // Ignore
225
204
  }
226
- cb && cb(null, _data);
205
+
206
+ cb && cb(null, response.data);
207
+ } else {
208
+ cb && cb(`Error reading from URL "${urlOrFile}": Received no data`);
227
209
  }
210
+ }).catch(error => {
211
+ let cachedContent;
212
+ let cachedDate;
213
+
214
+ if (error.response) {
215
+ // The request was made and the server responded with a status code
216
+ // that falls out of the range of 2xx
217
+ adapter.log.warn(`Error reading from URL "${urlOrFile}": ${error.response.status}`);
218
+ } else if (error.request) {
219
+ // The request was made but no response was received
220
+ // `error.request` is an instance of XMLHttpRequest in the browser and an instance of
221
+ // http.ClientRequest in node.js
222
+ adapter.log.warn(`Error reading from URL "${urlOrFile}"`);
223
+ } else {
224
+ // Something happened in setting up the request that triggered an Error
225
+ adapter.log.warn(`Error reading from URL "${urlOrFile}": ${error.message}`);
226
+ }
227
+
228
+ try {
229
+ if (fs.existsSync(cachedFilename)) {
230
+ cachedContent = fs.readFileSync(cachedFilename, 'utf-8');
231
+ const stat = fs.statSync(cachedFilename);
232
+ cachedDate = stat.mtime;
233
+ }
234
+ } catch (err) {
235
+ adapter.log.info(`Cannot read cached calendar file for "${urlOrFile}": ${err.message}`);
236
+ }
237
+
238
+ if (!cachedContent) {
239
+ return cb && cb(`Cannot read URL: "${urlOrFile}"`);
240
+ }
241
+
242
+ adapter.log.info(`Use cached File content for "${urlOrFile}" from ${cachedDate}`);
243
+ cb && cb(null, cachedContent);
228
244
  });
229
245
  }
230
246
  }
@@ -464,11 +480,10 @@ async function checkDates(ev, endpreview, startpreview, realnow, rule, calName,
464
480
  reason = ev.summary || '';
465
481
  }
466
482
 
467
-
468
483
  const location = ev.location || '';
469
484
 
470
485
  // check if sub parameter 'class' exists and contains PRIVATE
471
- isPrivate = Object.prototype.hasOwnProperty.call(ev, 'class') && ev.class === "PRIVATE";
486
+ isPrivate = Object.prototype.hasOwnProperty.call(ev, 'class') && ev.class === 'PRIVATE';
472
487
 
473
488
  // If not start point => ignore it
474
489
  if (!ev.start || !ev.start instanceof Date) {
@@ -549,7 +564,7 @@ LOCATION:${location}`;
549
564
  // add additional Objects, so iobroker.occ can use it
550
565
  _calName: calName,
551
566
  _calColor: adapter.config.calendars.find(x => x.name === calName).color,
552
- _object: ev
567
+ _object: ev
553
568
  });
554
569
 
555
570
  adapter.log.debug(`Event (full day) added : ${JSON.stringify(rule)} ${reason} at ${date.text}`);
@@ -587,7 +602,7 @@ LOCATION:${location}`;
587
602
  // add additional Objects, so iobroker.occ can use it
588
603
  _calName: calName,
589
604
  _calColor: adapter.config.calendars.find(x => x.name === calName).color,
590
- _object: ev
605
+ _object: ev
591
606
  });
592
607
 
593
608
  adapter.log.debug(`Event with time added: ${JSON.stringify(rule)} ${reason} at ${date.text}`);
@@ -758,7 +773,7 @@ function initEvent(name, display, day, type, id, on, off, ack, callback) {
758
773
  obj.state = false;
759
774
  await adapter.setStateAsync(stateName, {val: false, ack: true});
760
775
  await setState(id, off, ack);
761
- callback && callback(name)
776
+ callback && callback(name);
762
777
  } else {
763
778
  obj.state = state.val;
764
779
  callback && callback(name);
@@ -1294,9 +1309,9 @@ function formatDate(_date, _end, withTime, fullDay) {
1294
1309
  }
1295
1310
  } else {
1296
1311
  //if (adapter.config.language === 'ru') {
1297
- // Todo: Russian
1312
+ // Todo: Russian
1298
1313
  //} else {
1299
- text = `${_('still') !== ' ' ? _('still') : ''} ${minutesleft} ${minutesleft === 1 ? _('minute') : _('minutes')}${_left}`;
1314
+ text = `${_('still') !== ' ' ? _('still') : ''} ${minutesleft} ${minutesleft === 1 ? _('minute') : _('minutes')}${_left}`;
1300
1315
  //}
1301
1316
  }
1302
1317
  } else {
@@ -1431,6 +1446,8 @@ async function displayDates() {
1431
1446
  }
1432
1447
  }
1433
1448
 
1449
+ adapter.log.debug(`Dates array (data.table): ${JSON.stringify(datesArray)}`);
1450
+
1434
1451
  await adapter.setStateAsync('data.table', {val: JSON.stringify(datesArray), ack: true});
1435
1452
  await adapter.setStateAsync('data.html', {val: brSeparatedList(datesArray), ack: true});
1436
1453
  await adapter.setStateAsync('data.text', {val: crlfSeparatedList(datesArray), ack: true});
@@ -1514,7 +1531,7 @@ function brSeparatedList(datesArray) {
1514
1531
  }
1515
1532
  }
1516
1533
 
1517
- let apptmBlock = '';
1534
+ let apptmBlock = '';
1518
1535
  let apptmColor = color;
1519
1536
 
1520
1537
  if (datesArray[i]._object && datesArray[i]._object['color'] !== undefined) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "iobroker.ical",
3
- "version": "1.12.2",
3
+ "version": "1.13.2",
4
4
  "description": "Allows read information from google calender and from iCal.",
5
5
  "author": {
6
6
  "name": "bluefox",
@@ -18,6 +18,10 @@
18
18
  {
19
19
  "name": "jens-maus",
20
20
  "email": "mail@jens-maus.de"
21
+ },
22
+ {
23
+ "name": "Matthias Kleine",
24
+ "email": "info@haus-automatisierung.com"
21
25
  }
22
26
  ],
23
27
  "homepage": "https://github.com/iobroker-community-adapters/ioBroker.ical",
@@ -33,38 +37,60 @@
33
37
  },
34
38
  "dependencies": {
35
39
  "@iobroker/adapter-core": "^2.6.0",
36
- "node-ical": "^0.15.1",
40
+ "axios": "^0.27.2",
37
41
  "cloneextend": "^0.0.3",
38
- "request": "^2.88.2",
39
42
  "json-schema": "^0.4.0",
40
- "rrule": "2.6.9"
43
+ "node-ical": "^0.15.1",
44
+ "rrule": "2.6.4"
41
45
  },
42
46
  "devDependencies": {
43
47
  "@alcalzone/release-script": "^3.5.9",
44
48
  "@alcalzone/release-script-plugin-iobroker": "^3.5.9",
45
49
  "@alcalzone/release-script-plugin-license": "^3.5.9",
46
- "@iobroker/testing": "^2.6.0",
47
- "@iobroker/adapter-dev": "^1.0.0",
50
+ "@iobroker/adapter-dev": "^1.0.1",
51
+ "@iobroker/testing": "^4.0.0",
52
+ "@types/chai": "^4.3.3",
53
+ "@types/chai-as-promised": "^7.1.5",
54
+ "@types/mocha": "^9.1.1",
55
+ "@types/node": "^18.7.13",
56
+ "@types/proxyquire": "^1.3.28",
57
+ "@types/sinon": "^10.0.13",
58
+ "@types/sinon-chai": "^3.2.8",
48
59
  "chai": "^4.3.6",
60
+ "chai-as-promised": "^7.1.1",
49
61
  "chai-string": "^1.5.0",
50
- "eslint": "^8.16.0",
62
+ "eslint": "^8.23.0",
63
+ "luxon": "^2.5.0",
51
64
  "mocha": "^10.0.0",
52
- "set-value": "^4.1.0",
53
- "ansi-regex": "^6.0.1"
65
+ "proxyquire": "^2.1.3",
66
+ "sinon": "^14.0.0",
67
+ "sinon-chai": "^3.7.0",
68
+ "typescript": "~4.8.2"
54
69
  },
55
70
  "bugs": {
56
71
  "url": "https://github.com/iobroker-community-adapters/ioBroker.ical/issues"
57
72
  },
58
73
  "main": "main.js",
74
+ "files": [
75
+ "admin{,/!(src)/**}/!(tsconfig|tsconfig.*).json",
76
+ "admin{,/!(src)/**}/*.{html,css,png,svg,jpg,js}",
77
+ "lib/",
78
+ "www/",
79
+ "io-package.json",
80
+ "LICENSE",
81
+ "main.js"
82
+ ],
59
83
  "scripts": {
60
- "test:js": "mocha --opts test/mocha.custom.opts",
84
+ "test:js": "mocha --config test/mocharc.custom.json \"{!(node_modules|test)/**/*.test.js,*.test.js,test/**/test!(PackageFiles|Startup).js}\"",
61
85
  "test:package": "mocha test/package --exit",
62
- "test:unit": "mocha test/unit --exit",
63
86
  "test:integration": "mocha test/integration --exit",
64
87
  "test": "npm run test:js && npm run test:package",
65
88
  "lint": "eslint",
89
+ "translate": "translate-adapter",
66
90
  "release": "release-script",
67
- "translate": "translate-adapter"
91
+ "release-patch": "release-script patch --yes",
92
+ "release-minor": "release-script minor --yes",
93
+ "release-major": "release-script major --yes"
68
94
  },
69
95
  "license": "MIT"
70
96
  }
package/.mocharc.json DELETED
@@ -1,5 +0,0 @@
1
- {
2
- "require": [
3
- "./test/mocha.setup.js"
4
- ]
5
- }
@@ -1,3 +0,0 @@
1
- {
2
- "plugins": ["iobroker", "license"]
3
- }
package/.tern-project DELETED
@@ -1,16 +0,0 @@
1
- {
2
- "plugins": {
3
- "guess-types": {
4
-
5
- },
6
- "outline": {
7
-
8
- },
9
- "angular": {
10
-
11
- }
12
- },
13
- "libs": [
14
- "browser"
15
- ]
16
- }
package/docs/de/README.md DELETED
@@ -1,197 +0,0 @@
1
- ![Logo](ical.png)
2
- # ioBroker iCal adapter
3
- Mit diesem Adapter können .ics-Dateien von einer bestimmten URL gelesen und analysiert werden (Google Kalender oder iCal).
4
- Alternativ ist es möglich, eine lokale ".ics" -Datei zu verwenden (verwenden Sie den absoluten Pfad zur Datei anstelle der URL)
5
- ## Verwendung
6
- Basierend auf iCal Adapter für (CCU.IO) [https://github.com/hobbyquaker/ccu.io/tree/master/adapter/ical] von vader722
7
-
8
- ### Adapter iCal
9
- Der iCal-Adapter für ioBroker liest Kalenderdateien im ".ics" -Format von der angegebenen URL und schreibt Ereignisse, die sich im vordefinierten Zeitintervall befinden, in die ioBroker-Variable. Alternativ ist es möglich, eine lokale .ics-Datei zu verwenden (verwenden Sie den absoluten Pfad zur Datei anstelle der URL).
10
- Sie können in VIS mit dem Widget `basic html - String (unescaped)` angezeigt werden.
11
-
12
- Es werden 2 Variablen angelegt:
13
- - `iCalReadTrigger`
14
- - `iCalEvents`
15
-
16
- Die Variable `iCalReadTrigger` dient zum Triggern des Einlesevorgangs.
17
- In den Settings können mehrere URLs hinterlegt werden, von welchen der Kalender eingelesen wird.
18
- Die Kalender werden dann nacheinander eingelesen und das Ergebnis zusammengefasst.
19
- Alternativ kann dem Lesebefehl auch eine URL mitgegeben werden, um z.B. zeitweilig einen anderen Kalender einzulesen.
20
-
21
- Zum Einlesen von den `defaultURLs` muss der String `read` in die Variable `iCalReadTrigger` geschrieben werden.
22
-
23
- Zum Einlesen von einer beliebigen URL muss der String `read https://...` in die Variable `iCalReadTrigger` geschrieben werden.
24
-
25
- Das Ergebnis liefert der iCal Adapter in die Variable `iCalEvents`.
26
-
27
- Durch schreiben von `check` in `iCalReadTrigger` wird der Check-Vorgang auf Events auf die gelesenen Daten ohne erneutes einlesen der Daten ausgelöst.
28
-
29
- Alternativ kann der Adapter auch automatisch in einem definierbaren Intervall die Kalender abfragen (nur mit der `defaultURL`).
30
- Dazu in den Settings mit der Variablen runEveryMinutes das Abfrageintervall (in Minuten) einstellen.
31
-
32
- Bedeutung der Optionen im Konfigfile:
33
-
34
- - `preview`: 7 heisst, dass Termine 7 Tage im voraus angezeigt werden
35
- - `runEveryMinutes`: 30 bedeutet dass der Adapter automatisch alle 30min den Kalender neu einliesst. Bei 0 wird nicht automatisch eingelesen
36
- - `colorize`: true Termine am heutigen Tag sowie aktuell laufende Termine werden rot gefärbt, Termine am morgigen Tag orange, diese Option überstimmt die Option everyCalOneColor
37
- - `debug`: false bei true werden erweiterte Ausgaben ins CCU.IO Log geschrieben
38
- - `defColor`: `white` legt die Standardfarbe der Kalendereinträge fest
39
- - `fulltime`: ` ` legt fest durch welchen String bei ganztägigen Terminen die Uhrzeit 00:00 ersetzt wird. Bei Leerzeichen (zwischen den Hochkommas) wird dir Uhrzeit bei ganztägigen Terminen weggelassen
40
- - `replaceDates`: true Bei true wird bei heutigen Terminen das heutige Datum durch den String todayString ersetzt (z.B. "Heute"). Bei morgigen Terminen durch den String tomorrowString
41
- - `everyCalOneColor`: false Bei true wird bei mehreren Kalendern jeder Kalender in einer festzulegenden Farbe eingefärbt. Ist die Option colorize gesetzt, funktioniert dies nicht!
42
- - `Calendar1`:
43
- - "calURL": "http://11111.ics", URL des Kalenders
44
- - "calColor": "white" Farbe des Kalenders, wenn die Option "everyCalOneColor" gesetzt ist.
45
-
46
- Es können beliebig viele Kalender eingetragen werden. Im Standard Konfigfile sind 2 Kalender eingetragen.
47
- - `Events`:
48
- - `name`: "Urlaub":
49
- - `enabled`: true # legt fest, ob das Event bearbeitet wird
50
- - `Set ID`: Hier kann ein zusätzlicher State eingetragen werden, welcher aktualisiert wird, wenn das Event aktiv ist
51
- - `On / Off`: Hier kann ein alternativer Wert in den bei 'Set ID' hinterlegten State geschrieben werden
52
- - `display`: false # legt fest, ob das Event auch in dem iCalEvents angezeigt wird, oder nur ausgewertet wird
53
- - `Set Ack`: false # Ack "aus" steuert den State um z.B. etwas zu schalten. #true Ack "an" aktualisiert den Wert
54
-
55
- Durch setzen eines Events (in diesem Beispiel „Urlaub“), werden die Kalender nach dem String „Urlaub“ durchsucht.
56
- Sollte ein Termin mit dem Stichwort „Urlaub“ in einem Kalender stehen, so wird automatisch eine State mit dem
57
- Namen Urlaub auf True gesetzt. Ist der Termin vorbei, wird der State wieder auf false gesetzt.
58
- Es wird für jeden Tag des preview Zeitraums ein Status angelegt. Achtung!
59
- Es wird nach einem Substring gesucht, d.h. ein Eintrag im Kalender „Urlaub“ wird genauso erkannt wie ein
60
- Eintrag „Urlaub Eltern“. Dies ist beim festlegen der Ereignisse zu berücksichtigen.
61
-
62
- - Erklärung zu den States unter ical.0.events.0
63
- - Das Event im Pfad ical.0.events.0.later wird auf true gesetzt, wenn es heute noch stattfindet aber noch nicht begonnen ist
64
- - Das Event im Pfad ical.0.events.0.now wird auf true gesetzt, wenn es aktuell aktiv ist
65
- - Das Event im Pfad ical.0.events.0.today wird auf true gesetzt, wenn das Event am heutigen Tag aktiv ist
66
- - Hinweis: Termine der Vortage werden nicht angezeigt
67
-
68
- Durch Anpassen der CSS im VIS können die Styles von heutigen (Standard rot) und morgigen Terminen (Standard Orange) festegelegt werden:
69
- - `iCalWarn` - Zeilenanfang Kalendereintrag heute
70
- - `iCalPreWarn` - Zeilenanfang Kalendereintrag morgen
71
- - `iCalNormal` - Zeilenende von heute
72
- - `iCalNormal2` - Zeilenende von morgen
73
-
74
- ### Kalender
75
- #### Apple iCloud Kalender
76
- Apple iCloud Kalender können angezeigt werden, wenn sie vorher freigegeben werden. Am besten einen eigenen Kalender für die Homematic anlegen, da der Kalender fuer alle freigegeben wird.
77
- Dazu mit der rechten Maustaste auf dem Kalender in der Kalender App klicken und Freigabeeinstellungen auswählen. Jetzt einen Haken bei "Öffentlicher Kalender" setzen und die angezeigte URL kopieren. WICHTIG: die Url beginnt mit webcal://p0X-cale.....
78
- `webcal` muss durch `http` ersetzt werden. Diese URL dann entweder in den Settings bei defaultURL eintragen, oder sie bei `read URL` angeben, also z.B. `readURL http://p-03-calendarws.icloud.com/xxxxxxxxx`
79
-
80
- #### Google Kalender
81
- Zum Einbinden eines Google Kalenders muss die Kalendereinstellung des Google Kalenders aufgerufen werden (mit der Maus auf "runter Pfeil" neben dem Kalender klicken). Die URL des Kalenders bekommt man durch klicken auf das `ICAL` Symbol neben dem Feld "Privatadresse". Diese URL dann entweder in den Settings bei defaultURL eintragen, oder sie bei `read URL` angeben, also z.B. `readURL https://www.google.com/calendar/ical/xxxxxxxx/basic.ics`.
82
-
83
- #### OwnCloud Kalender
84
- Zum Einbinden von geteilten Kalendern einer OwnCloud muss man dort in der Kalenderansicht in OwnCloud diesen Kalender als geteilten Kalender freigeben und dort den Link zum Kalender anzeigen lassen und diese URL (https://<DOMAIN>/remote.php/dav/calendars/USER/xxxxxxx_shared_by_xxxxxx?export) entsprechend in den ioBroker.ical Adapter mit Nutzername und Passwort angeben.
85
-
86
- #### NextCloud Kalender
87
- Zum Einbinden eines NextCloud Kalenders muss in der Kalenderansicht in NextCloud der Herunterladen-Link des einzelnen gewünschte Kalender eines Anwenders kopiert werden.
88
- Dazu als Anwender in Nextcloud einloggen und zum 'Kalender' wechseln. In der linken Spalte den gewünschten Kalender bei dem Kreis mit den drei Punkten anklicken.
89
- Im Menu mit der Maus über 'Herunterladen' schweben und mittels Rechtsklick den Link kopieren.
90
- Bsp.: https://<DOMAIN>/remote.php/dav/calendars/MEINCALENDER/personal/?export (wichtig ist, dass hier "?export" im Link enthalten ist).
91
-
92
- Diese URL in den ioBroker.ical Adapter mit Nutzername und Passwort angeben. Dieses muss für alle gewünschten Kalender aller User einzeln erfolgen.
93
-
94
- #### Baikal CalDAV+CardDAV Server
95
- Der Baikal-Server bringt das "ics-export"-Plugin mit welches den Export eines Kalenders in eine gesammelte ICal-Datei erlaubt. Dieses Plugin wird direkt über die URL ausgewählt und erlaubt eine problemlose Zusammenarbeit mit dem vorliegenden ioBroker-Adapter. Wichtig ist der Exportfilter, welcher einfach an die Kalender-URL angehangen zu werden braucht (`https://SERVER/baikal/cal.php/calendars/path/to/calendar?export&accept=ical`). Bei Anmeldeproblemen bitte in den Admin-Einstellungen der Web-UI des Baikal-Servers unter `Settings` den `WebDAV authentication type` von `DIGEST` auf `BASIC` stellen.
96
-
97
- ### CSS
98
- In dem generierten HTML sind zwei Arten von CSS-Klassen enthalten, um Gestaltungsfreiheit zu ermöglichen.
99
-
100
- #### Zeitbasierte CSS-Klassen
101
- * _iCalNormal _ / _ iCalNormal2_: Das Ereignis wurde vor dem heutigen Tag gestartet (und wird noch ausgeführt) oder später, wie in 3 Tagen. Standardfarbe ohne CSS und ohne Kalenderfarbe ist die konfigurierte Adapterfarbe
102
- * _iCalWarn _ / _ iCalWarn2_: Das Event startet heute, Standardfarbe ohne CSS und ohne Kalenderfarbe ist `rot`
103
- * _iCalPreWarn _ / _ iCalPreWarn2_: Das Event startet morgen, Standardfarbe ohne CSS und ohne Kalenderfarbe ist `orange`
104
- * _iCalPrePreWarn _ / _ iCalPrePreWarn2_: Das Event startet übermorgen, Standardfarbe ohne CSS und ohne Kalenderfarbe ist `gelb`
105
- Die erste CSS-Klasse (z. B. iCalNormal) wird für Datum und Uhrzeit des HTML-Codes verwendet, und die zweite CSS-Klasse (z. B. iCalNormal2) wird für den Ereignisnamen verwendet.
106
-
107
- CSS-Beispiel für diese CSS-Klassen, um die Ausgabe etwas anders zu formatieren (z. B. Datum / Uhrzeit links + fett und Ereignisname rechts ...):
108
- ```
109
- .icalWarn{
110
- color:red;
111
- float:left;
112
- font-size:12px;
113
- font-weight:bold;
114
- }
115
- .icalWarn2{
116
- color:white;
117
- float:right;
118
- font-size:12px;
119
- font-weight:normal;
120
- }
121
- .icalPreWarn{
122
- color:yellow;
123
- float:left;
124
- font-size:12px;
125
- font-weight:bold;
126
- }
127
- .icalPreWarn2{
128
- color:white;
129
- float:right;
130
- font-size:12px;
131
- font-weight:normal;
132
- }
133
- .icalPrePreWarn{
134
- color:white;
135
- float:left;
136
- font-size:12px;
137
- font-weight:bold;
138
- }
139
- .icalPrePreWarn2{
140
- color:white;
141
- float:right;
142
- font-size:12px;
143
- font-weight:normal;
144
- }
145
- .icalNormal{
146
- color:green;
147
- float:left;
148
- font-size:12px;
149
- font-weight:bold;
150
- }
151
- .icalNormal2{
152
- color:white;
153
- float:right;
154
- font-size:12px;
155
- font-weight:normal;
156
- }
157
- ```
158
-
159
- #### Kalenderbasierte CSS-Klassen
160
- Jeder Bereich hat auch eine CSS-Klasse, die auf dem Namen des Kalenders basiert, in dem sich das Ereignis befindet. Der in der Adapterkonfiguration definierte "Kalendername" wird dafür verwendet (Leerzeichen werden durch Unterstriche ersetzt).
161
-
162
- * _iCal- <Kalendername> _: Diese Klasse wird für Datum und Uhrzeit des HTML-Codes verwendet
163
- * _iCal-> calendername2> _: Diese Klasse wird für den Ereignisnamen verwendet
164
-
165
- Um diese CSS-Klassen festzulegen, müssen Sie auch die zeitbasierte CSS-Klasse verwenden, z. _.icalNormal2.iCal- <Kalendername> 2_:
166
- ```
167
- .icalNormal2.iCal-Google2{
168
- color:white;
169
- float:right;
170
- font-size:12px;
171
- font-weight:normal;
172
- }
173
- ```
174
-
175
- #### Beispiel für generiertes HTML
176
-
177
- ```
178
- <span style="font-weight: bold; color:white"><span class="icalNormal iCal-calendar-today">&#8594; 3.1.2018 2:00</span></span><span style="font-weight: normal; color:white"><span class='icalNormal2 iCal-calendar-today2'> TestEvent</span></span><br/>
179
- <span style="font-weight: bold; color: red"><span class="icalWarn iCal-calendar-today">1.1.2018 ganzer Tag</span></span><span style="font-weight:normal;color:red"><span class='icalWarn2 iCal-calendar-today2'> Today Event</span></span><br/>
180
- ```
181
-
182
- ## Filter
183
- In Instanzoptionen ist es möglich, einen Filter pro Kalender zu verwalten. Es muss eine durch Semikolons getrennte Liste sein.
184
- Wenn Sie die Option "Als regulären Ausdruck filtern" aktivieren,
185
- wird der Filter als regulärer Ausdruck interpretiert.
186
- Während der Kalenderaktualisierung werden alle Ereignisse ausgeschlossen,
187
- die nach Beschreibung, Ort oder Zusammenfassung übereinstimmen.
188
-
189
- Das Suchmuster ist:
190
- ```
191
- SUMMARY:MySummary
192
- DESCRIPTION:MyDescription
193
- LOCATION:Mein Standort
194
- ```
195
-
196
- Blacklist: Wenn Sie alle Ereignisse eines bestimmten Ortes ausschließen möchten, verwenden Sie `LOCATION: MyLocation` oder `MyLocation` oder 2 Orte `LOCATION:MyLocation;LOCATION:SomewhereElse`.
197
- Whitelist: Wenn Sie nur Ereignisse einer bestimmten Position einschließen möchten, verwenden Sie reguläre Ausdrücke wie `/^(SUMMARY:.*)\s*(DESCRIPTION:.*)\s*(LOCATION:(?!MyLocation).*)$/` oder für 2 Standorte `/^(SUMMARY:.*)\s*(DESCRIPTION:.*)\s*(LOCATION:(?!((MyHomeLocation)|(MyWorkLocation))).*)$/`
Binary file
Binary file
Binary file
Binary file
package/docs/de/ical.png DELETED
Binary file