2022-01-26 23:09:26 +01:00
/ * M a g i c M i r r o r ²
2020-12-23 12:45:03 +01:00
* Calendar Util Methods
*
2023-04-09 12:49:50 +02:00
* By Rejas
2020-12-23 12:45:03 +01:00
* MIT Licensed .
* /
const CalendarUtils = {
2023-12-25 08:17:11 +01:00
2020-12-23 12:45:03 +01:00
/ * *
2023-04-09 12:49:50 +02:00
* Capitalize the first letter of a string
* @ param { string } string The string to capitalize
* @ returns { string } The capitalized string
2020-12-23 12:45:03 +01:00
* /
2023-12-25 08:17:11 +01:00
capFirst ( string ) {
2023-04-09 12:49:50 +02:00
return string . charAt ( 0 ) . toUpperCase ( ) + string . slice ( 1 ) ;
} ,
2020-12-23 12:45:03 +01:00
2023-04-09 12:49:50 +02:00
/ * *
* This function accepts a number ( either 12 or 24 ) and returns a moment . js LocaleSpecification with the
* corresponding time - format to be used in the calendar display . If no number is given ( or otherwise invalid input )
* it will a localeSpecification object with the system locale time format .
* @ param { number } timeFormat Specifies either 12 or 24 - hour time format
* @ returns { moment . LocaleSpecification } formatted time
* /
2023-12-25 08:17:11 +01:00
getLocaleSpecification ( timeFormat ) {
2023-04-09 12:49:50 +02:00
switch ( timeFormat ) {
case 12 : {
return { longDateFormat : { LT : "h:mm A" } } ;
2020-12-23 12:45:03 +01:00
}
2023-04-09 12:49:50 +02:00
case 24 : {
return { longDateFormat : { LT : "HH:mm" } } ;
2020-12-23 12:45:03 +01:00
}
2023-04-09 12:49:50 +02:00
default : {
return { longDateFormat : { LT : moment . localeData ( ) . longDateFormat ( "LT" ) } } ;
2020-12-23 12:45:03 +01:00
}
}
} ,
2021-05-15 14:49:04 +02:00
/ * *
2023-04-09 12:49:50 +02:00
* Shortens a string if it ' s longer than maxLength and add an ellipsis to the end
* @ param { string } string Text string to shorten
* @ param { number } maxLength The max length of the string
* @ param { boolean } wrapEvents Wrap the text after the line has reached maxLength
* @ param { number } maxTitleLines The max number of vertical lines before cutting event title
* @ returns { string } The shortened string
2021-05-15 14:49:04 +02:00
* /
2023-12-25 08:17:11 +01:00
shorten ( string , maxLength , wrapEvents , maxTitleLines ) {
2023-04-09 12:49:50 +02:00
if ( typeof string !== "string" ) {
return "" ;
}
2020-12-26 12:12:44 +01:00
2023-04-09 12:49:50 +02:00
if ( wrapEvents === true ) {
const words = string . split ( " " ) ;
let temp = "" ;
let currentLine = "" ;
let line = 0 ;
for ( let i = 0 ; i < words . length ; i ++ ) {
const word = words [ i ] ;
if ( currentLine . length + word . length < ( typeof maxLength === "number" ? maxLength : 25 ) - 1 ) {
// max - 1 to account for a space
currentLine += ` ${ word } ` ;
2020-12-26 12:12:44 +01:00
} else {
2023-04-09 12:49:50 +02:00
line ++ ;
if ( line > maxTitleLines - 1 ) {
if ( i < words . length ) {
currentLine += "…" ;
2020-12-26 12:12:44 +01:00
}
break ;
}
2023-04-09 12:49:50 +02:00
if ( currentLine . length > 0 ) {
temp += ` ${ currentLine } <br> ${ word } ` ;
2020-12-26 12:12:44 +01:00
} else {
2023-04-09 12:49:50 +02:00
temp += ` ${ word } <br> ` ;
2020-12-26 12:12:44 +01:00
}
2023-04-09 12:49:50 +02:00
currentLine = "" ;
2020-12-26 12:12:44 +01:00
}
}
2023-04-09 12:49:50 +02:00
return ( temp + currentLine ) . trim ( ) ;
} else {
if ( maxLength && typeof maxLength === "number" && string . length > maxLength ) {
return ` ${ string . trim ( ) . slice ( 0 , maxLength ) } … ` ;
} else {
return string . trim ( ) ;
}
2020-12-23 12:45:03 +01:00
}
} ,
/ * *
2023-04-09 12:49:50 +02:00
* Transforms the title of an event for usage .
* Replaces parts of the text as defined in config . titleReplace .
* @ param { string } title The title to transform .
Calendar translate (#3249)
Hello and thank you for wanting to contribute to the MagicMirror²
project
**Please make sure that you have followed these 4 rules before
submitting your Pull Request:**
> 1. Base your pull requests against the `develop` branch.
DONE ;D
> 2. Include these infos in the description:
> - Does the pull request solve a **related** issue?
NO
> - What does the pull request accomplish? Use a list if needed.
For calendar entries containing a year (e.g. DOB) in the title, the age
can be calculated.
Example before:

after:

Achieved by adding a new keyword `transform` to customEvents
```
customEvents: [
{keyword: 'Geburtstag', symbol: 'birthday-cake', color: 'Gold', transform: { search: '^([^\']*) \'(\\d{4})$' , replace: '$1 ($2.)', yearmatchgroup: 2}},
{keyword: 'in Hamburg', transform: { search: ' in Hamburg$' , replace: ''}}
],
```
and therewith obsoleting `titleReplace`; a backward compatibility part
is already included.
If `yearmatchgroup` is unset, behaviour is as in previous code (some
additions to which RegExes are accepted, though)
If `yearmatchgroup` is set, it is considered the RegEx match group id,
which will be used for calculating the age.
> - If it includes major visual changes please add screenshots.
NO
> 3. Please run `npm run lint:prettier` before submitting so that style
issues are fixed.
DONE
> 4. Don't forget to add an entry about your changes to the CHANGELOG.md
file.
DONE
> Thanks again and have a nice day!
You too and if any questions, feel free to let me know.
---------
Co-authored-by: veeck <michael.veeck@nebenan.de>
2023-11-01 00:07:56 +01:00
* @ param { object } titleReplace object definition of parts to be replaced in the title
* object definition :
* search : { string , required } RegEx in format //x or simple string to be searched. For (birthday) year calcluation, the element matching the year must be in a RegEx group
* replace : { string , required } Replacement string , may contain match group references ( latter is required for year calculation )
* yearmatchgroup : { number , optional } match group for year element
2023-04-09 12:49:50 +02:00
* @ returns { string } The transformed title .
2020-12-23 12:45:03 +01:00
* /
2023-12-25 08:17:11 +01:00
titleTransform ( title , titleReplace ) {
2023-04-16 17:38:39 +02:00
let transformedTitle = title ;
Calendar translate (#3249)
Hello and thank you for wanting to contribute to the MagicMirror²
project
**Please make sure that you have followed these 4 rules before
submitting your Pull Request:**
> 1. Base your pull requests against the `develop` branch.
DONE ;D
> 2. Include these infos in the description:
> - Does the pull request solve a **related** issue?
NO
> - What does the pull request accomplish? Use a list if needed.
For calendar entries containing a year (e.g. DOB) in the title, the age
can be calculated.
Example before:

after:

Achieved by adding a new keyword `transform` to customEvents
```
customEvents: [
{keyword: 'Geburtstag', symbol: 'birthday-cake', color: 'Gold', transform: { search: '^([^\']*) \'(\\d{4})$' , replace: '$1 ($2.)', yearmatchgroup: 2}},
{keyword: 'in Hamburg', transform: { search: ' in Hamburg$' , replace: ''}}
],
```
and therewith obsoleting `titleReplace`; a backward compatibility part
is already included.
If `yearmatchgroup` is unset, behaviour is as in previous code (some
additions to which RegExes are accepted, though)
If `yearmatchgroup` is set, it is considered the RegEx match group id,
which will be used for calculating the age.
> - If it includes major visual changes please add screenshots.
NO
> 3. Please run `npm run lint:prettier` before submitting so that style
issues are fixed.
DONE
> 4. Don't forget to add an entry about your changes to the CHANGELOG.md
file.
DONE
> Thanks again and have a nice day!
You too and if any questions, feel free to let me know.
---------
Co-authored-by: veeck <michael.veeck@nebenan.de>
2023-11-01 00:07:56 +01:00
for ( let tr in titleReplace ) {
let transform = titleReplace [ tr ] ;
if ( typeof transform === "object" ) {
if ( typeof transform . search !== "undefined" && transform . search !== "" && typeof transform . replace !== "undefined" ) {
let regParts = transform . search . match ( /^\/(.+)\/([gim]*)$/ ) ;
let needle = new RegExp ( transform . search , "g" ) ;
if ( regParts ) {
// the parsed pattern is a regexp with flags.
needle = new RegExp ( regParts [ 1 ] , regParts [ 2 ] ) ;
}
2023-04-09 12:49:50 +02:00
Calendar translate (#3249)
Hello and thank you for wanting to contribute to the MagicMirror²
project
**Please make sure that you have followed these 4 rules before
submitting your Pull Request:**
> 1. Base your pull requests against the `develop` branch.
DONE ;D
> 2. Include these infos in the description:
> - Does the pull request solve a **related** issue?
NO
> - What does the pull request accomplish? Use a list if needed.
For calendar entries containing a year (e.g. DOB) in the title, the age
can be calculated.
Example before:

after:

Achieved by adding a new keyword `transform` to customEvents
```
customEvents: [
{keyword: 'Geburtstag', symbol: 'birthday-cake', color: 'Gold', transform: { search: '^([^\']*) \'(\\d{4})$' , replace: '$1 ($2.)', yearmatchgroup: 2}},
{keyword: 'in Hamburg', transform: { search: ' in Hamburg$' , replace: ''}}
],
```
and therewith obsoleting `titleReplace`; a backward compatibility part
is already included.
If `yearmatchgroup` is unset, behaviour is as in previous code (some
additions to which RegExes are accepted, though)
If `yearmatchgroup` is set, it is considered the RegEx match group id,
which will be used for calculating the age.
> - If it includes major visual changes please add screenshots.
NO
> 3. Please run `npm run lint:prettier` before submitting so that style
issues are fixed.
DONE
> 4. Don't forget to add an entry about your changes to the CHANGELOG.md
file.
DONE
> Thanks again and have a nice day!
You too and if any questions, feel free to let me know.
---------
Co-authored-by: veeck <michael.veeck@nebenan.de>
2023-11-01 00:07:56 +01:00
let replacement = transform . replace ;
if ( typeof transform . yearmatchgroup !== "undefined" && transform . yearmatchgroup !== "" ) {
const yearmatch = [ ... title . matchAll ( needle ) ] ;
if ( yearmatch [ 0 ] . length >= transform . yearmatchgroup + 1 && yearmatch [ 0 ] [ transform . yearmatchgroup ] * 1 >= 1900 ) {
let calcage = new Date ( ) . getFullYear ( ) - yearmatch [ 0 ] [ transform . yearmatchgroup ] * 1 ;
let searchstr = ` $ ${ transform . yearmatchgroup } ` ;
replacement = replacement . replace ( searchstr , calcage ) ;
}
}
transformedTitle = transformedTitle . replace ( needle , replacement ) ;
}
2020-12-23 12:45:03 +01:00
}
}
2023-04-16 17:38:39 +02:00
return transformedTitle ;
2020-12-23 12:45:03 +01:00
}
} ;
if ( typeof module !== "undefined" ) {
module . exports = CalendarUtils ;
}