How to write ORG.OPENOFFICE.EASTERSUNDAY for ODF 1.3 and pure EASTERSUNDAY for ODF 1.4?

Mike Kaganski mikekaganski at hotmail.com
Sun Oct 27 06:51:13 UTC 2024


On 27.10.2024 5:27, Regina Henschel wrote:
> Hi Mike, hi all,
>
> Mike Kaganski schrieb am 21.10.2024 um 09:19:
>> Hi Regina!
>>
>> On 20.10.2024 23:20, Regina Henschel wrote:
>>> it would be necessary to write ORG.OFFICE.EASTERSUNDAY when writing 
>>> in ODF versions 1.3 and before and write pure EASTERSUNDAY in case 
>>> of ODF 1.4. But I see no way to distinguish between ODF 1.3 and ODF 
>>> 1.4 in the export filter. I see only a general mxSymbols->isODFF() 
>>> in ScCompiler::ParseOpCode().
>>
>>
>> It seems to me, that the export of formula is done in 
>> ScXMLExport::WriteCell (sc/source/filter/xml/xmlexprt.cxx); and 
>> there, you have access to getSaneDefaultVersion().
>>
>> Hope this helps.
>>
>
> You can indeed get the version to be saved to in xmlexprt.cxx. But 
> where to evaluate it?
>
> Evaluating it directly in sc/source/filter/xml/xmlexprt.cxx would 
> mean, that you have to tweak the result of
>   #3218 OUString aFormula = 
> pFormulaCell->GetFormula(*mpCompileFormulaCxt);
> so that each occurrence of EASTERSUNDAY is replaced by 
> ORG.OPENOFFICE.EASTERSUNDAY.
> Besides the fact that EASTERSUNDAY as text and not as formula name 
> would be replaced too, I think it is not a good idea to check each 
> formula in a spreadsheet to catch the EASTERSUNDAY cases.
>
> Such approach seems completely wrong to me also because we will get 
> the same problem again with the new functions XLOOKUP, FILTER, UNIQUE, 
> etc. when the change from ODF 1.4 to ODF 1.5 is made.
>
> I would prefer a solution, that corrects the string, when the string 
> is created from the opcode ocEasterSunday.
>
> When you look where the string is generated, you get the steps:
> ScFormulaCell::GetFormula() in sc/source/core/data/formulacell.cxx
> FormulaCompiler::CreateStringFromTokenArray() in 
> formula/source/core/api/FormulaCompiler.cxx
> FormulaCompiler::CreateStringFromToken()
> mxSymbols->getSymbol(eOp), which uses the map in 
> formula/inc/core_resource.hrc.
>
> You could pass on the ODF version and the fact that you are exporting 
> to ODF to the method GetFormula(). That could be done as new parameter 
> or by adding members to CompileFormulaContext.

I believe that this (the version of the ODF, or extending the 
FormulaGrammar enum) would be the correct approach.

>
> But the method CreateStringFromTokenArray() is not only called from 
> export, but in other, totally unrelated situations, e.g. when the 
> window with the sheet gets focus.

It needs that new argument (the ODF version), too.

>
> Do we need a totally new method CreateStringFromTokenArrayForODFExport()?
>
> I'm still looking for your ideas.
>
> Kind regards,
> Regina
>



More information about the LibreOffice mailing list