 Veseli, da se vse predstavili na tudi, kako se priče, kako se priče. Vse je zelo počelt, ko ne mogu, da se priče. Vse je pričo, kako se priče. To je vse, ko priče. To je vse, ki je pričo, in tudi na najvej ljubim libe. Zdaj sem drugo zelo, da bomo tudi izvahaliti, kako je vsakržosnih barhiček, bošo v isločenih kompetencija. To je nekaj nekaj nekaj ljubim ljubim ljubim. To sem kar, da bilo v nekaj ljubim ljubim ljubim ljubim. Regrimo za opraviti in do prejstvu, tako da so prišli očine, ali nekako, ki охodnjeni, da so prišli v peanutini. Kježetno znarazili smo neko 170 zarnostelj, tudi anestovo n 개인 je nosila. F�ara v於 balazjoj z 50, ki smo povedali, da je zelo tako veliko razilj. In 20 otroj substitručnih, da je vsaj povodov, kaj mi zelo in začeljno plnje. In in tudi bomo še privodov. Tako, da ne so vse, da se več ovo prijem. Ale bojo se povedati povedveni. Vse zelo, da umelimo prijev? Prv nekaj, to je najbolj časno sofvajk. Povolj se, da je to nešto nekaj nekaj nekaj neko timer. Način nekaj nekaj nekaj nekaj nečaj neko nekaj neko timer. V nekaj nekaj komercija vse nekaj pogovodili, da je zelo potrebe. Zato početno vsečen je zelo vsečen izvršen svetov in vsečen kod bez. In nas ne bo nekaj tudi, da bi se prejelimo, tako, da vsečen je vsečen vsečen na vsečen vsečen na vsečen in nekaj vsečen na vsečen na vsečen. Češtje problem. Protočno izgleda. Prejštvo, da smo posledali svojo bolj. V rtf dokumentu, spasje, je zelo v vrti in vrti. To je počke ambigosti. Protočno izgleda. Protočno izgleda. tudi v testi na svetu svetu, to je zelo, da nekaj je tukaj, zelo v svetu. Tukaj, zelo, zelo, da je zelo, zelo, da je zelo, da je tukaj, da je tukaj, vse poslednje vse poslednje o problemu in izgleda v Libre ofice in v Microsoft ofice. V Microsoft ofice in Libre ofice je taj zelo vzvečen. Vse zelo vzvečen, da je zelo vzvečen vzvečen vzvečen vzvečen vzvečen z lig chemotherapyh X diagnostuitov v vse vrste s delovim vrste HIV vs. povori z honom izglasovati v cand zelo vzvečen vzvečen. I se za razhiji sink crypto bojo razne slowerč Klim. očetljiva originale bug report sed. So don't trust that. OK, choosing the right tool for Microsoft Office interoperability problems, the best tool for analyzing is Microsoft Office itself. And analyzing the OXML files generated by Microsoft Office. For example, using only Microsoft Office, you should create an OXML baseline file. Then make only a single editing change or difference reproducing the problem in the file. And save it as a second test file. And you should compare that using OpenXML SDK on Windows, which is a Microsoft tool. But it's freely available and very useful for us. Or this simple script called ODIF, which was written by Laszlo. I will show it in the next slide. So to analyze export problems, on the other hand, of LibreOffice, you must check the OXML files exported by LibreOffice. But the first thing to find is the related OXML elements or attributes using Microsoft Office and the OXML comparison tool. So it's this little script called ODIF developed by Laszlo for Linux use case for Linux users. It can show the text-based differences of OXML and ODF documents. And it highlights the change of the docx document.xml file. We added a comment to a paragraph, and the file format stores it. As you can see as a comment reference element with the ID part of the comment. I will change to Firefox, I hope, and show that yes. So this is ODIF, a simple tool available at numbertext.org slash ODF. That's Laszlo's personal site. So it's a really simple batch script. But it can show you or highlight you the differences between XML files on Linux. OK. So for beginner to learn, it's a good way to create our own tools, because it can speed up learning process and development also. And once you have checked the OXML difference between files made by Microsoft Office and files made by Office and Libre Office, it's also important to check the OXML standard, and sometimes even ODF standard, too. Another thing to do is reading the code actively, which means we should forget OpenGrock and API documentation, and start to use GitGrap, checking the header files for suspicious member variables and methods. And use GitLog to find a place of related code parts. So once we know the XML, which we are searching for, GitLog can help. And sometimes you can find even previous commits that can be reused for the current problem. And also, GitLog is very useful for understanding the code itself through its history, not only for regressions, but generally understanding what's happening. It's also a good idea to use shall debug frequently to check that we are in the right place during code reading and problem solving, and check quickly the code execution. That is shown here. That code part above was extended by a shall debug. And in command line execution of the docx export from ODT resulted in this debug line at the end. So that's how it works. So fixing the bug. If you are lucky, solution for our problem has already been in the Git repository. And mastering GitGrap and GitLog is one of the fastest way to fix a problem. We have usually multiple ways to fix a bug. And finding the best is sometimes the hardest. And usually, we have not got, at least in this team, three man months to fix a single bug. So the aim is to find a solution that is good enough. It's also a good idea to ask for help through Garrett, usually from your mentor and experts of this particular area to review an initial commit. So they could help finding best solution for the problem. And if you want to get your commit accepted, you should add the working unit test and a compact commit description with straightforward one line summary, and possibly with the magic word fix. So unit tests. There are many ways to do unit tests in LibreOffice code base. Simplest thing to do that is searching through GitGrap or test via leading, copying and modifying existing unit test. And usually, those are under SW slash QA and SC slash QA. Most frequently used way for our kind of interoperability problems is the expat testing. The biggest problems could be a bad expat problem here. So to fix a bad pass, you should remove end of the pass to get a working expat assertion. And then extending it with element by element carefully, choosing the correct bracket selection, when the selected level contains more elements. Speeding up development, it's essential to have a growth mindset, which is working attitude for the problem solver. Knowing that we can solve the task, because we can learn everything about the problem and its unknown solution. With this growth mindset, even the most complex task could be an interesting and entertaining puzzle. But without it, even the simplest one could be a nightmare. Under this link, there is a TED talk about this growth mindset by Karol Dveck. And one of the most important task of mentoring is to keep and strengthen the growth mindset of the mentored colleagues. So that's what Laszlo is doing. Examples of some bugs that we have fixed with these methods, these were usually fixed by Laszlo. So first example is page layout of writer for supporting whole page background color. This was using GitGrap, GitLog, and some shall debug macros. Laszlo was able to narrow the problem down. And it's a solution only to a single file in the code base. Microsoft Office does the same since decades, but only for full pages. So writer is better now, because you can use different background colors, gradients, and tiled bitmaps for pages with different page styles. So on the right, you can see what is happening in 6.3. Solution was this patch, only a few program lines. And of course, this resulted in working PDF export, which is very good for up-to-date digital media creation. So another example. There was this very much wanted bug fix, even in Open Office bugzilla, to support native copy from calc to writer tables. And in 6.1, or until 6.1, there is an OLA object inserted. But now we can extend writer tables easily with the cell data copied from calc using Ctrl C, Ctrl V. And the code base of calc and writer are so different that the originally planned fix by the Star Division original creator of the code base would have been taken a lot of work, and leaving the problem unresolved for a very long time. I think I found this bug report in Open Office bugzilla from 2003 or so. So what Alaslow did was to copy all of the table content in 6.2. And in 6.3 it was even for their developed so that only the part of the calc table that is filtered gets inserted. So the solution was this little bit of code. So instead of developing a new filter to handle this special data transfer, Alaslow has found us to step work around finding the solution. So the fix inserts the clipboard data as a temporary table at the place of the text cursor, and copies back its contents as native text table data to the keyboard. Remove the table, and insert the native text table data in the native text table of writer. This is the main part of the original fix. There is still a to do about the visible temporary table, but non-debug builds don't show that problem. So one more example of our methods. Most complex problem is to add new features to Libre Office, which was supporting text move during change tracking. This is something Word does. And it marks text moving by double green underlines, as you can see in this corner of the picture. So breaking down the problem resulted in the to do list that we should keep the actual content of the document, because Libre Office imported the deleted part, which is the first paragraph, as not deleted text. Then use dilution and insertion temporarily to show and handle the text moving. And also it would be nice to have a way to show the text moving on the user interface of Libre Office. So the double green underline, this left part of the slide shows what we have currently. It's much better than showing the deleted part as undelited, but no double green underline yet. And fixing this problem was surprisingly simple, like this handling the first two of the previous side, first two problems, fixing the document content, which showed up as undelited and importing text moving as insertion, only consisted of these two lines. So basically we handled the move from and move to as insertion and dilution. One more example of what we are doing, only these simple methods, is change tracking. And our aim with change tracking in dokex format is to create a stable tool for the top use case of change tracking, which is editing legal text. That happens quite often in our user base. And the recent improvements of Mihail Stahl from Sib opened the way to achieve this. So we started to fix the most serious problems and corner cases of change tracking. And now LibreOffice in master keeps most formatting change data during dokex import and export. And it can use these to reject character and paragraph formatting changes, including changes of paragraph styles and numbering. So you can see on the left side that a lot of such format things were not imported and applied in former versions. But now all of that on the top can be imported correctly, just like what it does. And this is how it looks in the Git history from Vastl. It was quite a lot of work this year. But it is doable even with simple methods. And this is how it looks in the Git history of Balaz. And we fixed a lot of chart interoperability issues. And we are on the right track with help from all of the developer community to fix more complex problems, too. So that's basically how the methods that I just explained can work in practice. So that was it. Thank you for the attention. And if there are any questions, please. OK. So thank you.