यह लिबरऑफिस का महीना है – लिबरऑफिस के साथ अद्भुत होने का समय, चाहे वह प्रचार करना हो, दूसरों का समर्थन करना हो, अनुवाद करना हो, दस्तावेजीकरण करना हो, बग फिक्स करना हो या नई सुविधाओं को कोड करना हो!
यह देखते हुए कि लिबरऑफिस स्क्रिप्टिंग समर्थन में सुधार करने और अपने वर्तमान जावास्क्रिप्ट रनटाइम (राइनो) को बदलने के लिए डेवलपर्स की तलाश कर रहा है, मुझे आश्चर्य हुआ…
आज जावास्क्रिप्ट में लिबरऑफिस की स्क्रिप्टिंग कैसी है?
(स्पॉइलर: जावास्क्रिप्ट मैक्रोज़ का उपयोग शुरू करना कठिन है, लेकिन वे आश्चर्यजनक रूप से अच्छा काम करते हैं! ✨)

इसका उत्तर देने के लिए, मैंने प्रयोग किया: क्या मैं लिब्रे ऑफिस राइटर के अंदर एक सरल गेम बना सकता हूँ?
मैंने वर्डले क्लोन बनाने का फैसला किया, क्योंकि इनपुट पद्धति बहुत उपयुक्त थी: खिलाड़ी एक समय में एक शब्द दर्ज करता है, और जब भी वे “एंटर” दबाते हैं, तो गेम उनके अनुमान को स्कोर करता है। किसी शब्द के अक्षरों को हाइलाइट करके स्कोरिंग की जा सकती है, जो पहले से ही राइटर की एक विशेषता है!
उस संबंध में, मैं अंतिम परिणाम से काफी खुश हूं जिसे आप ऊपर देख सकते हैं; मेरा प्रारंभिक विचार लिबरऑफिस की स्क्रिप्टिंग एपीआई में बहुत अच्छी तरह से अनुवादित हुआ।
(आप कोडबर्ग रिपॉजिटरी में अपने लिए अंतिम परिणाम भी आज़मा सकते हैं!)
बाहर शुरू
किसी विचार के साथ आना आसान है.
कोड को निष्पादित करना बहुत कठिन है।
जब मैक्रोज़ लिखने की बात आती है तो लिबरऑफिस के दस्तावेज़ीकरण की अत्यधिक कमी होती है। स्क्रिप्टिंग लिबरऑफिस पर एक पेज है जो आपको बताता है कि यह है संभव जावास्क्रिप्ट का उपयोग करने के लिए, और आपको लिबरऑफिस एपीआई पर निर्देशित करता है जहां आपको… एक समर्थन वर्ग को छोड़कर, जावास्क्रिप्ट के बारे में कुछ भी नहीं मिलेगा।
स्क्रिप्टिंग फ्रेमवर्क पर डेवलपर गाइड के साथ दस्तावेज़ फाउंडेशन विकी अधिक उपयोगी है, जो कम से कम आपको “मैक्रोज़ व्यवस्थित करें → जावास्क्रिप्ट” मेनू विकल्प की ओर इंगित करता है।
हालाँकि, डेवलपर की मार्गदर्शिका आपसे झूठ बोलती है, कि “[The Organizer dialog for JavaScript] आपको मैक्रोज़ और चलाने की अनुमति देता है संपादन करना मैक्रोज़, और मैक्रोज़ और मैक्रो लाइब्रेरीज़ बनाएं, हटाएं और नाम बदलें।”
जब आप जावास्क्रिप्ट मैक्रो को संपादित करने का प्रयास करते हैं तो संवाद इस तरह दिखता है:

धूसर हो चुके संपादन और बनाएं बटन पर ध्यान दें। 😅
आगे, डेवलपर गाइड एक जावास्क्रिप्ट मैक्रो उदाहरण देता है। इसके श्रेय के लिए, मैक्रो काम करता है… सिवाय इसके कि इस लेख को लिखने के समय विकी के पास इसे दस्तावेज़ में कैसे एम्बेड किया जाए, इसका कोई स्पष्टीकरण नहीं था। 😇.
एक .odt वर्डले मैक्रो के साथ फ़ाइल पूछने के लिए बहुत अधिक है? 😂
एक अनज़िप की खोज के बाद .odt फ़ाइल, डेवलपर गाइड के जावा उदाहरण को देखकर, और अंत में लिबरऑफिस के स्रोत कोड में जावास्क्रिप्ट उदाहरण ढूंढने के बाद, मुझे समझ में आया कि एक एम्बेडेड जावास्क्रिप्ट मैक्रो कैसे बनाया जाए:
सबसे पहले, मैं अपनी ज़िप खोलता हूँ .odt फ़ाइल, इसका नाम बदलकर a .zip और एक अभिलेखीय उपकरण का उपयोग करना। इसके अंदर, निम्नलिखित की तरह एक फ़ोल्डर संरचना है:
root
|- META-INF
| |- manifest.xml
|- mimetype, content.xml, ...यहां फ़ोल्डर में, मुझे अपना जावास्क्रिप्ट मैक्रो जोड़ना होगा। यह अंदर चला जाता है Scripts/javascript/एक मिलान के साथ Scripts/javascript/ फ़ाइल:
root
|- META-INF
| |- manifest.xml
|- Scripts
| |- javascript
| | |- MyLibraryName
| | | |- MyFile.js
| | | |- parcel-descriptor.xml
|- mimetype, content.xml, ... manifest.xml नई फ़ाइलों के साथ अद्यतन किया जाना चाहिए:
version="1.0" encoding="UTF-8"?>
<manifest:manifest xmlns:manifest="urn:oasis:names:tc:opendocument:xmlns:manifest:1.0">
<manifest:file-entry manifest:full-path="Scripts/javascript/MyLibraryName/parcel-descriptor.xml" manifest:media-type=""/>
<manifest:file-entry manifest:full-path="Scripts/javascript/MyLibraryName/MyFile.js" manifest:media-type="application/javascript"/>
<manifest:file-entry manifest:full-path="Scripts/javascript/MyLibraryName/" manifest:media-type="application/binary"/>
<manifest:file-entry manifest:full-path="Scripts/javascript/" manifest:media-type="application/binary"/>
<manifest:file-entry manifest:full-path="Scripts/" manifest:media-type="application/binary"/>
manifest:manifest>फिर, मुझे एक चाहिए parcel-descriptor.xml जावास्क्रिप्ट मैक्रो का वर्णन:
version="1.0" encoding="UTF-8" standalone="no"?>
<parcel xmlns:parcel="scripting.dtd" language="JavaScript">
<script language="JavaScript">
<locale lang="en">
<displayname value="My Library Name"/>
<description>
Description of the whole library goes here!
description>
locale>
<functionname value="MyFile.js"/>
<logicalname value="MyFile.JavaScript"/>
script>
parcel>और फिर, मैं अपना जावास्क्रिप्ट कोड जोड़ना चाहता हूं MyFile.js. यहां आधिकारिक हैलो वर्ल्ड उदाहरण का सरलीकृत संस्करण दिया गया है:
importClass(Packages.com.sun.star.uno.UnoRuntime);
importClass(Packages.com.sun.star.text.XTextDocument);
var doc = XSCRIPTCONTEXT.getDocument();
var text = UnoRuntime.queryInterface(XTextDocument, doc).getText();
var endRange = text.getEnd();
endRange.setString("Hello World (in JavaScript)");अंत में, यह सब करने के बाद, मैं ओडीटी फ़ाइल को फिर से ज़िप कर सकता हूं (फ़ाइलों को ज़िप कर सकता हूं, फिर संग्रह का नाम बदल सकता हूं) .odt), और थोड़े से भाग्य के साथ, यह सब काम करेगा!
(नोट: अपनी ODT फ़ाइल को दोबारा संपीड़ित करते समय, ज़िप संग्रह बिलकुल मना है एक रूट निर्देशिका है. आप निर्देशिका के बजाय अनज़िप की गई निर्देशिका में फ़ाइलों को संपीड़ित करके ऐसा कर सकते हैं।)
अब, मैं “टूल्स → मैक्रोज़ → रन मैक्रो…: पर नेविगेट कर सकता हूं और सूची से अपना नया मैक्रो चुन सकता हूं।

वाह!
ज़िपिंग और अनज़िपिंग प्रक्रिया अब तक लिबरऑफिस में जावास्क्रिप्ट का सबसे खराब हिस्सा है। बाकी सब कुछ बहुत आसान है! उम्मीद है कि बेहतर दस्तावेज़ीकरण और लिबरऑफिस में निर्मित जावास्क्रिप्ट संपादक के साथ यह बदल जाएगा।
मैक्रो में परीक्षण परिवर्तनों को आसान बनाने के लिए मैंने अपने लिए एक छोटी “ज़िप एवरीथिंग एंड रन” कमांडलाइन बनाई:
rm ./wordle-test.odt; zip -r ./wordle-test.odt * && soffice --norestore ./wordle-test.odtबेझिझक स्वयं भी ऐसी ही किसी चीज़ का उपयोग करें।
अब क्या?
अब जब मैं मैक्रो चला सकता हूं, तो आकाश ही सीमा है! मेरे पास यूएनओ लिबरऑफिस एपीआई की पूरी शक्ति है, जैसा कि जावा एपीआई के संपर्क में है, और संपूर्ण जावा मानक लाइब्रेरी के साथ, राइनो इंजन के माध्यम से सुलभ बनाया गया है!
मुझे बस… सबसे पहले मैक्रो को ट्रिगर करने का एक तरीका चाहिए। 😁
मूल स्क्रिप्टिंग लिबरऑफिस सहायता पृष्ठ उन सभी अलग-अलग स्थानों की व्याख्या करता है जहां हम इवेंट में मैक्रोज़ संलग्न कर सकते हैं। इनमें दस्तावेज़ लोडिंग, हाइपरलिंक, फ़ॉर्म नियंत्रण और कीबोर्ड शॉर्टकट शामिल हैं—बेझिझक एक्सप्लोर करें!
बेसिक वर्डले इनपुट
अपने खेल के लिए, मैं यह पता लगाने का एक तरीका चाहता था कि खिलाड़ी ने एक नई लाइन में प्रवेश किया है और खिलाड़ी के अनुमान के अक्षरों को उजागर करने का एक तरीका।
मैंने शॉर्टकट देखे, लेकिन वे दस्तावेज़ के साथ सहेजे नहीं गए हैं, और मैं खिलाड़ी से अपना स्वयं का शॉर्टकट पंजीकृत करने के लिए नहीं कहना चाहता था। इसके बजाय, मैं एक बटन के साथ गया जो एक इवेंट श्रोता को संलग्न करेगा। यह बात पूरी तरह से गायब है कि मैं बटन के बजाय दस्तावेज़ लोड इवेंट का उपयोग कर सकता था।
लेकिन मैं कौन सा कार्यक्रम (“इवेंट ब्रॉडकास्टर”, यूएनओ नामकरण में) सुन सकता हूं?
कुछ झूठे सुरागों के बाद, जैसे com.sun.star.document.Eventsमैं अंततः यहीं समाप्त हुआ XModifyBroadcasterद्वारा कार्यान्वित एक इंटरफ़ेस TextDocument सेवा हम पहले से ही उपरोक्त स्क्रिप्ट में उपयोग करते हैं doc.
XModifyBroadcaster एक की आवश्यकता है XModifyListener. मुझे चिंता थी कि मैं स्क्रिप्ट एपीआई के माध्यम से एक नहीं बना सकता, लेकिन राइनो ने मुझे कवर किया था: new Interface({member: function() { ... }}) किसी दिए गए इंटरफ़ेस को लागू करने वाली नई ऑब्जेक्ट बनाता है! 🎉
अब इन सबको एक साथ मिलाने की बात है:
importClass(Packages.com.sun.star.uno.UnoRuntime);
importClass(Packages.com.sun.star.text.XTextDocument);
importClass(Packages.com.sun.star.util.XModifyBroadcaster);
importClass(Packages.com.sun.star.util.XModifyListener);
var doc = XSCRIPTCONTEXT.getDocument()
var modifyBroadcaster = UnoRuntime.queryInterface(XModifyBroadcaster, doc)
modifyBroadcaster.addModifyListener(new XModifyListener({
modified: function() {
var text = UnoRuntime.queryInterface(XTextDocument, doc).getText();
var endRange = text.getEnd();
endRange.setString("Hello World (in JavaScript)");
}
}))सिवाय… यह काम नहीं करता. लिबरऑफिस क्रैश हो गया 😅
दस्तावेज़ को अंदर संशोधित करना modified ईवेंट हैंडलर अंतहीन रिकर्सन की तरह लग रहा था, इसलिए मैंने अपनी स्क्रिप्ट के कारण हुए परिवर्तनों को अनदेखा करने के लिए एक वेरिएबल का उपयोग किया, लेकिन, यह अभी भी क्रैश हो गया!
मेरा ये अनुमान है XModifyListener एक महत्वपूर्ण खंड में है जो संशोधन की अनुमति नहीं देता है, इसलिए मैंने इसे छोड़ दिया और इसका उपयोग किया java.util.Timerजैसा कि StackOverflow प्रश्न से प्रेरित है setTimeout राइनो में:
// ...same as before, import classes
var recursionGuard = false
modifyBroadcaster.addModifyListener(new XModifyListener({
modified: function(ev) {
if (recursionGuard) return;
recursionGuard = true
var timer = new java.util.Timer()
timer.schedule(new java.util.TimerTask({
run: function() {
// ...same as before, modify the document
recursionGuard = false
}
}), 100)
}
}))एक बोनस के रूप में, टाइमर इनपुट पर बहस करता है!
और अब यह काम करता है! जब मैं दस्तावेज़ को संशोधित करता हूं, तो एक नया “हैलो वर्ल्ड (जावास्क्रिप्ट में)” टेक्स्ट प्रकट होता है 🎉

मैं उसे एक फ़ंक्शन में लपेटता हूं और हाइलाइट्स की ओर बढ़ता हूं।
बेसिक वर्डले आउटपुट
उपयोगकर्ता द्वारा अनुमान के रूप में सबमिट करने के बाद मुझे पिछली पंक्ति को हाइलाइट करना होगा।
दरअसल, “सबमिट” भाग को स्क्रैच करें। मैं हर संशोधन पर पिछली पंक्ति को फिर से हाइलाइट कर सकता हूं, और यह उसी तरह काम करेगा, क्योंकि हाइलाइट्स नहीं बदलेंगे।
मुझे बस दस्तावेज़ के विशिष्ट पात्रों को उजागर करने की आवश्यकता है…
फिर से, यूएनओ लिबरऑफिस एपीआई संदर्भ काम आता है। एक XText मुझे टेक्स्ट को नेविगेट करने और अनुमानित शब्द का चयन करने के लिए एक “कर्सर” बनाने की सुविधा देता है।
हालाँकि, मेरे पास जो इंटरफ़ेस है, XTextCursor केवल चरित्र-दर-चरित्र आगे बढ़ सकता है और मुझे खिलाड़ी के अंतिम अनुमान तक पहुंचने के लिए एक पैराग्राफ ऊपर ले जाना होगा।
शुक्र है, createTextCursor से लिंक करता है TextCursor सेवाजो अन्य इंटरफ़ेस को भी लागू करता है, जैसे XParagraphCursor. निफ़्टी!
मैं कर्सर को पैराग्राफ कर्सर इंटरफ़ेस पर डालता हूं, और यह काम करता है!
थोड़ी सी छेड़छाड़ से निम्नलिखित स्क्रिप्ट प्राप्त होती है:
importClass(Packages.com.sun.star.uno.UnoRuntime);
importClass(Packages.com.sun.star.text.XTextDocument);
importClass(Packages.com.sun.star.text.XParagraphCursor);
var doc = XSCRIPTCONTEXT.getDocument();
var text = UnoRuntime.queryInterface(XTextDocument, doc).getText();
var cursor = text.createTextCursorByRange(text.getEnd());
var paragraphCursor = UnoRuntime.queryInterface(XParagraphCursor, cursor);
paragraphCursor.gotoPreviousParagraph(false); // false - do not expand selection
paragraphCursor.gotoPreviousParagraph(true); // true - expand selection (like holding Shift)
paragraphCursor.setString("This text replaces the whole previous paragraph!")अब मुझे पृष्ठभूमि का रंग बदलने की जरूरत है। मैं उसे देखता हूं TextCursor औजार CharacterProperties. इन संपत्तियों तक पहुंचा जा सकता है XPropertySetजैसा कि मैंने विकी से सीखा है:
// ... code as before, without the last line
var cursorProps = UnoRuntime.queryInterface(XPropertySet, cursor)
cursorProps.setPropertyValue("CharBackColor", new java.lang.Integer(0xFF5500)) // RR GG BBऔर, वोइला: हमारे पास मुख्य विशेषताएं हैं!
इसके अलावा, इनपुट पर वापस, मैं इसका उपयोग कर सकता हूं getString एक पर XTextCursor पाठ को पढ़ने के लिए, तो यह भी हल हो गया है!
var guessText = paragraphCursor.getString()बाकी उल्लू
इनपुट और आउटपुट को क्रमबद्ध करने के साथ, वर्डले गेम का बाकी हिस्सा कुछ जावास्क्रिप्ट फ़ंक्शंस का मामला है जिसे आप अंतिम वर्डले.जेएस स्क्रिप्ट में पा सकते हैं।
कोड को विस्तार से समझाने के बजाय, मैं इसे प्रोग्रामिंग करते समय आई कुछ कठिनाइयों पर प्रकाश डालना चाहूंगा:
राइनो का जावास्क्रिप्ट समर्थन
राइनो नई ईसीएमएस्क्रिप्ट सुविधाओं का पूरी तरह से समर्थन नहीं करता है, हालांकि काम चल रहा है। का अभाव letविशेष रूप से, एक निरंतर झुंझलाहट थी क्योंकि मेरी मांसपेशियों की स्मृति रास्ते में आ रही थी।
जावा तार
getString फ़ंक्शन जिसका उपयोग मैंने उपयोगकर्ता का अनुमान रिटर्न प्राप्त करने के लिए किया था java.lang.String-जावास्क्रिप्ट नहीं String.
इसने मुझे आधे घंटे से अधिक समय तक भ्रमित किया, क्योंकि == जावा स्ट्रिंग्स की तुलना करता है संदर्भ द्वाराइससे पहले कि मुझे एहसास होता कि मेरा प्रकार गलत है।
जावा स्ट्रिंग को जावास्क्रिप्ट स्ट्रिंग में बदलने के लिए, मैं इसे कास्ट कर सकता हूं:
var paragraphText = String(paragraphCursor.getString()) // "last paragraph as String"
// Or:
var paragraphText = paragraphCursor.getString() + "" // "last paragraph as String"संयुक्त राष्ट्र संघ long-एस
प्रकारों के संदर्भ में, मैंने सोचा कि CharBackColor संपत्ति एक है longऔर पास करने का प्रयास किया java.lang.Long के बजाय java.lang.Integer जब मैं शुरू में इसे सेट कर रहा था।
यह एक फेंकता है IllegalArgumentException.
var props = UnoRuntime.queryInterface(XPropertySet, cursor)
//Wrong: props.setPropertyValue("CharBackColor", new java.lang.Long(0xFF5500))
props.setPropertyValue("CharBackColor", new java.lang.Integer(0xFF5500))डेवलपर गाइड के अध्याय 2 को पढ़ते हुए, मुझे पता चला कि यूएनओ एपीआई वास्तव में निर्दिष्ट करता है longलेकिन यूएनओ का long जावा के लिए मानचित्र int. (और 64 बिट मान के लिए, यूएनओ उपयोग करता है hyper के बजाय long.) काश मैं इसे पहले पढ़ता!
कंसोल पर मुद्रण
प्रोग्राम को डीबग करने के तरीके के बिना प्रगति करना कठिन है, और जो हो रहा है उसे समझने के लिए मुझे अक्सर कुछ मान प्रदर्शित करने की आवश्यकता होती है।
सौभाग्य से, मेरे पास संपूर्ण जावा एपीआई उपलब्ध है:
java.lang.System.err.println(typeof paragraphText) // "object"?!पूर्ववत/पुनः करना संभालना
मैक्रो स्क्रिप्ट ने प्रत्येक संशोधन के लिए अलग-अलग पूर्ववत/पुनः क्रियाएं बनाईं। यह विशेष रूप से बुरा था क्योंकि मैं पूर्ववत करने सहित किसी भी संशोधन पर उन कार्रवाइयों को फिर से बना रहा था।
क्रियाओं को एक साथ जोड़ने के लिए, मैंने इसका उपयोग किया XUndoManagerSupplier और इसके enterHiddenUndoContext फ़ंक्शन, ताकि उपयोगकर्ता की स्वयं की कार्रवाई के साथ मैक्रो के संशोधन पूर्ववत/पुनः किए जा सकें।
importClass(Packages.com.sun.star.document.XUndoManagerSupplier)
registerModifyListener(function() {
var undoManager = UnoRuntime.queryInterface(XUndoManagerSupplier, doc).getUndoManager()
undoManager.enterHiddenUndoContext()
try {
// Modify the document
} finally {
undoManager.leaveUndoContext()
}
})वर्तनी जांच
वर्डले में आपको मनगढ़ंत शब्दों का प्रयोग करने की अनुमति नहीं है। जब मैंने पायथन वर्तनी जांच उदाहरण देखा, तो मैंने सोचा कि अगर मैं प्लेयर को अंग्रेजी शब्दों तक सीमित करने के लिए लिब्रे ऑफिस के स्वयं के वर्तनी जांचकर्ता का उपयोग करूं तो यह अच्छा होगा।
UNO में एक ऑब्जेक्ट बनाने में सेवा प्रबंधक फ़ैक्टरी शामिल होती है जैसा कि विकी में बताया गया है:
importClass(Packages.com.sun.star.linguistic2.XSpellChecker)
var context = XSCRIPTCONTEXT.getComponentContext();
var spellcheckerService = context.getServiceManager().createInstanceWithContext(
"com.sun.star.linguistic2.SpellChecker",
context
)
var spellchecker = UnoRuntime.queryInterface(XSpellChecker, spellcheckerService)वर्तनी जांच के लिए, आपको सटीक निर्दिष्ट करना होगा Locale आप चाहते हैं, और एपीआई गुम स्थानों को चुपचाप अनदेखा कर देता है:
importClass(Packages.com.sun.star.lang.Locale)
// Incorrect: ~~new Locale("en", "", "")~~, ~~new Locale("en", "us", "")~~
// Correct: new Locale("en", "US", "")
var valid = spellchecker.isValid(guess, new Locale("en", "US", ""), []);फोकस संभालना
डिफ़ॉल्ट रूप से, “प्रारंभ” बटन क्लिक करने के बाद दस्तावेज़ के टेक्स्ट से फोकस हटा देगा – जिसका मतलब है कि उपयोगकर्ता को टाइपिंग शुरू करने से पहले फिर से क्लिक करना होगा। मैं दस्तावेज़ पर फोकस वापस लाने का कोई तरीका ढूंढने में विफल रहा, इसलिए क्लिक करने पर फोकस न लेने के लिए मैंने बटन को कॉन्फ़िगर कर दिया। (आश्चर्यजनक रूप से, लिब्रे ऑफिस के पास वही विकल्प था जो मैं चाहता था!)
हालाँकि, माइकल वेघोर्न की सलाह से, मैं दस्तावेज़ पर फिर से ध्यान केंद्रित करने के लिए एपीआई ढूंढने में कामयाब रहा:
// Once the animation is finished:
doc.getCurrentController().getFrame().getContainerWindow().setFocus()धन्यवाद, माइकल! ✨
एनिमेटेड संदेश प्रिंट करना
अंत में, आपने देखा होगा कि मैंने गेम की शुरुआत और अंत में थोड़ा एनीमेशन जोड़ा है।
इसे स्ट्रिंग्स की एक सूची के रूप में कार्यान्वित किया जाता है जो एक के बाद एक, दूसरे के साथ प्रदर्शित होती हैं Timer:
var message = [
"∴ ∴ ∴",
"∴ ∴ ∴ WORDLE ∴ ∴ ∴",
"∴ ∴ ∴ WORDLE in LibreOffice ∴ ∴ ∴",
]
var i = 0
var timer = new java.util.Timer()
timer.schedule(new java.util.TimerTask({
run: function() {
if (i >= message.length) {
return timer.cancel()
}
var cursor = UnoRuntime.queryInterface(XParagraphCursor, text.createTextCursor())
cursor.gotoEnd(false)
cursor.gotoStartOfParagraph(true)
cursor.setString(message[i])
i ++
}
}), 0, 450)निष्कर्ष
इस तरह मैंने लिबरऑफिस की जावास्क्रिप्ट/राइनो बाइंडिंग के साथ एक वर्डले क्लोन बनाया!
मैंने लिबरऑफिस में जावास्क्रिप्ट की वर्तमान स्थिति का पता लगाने के लिए यह परियोजना शुरू की।
कुल मिलाकर, यह बहुत उपयोगकर्ता के अनुकूल नहीं है, क्योंकि जावास्क्रिप्ट मैक्रो बनाने के लिए OpenDocument फ़ाइलों को मैन्युअल रूप से संशोधित करने की आवश्यकता होती है।
हालाँकि, मैं कार्यशील जावास्क्रिप्ट मैक्रो की स्थिरता से आश्चर्यचकित हूँ: यूएनओ एपीआई को C++ से जावा और फिर जावास्क्रिप्ट में ब्रिज किए जाने के बावजूद, मुझे ब्रिज से संबंधित कोई बग नहीं मिला, और मैक्रो जावा के मल्टीथ्रेडेड टाइमर के साथ भी काम कर रहा था!
लिबरऑफिस की मैक्रो परत के साथ काम करते हुए, मैंने बग्सडोनक्विक की तुलना में यूएनओ ऑब्जेक्ट मॉडल को अधिक देखा।
मुझे यह पसंद है कि कैसे यह मुझे लिबरऑफिस के हर हिस्से तक पहुंचने की अनुमति देता है और इसमें ऑफिस सुइट की किसी भी जरूरत के लिए एपीआई होती है।
उस संबंध में, मुझे यूएनओ कुछ हद तक गोडोट के नोड सिस्टम के समान लगता है जिसका उपयोग स्वयं गोडोट संपादक द्वारा किया जाता है, इसमें दोनों बहुत “व्यावहारिक” हैं। यह वेब की DOM या Jetpack जैसी UI लाइब्रेरी के बिल्कुल विपरीत है, जो सभी संभावित उपयोगकर्ता की संभावित आवश्यकताओं के इर्द-गिर्द घूमती हैं।
बेझिझक अपने लिए वर्डले-इन-लिबरेऑफिस आज़माएं, लिब्रेऑफिस जावास्क्रिप्ट एपीआई के साथ खेलें, या इस लेख के बारे में अपने किसी भी प्रश्न या टिप्पणी के लिए मुझसे संपर्क करें।
#100DaysToOffload के लिए यह मेरा 33वां लेख है।
और लेख ब्राउज़ करें?
← नंगे गिट रिपॉजिटरी के साथ सरल सीआई/सीडी
लेख टैग किए गए तकनीकी (16/16)
→|
← हनाबी के साथ भरोसा करना सीखना
लेख टैग किए गए 100 दिनऑफलोड करने के लिए (33/33)
→|
← हनाबी के साथ भरोसा करना सीखना
इस ब्लॉग पर लेख (40/40)
→|
