Rrule: Não produza DTSTART em toString()

Criado em 25 jan. 2015  ·  11Comentários  ·  Fonte: jakubroztocil/rrule

DTSTART e DTEND não fazem parte do iCalendar RRULE e não devem ser incluídos ao fazer .toString().

Talvez gere algo como "DTSTART=x;DTEND=x;RRULE=x" que seria uma sintaxe válida do iCalendar.

enhancement

Comentários muito úteis

:+1: para este problema

AFAIK, DTSTART sempre deve ser uma linha diferente, não apenas delimitada por ; , assim como o exemplo referenciado em #84 (novas linhas são significativas):

DTSTART;TZID=US-Eastern:19970902T090000
RRULE:FREQ=WEEKLY;INTERVAL=2;UNTIL=19971224T000000Z;WKST=SU;BYDAY=MO,WE,FR

Eu não _acho_ (mas aguardo correção se estiver errado) que concatenar essas linhas com um ; é RFC 5545 válido.

Todos 11 comentários

também mais 1 isso

Acordado - isso está causando algum problema ao interoperar com outras implementações (por exemplo, _Python dateutil_)

:+1: para este problema

AFAIK, DTSTART sempre deve ser uma linha diferente, não apenas delimitada por ; , assim como o exemplo referenciado em #84 (novas linhas são significativas):

DTSTART;TZID=US-Eastern:19970902T090000
RRULE:FREQ=WEEKLY;INTERVAL=2;UNTIL=19971224T000000Z;WKST=SU;BYDAY=MO,WE,FR

Eu não _acho_ (mas aguardo correção se estiver errado) que concatenar essas linhas com um ; é RFC 5545 válido.

@jkbrzt você aceita Pull Requests para isso?

Uma vez que esta seria uma mudança de ruptura, eu poderia imaginar implementá-la em uma função separada, por exemplo icalString() e dar uma opção para o analisador também.

Para qualquer outra pessoa com esse problema, criei uma função auxiliar que parece funcionar para minhas necessidades (nota: está escrito em texto datilografado)

export function rrulesetToIcalString(schedule: RRuleSet, startDate: Moment): string {
  // matches `;DTSTART=20180125T080000Z` until `;` or end
  const icalStrings = schedule.valueOf().map(ruleString => ruleString.replace(/;DTSTART=.*?(?=(?:;)|$)/, ''));

  icalStrings.unshift(`DTSTART;TZID=UTC:${startDate.utc().format('YYYYMMDDTHHmmss')}`);

  return icalStrings.join('\n');
}

Você dá a ele um RRuleSet e um startDate (eu o configurei para uso com datas Moment , mas você entendeu) e ele remove todas as seções ;DTSTART=...; em o RRuleSet. Em seguida, ele adiciona uma seção DTSTART devidamente formatada no início do RuleSet e, em seguida, une todas as seções.

Nota: Eu _acho_ que deve haver apenas um DTSTART presente. Talvez existam sabores iCalendar onde isso não é verdade, no entanto (fora do meu caso de uso).

Para obter uma string de regra compatível (sem o DTSTART), uma opção é usar RRule.optionsToString diretamente:

var rule = new RRule({
   freq: RRule.WEEKLY,
   interval: 5,
   byweekday: [RRule.MO, RRule.FR],
   dtstart: new Date(2012, 1, 1, 10, 30),
   until: new Date(2012, 12, 31)
});
var copy = Object.assign({}, rule.origOptions);
delete copy.dtstart
RRule.optionsToString(copy)

alguma atualização disso? Não é muito difícil obter uma string de regra compatível, graças ao conselho de @phillbaker , mas seria bom poder conectar e jogar com o dateutil do Python.

Concordo, existem algumas diferenças na sintaxe com o RFC e com o Python. Estaria muito aberto a um pull request abordando isso!

Agora que TZID foi implementado (#261), a biblioteca não pode mais analisar as strings que ela produz. Eu acho que uma solução compatível com versões anteriores pode ser alcançada continuando a analisar strings de saída pré-2.4.0, mas produzindo strings compatíveis com RFC.

^ minha última declaração aqui ("a biblioteca não pode mais analisar as strings que ela produz") agora está incorreta, isso foi corrigido apenas pelo #267. Ainda assim, seria ideal estar em conformidade com a RFC!

Corrigido por #269

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

jimmywarting picture jimmywarting  ·  9Comentários

marcoancona picture marcoancona  ·  22Comentários

spurreiter picture spurreiter  ·  3Comentários

agordeev picture agordeev  ·  16Comentários

shorlbeck picture shorlbeck  ·  21Comentários