NABI NOTE
एक मुक्त-स्रोत WYSIWYG संपादक
NABI NOTE एक ओपन-सोर्स WYSIWYG संपादक है जिसमें स्वरूपण, संरेखण, तालिका और अपलोड जैसी सुविधाएँ कोर से अलग कर स्वतंत्र «wing» मॉड्यूलों में रखी गई हैं। ज़रूरत के wing चुनकर संपादक बनाया जा सकता है और अपने बनाए wing भी जोड़े जा सकते हैं। यह शुद्ध JavaScript में लिखा है, इसलिए React या Vue जैसे फ़्रेमवर्क में भी इस्तेमाल हो सकता है। बिना बिल्ड सेटअप वाले पन्नों पर CDN पुस्तकालय से तुरंत शुरू किया जा सकता है। इसका अपना दस्तावेज़ प्रारूप NABI TREE ब्राउज़र DOM के बिना भी Node.js परिवेश में HTML में बदला जा सकता है। इनपुट दस्तावेज़ पंजीकृत नियमों से ठीक किए जाते हैं और HTML बनाते समय टेक्स्ट व विशेषताओं को एस्केप कर लिंक पते जाँचे जाते हैं। फिर भी अपने बनाए wing और सर्वर से मिले डेटा को अनुप्रयोग की सुरक्षा नीति के अनुसार अलग से जाँचना चाहिए। CSS चर और rem-आधारित लेआउट से थीम व आकार बदले जा सकते हैं; डार्क मोड और कई भाषाओं के लिए फ़ॉन्ट सेटिंग भी उपलब्ध हैं। तालिका क्रमबद्ध करना, स्थानीय इतिहास और AI से दस्तावेज़ पर काम करना इसी दस्तावेज़ मॉडल पर चलता रहता है।
लिपि
बिना पादिका (तयशुदा), पादिका सहित, समान-चौड़ाई और हस्तलेख — हर परिवार में लिपि-प्रणाली के हिसाब से फ़ॉन्ट चुने गए हैं, इसलिए कोई भी भाषा लिखिए, उस परिवार का चेहरा बना रहता है; जिस लिपि के लिए उस परिवार में हस्तलेख नहीं है, वह ब्राउज़र के तयशुदा फ़ॉन्ट पर लौट आती है। तयशुदा लिपि मेज़बान तय करता है।
नीचे हर परिवार कई भाषाओं में दिखाया गया है।
सैन्स सेरिफ़ · স্যান্স সেরিফ · سانس سیرف · Tanpa serif · بدون سریف · सॅन्स सेरिफ · Không chân · శాన్స్ సెరిఫ్ · Mara seref · Sans serif · Bila serif · சான்ஸ் செரிஃப் · ไร้เชิง · Senza grazie · 산세리프 · ゴシック体 · 无衬线 · Serifenlos · Sans empattement · Sin serifa · Sem serifa · Без засечек · بلا زخارف
सेरिफ़ · সেরিফ · سیرف · Berserif · سریف · सेरिफ · Có chân · సెరిఫ్ · Mai seref · Serif · Yenye serif · செரிஃப் · มีเชิง · Con grazie · 세리프 · 明朝体 · 衬线 · Avec empattement · Con serifa · Com serifa · С засечками · بزخارف
मोनोस्पेस · মনোস্পেস · یکساں چوڑائی · Lebar tetap · تکفاصله · Đơn cách · మోనోస్పేస్ · Tazara ɗaya · Eş aralıklı · Nafasi moja · ஒற்றையகலம் · ความกว้างคงที่ · Monospaziato · Monospace · 고정폭 · 等幅 · 等宽 · Dicktengleich · Chasse fixe · Monoespaciada · Monoespaçada · Моноширинный · ثابت العرض
हस्तलिपि · হস্তলিপি · رواں خط · Tulisan tangan · دستنویس · हस्ताक्षर · Chữ viết tay · చేతిరాత · Rubutun hannu · El yazısı · Mwandiko · கையெழுத்து · ลายมือ · Corsivo · Cursive · 필기체 · 筆記体 · 手写体 · Schreibschrift · Cursiva · Рукописный · خط اليد
अक्षर का आकार
बहुत छोटा
छोटा
बड़ा
बहुत बड़ा
शीर्षक
खाली पंक्ति में # लिखकर स्पेस दबाइए — वहीं शीर्षक बन जाता है।
H1
H2
H3
H4
H5
H6
मोटा · तिरछा · रेखांकित · कटा हुआ
मोटा तिरछा रेखांकित कटा हुआ — यह रहा उदाहरण।
इन्हें एक के ऊपर एक भी लगाया जा सकता है।
ऊपरी और निचला अंक
क्षेत्रफल 3.5 मी2 है, और पाद-टिप्पणी ऐसे लगती है।1
पानी H2O है।
अक्षर का रंग · हाइलाइटर
रंग ऐसे चुने गए हैं कि उजले और गहरे, दोनों में पढ़ने में सहज रहें।
अक्षर का रंग हरा · मूँगा · बैंगनी · अंबर · नीला
हाइलाइटर पीला · हरा · आसमानी · गुलाबी · जामुनी · नारंगी
कड़ी
पता डालिए और वह कड़ी बन जाता है।
पते में केवल http:// और https:// चलते हैं; javascript: जैसा कुछ नहीं चलेगा।
जैसे https://nabi.saro.me लिखकर स्पेस या एंटर दबाइए — यह अपने आप बदल जाता है, जैसा यहाँ दिख रहा है।
लिंक खोलना
तयशुदा रूप से एक ही मूल की कड़ी इसी खिड़की में और दूसरी साइट नई खिड़की में खुलती है; यह नियम संपादक घोषित करते समय तय किया जा सकता है।
संलग्नक की कड़ी
चित्र के अलावा कुछ चढ़ाने पर नीचे जैसी फ़ाइल-रूपी कड़ी बच रहती है।
संलग्नक बस इतना बचा रहता है।
संरेखण
बाएँ
बीच में
दाएँ
शीर्षक भी संरेखित होते हैं।
सूचियाँ
बिंदु-सूची
खाली पंक्ति में - लिखकर स्पेस दबाइए — वहीं बिंदु-सूची बन जाती है।
यह एक बिंदु है
Tab / Shift+Tab से भीतर और बाहर किया जाता है।
क्रमांकित सूची
खाली पंक्ति में 1. लिखकर स्पेस दबाइए — क्रमांकित सूची बन जाती है।
पहला
दूसरा
तीसरा
जाँच-सूची
खाली पंक्ति में [ ] या [x] लिखकर स्पेस दबाइए — जाँच-सूची बन जाती है।
यह काम हो चुका है।
यह अभी बाकी है।
सारणी
औज़ार-पट्टी की सारणी से बनाइए; पंक्तियाँ और स्तंभ जोड़े, हटाए और जोड़कर मिलाए जा सकते हैं।
स्तंभ की छँटाई
झलक दबाइए, फिर भंडार और दाम के शीर्ष एक-एक करके दबाइए।
मॉडल | भंडार | दाम | वज़न |
|---|---|---|---|
NB-7 | 1,200 | 349 | 1.2 kg |
NB-9 | 20,000 | 99 | 0.9 kg |
NB-12 | 3,500 | 1,299 | 1.4 kg |
NB-80 | 900 | 8,900 | 2.1 kg |
NB-100 | तय होना बाकी | 12,999 | 2.4 kg |
दाम में सब अंक हैं, इसलिए अंक की तरह छँटता है।
भंडार पाठ की तरह छँटता है, क्योंकि आख़िरी खाने में अक्षर हैं।
विभाजक रेखा
--- लिखकर एंटर दबाइए — विभाजक रेखा बन जाती है।
चित्र
चौड़ाई 30% से 100% तक रखी जा सकती है और वह बाएँ, बीच या दाएँ बैठता है।
YouTube
अपलोड
कोई चित्र या फ़ाइल संपादक पर खींचकर देखिए।
यहाँ का अपलोड बस दिखावा है; एक सेटिंग से यह आपके सर्वर से जुड़ जाता है।
अपलोड बिगड़ जाए तो वह चित्र या फ़ाइल संपादक से हटा दी जाती है।
उद्धरण
खाली पंक्ति में > लिखकर स्पेस दबाइए — उद्धरण का खाना बन जाता है।
यह कई पंक्तियों तक चल सकता है।
कोड
खाली पंक्ति में ``` लिखकर स्पेस या एंटर दबाइए — कोड का खाना बन जाता है।
भाषा भी साथ लिखिए, जैसे ```java, फिर स्पेस या एंटर — खाने पर वही भाषा लग जाती है।
import { createNabiWith, defaultWings } from 'nabi-note'
const { nabi } = createNabiWith(defaultWings)
const html = nabi.getHtml()मोड़
मोड़ शीर्षक और भीतरी सामग्री से बनता है।
आप तय कर सकते हैं कि यह बंद हालत में सहेजा जाए या खुली।
शॉर्टकट
Shift दो बार तेज़ी से दबाइए — औज़ार-पट्टी हर सुविधा का शॉर्टकट दिखा देती है।
स्वतः सजावट
उदाहरण | कुंजी | परिणाम |
|---|---|---|
# | स्पेस | शीर्षक |
- | स्पेस | बिंदु-सूची |
1. | स्पेस | क्रमांकित सूची |
[ ] · [x] | स्पेस | जाँच-सूची |
> | स्पेस | उद्धरण |
``` · ```ts | स्पेस · एंटर | कोड का खाना |
--- | एंटर | विभाजक रेखा |
https://… | स्पेस · एंटर | कड़ी |
निर्गम फलन
फलन | परिणाम |
|---|---|
getHtml() | HTML |
getJson() | JSON |
बिना DOM के भी चलता है
JSON से HTML बनाने के लिए DOM की ज़रूरत नहीं।
सर्वर (Node.js) सहेजे हुए नाबी-वृक्ष को ज्यों का त्यों पढ़कर, XSS रोकते हुए HTML जोड़ सकता है।
मोबाइल के अनुकूल
मोबाइल रूप — अनुक्रियाशील मांडणी मोबाइल का रूप सँभालती है।
कीबोर्ड की भरपाई — कीबोर्ड खुलने पर उसकी ऊँचाई की भरपाई हो जाती है।
लचीले आकार — सारे आकार rem में लिखे गए हैं।
बहुभाषी — यह कई भाषाओं का समर्थन करता है।
अपने मन का रूप
अपना wing — कोई सुविधा चाहिए तो खुद बनाकर लगा लीजिए।
अपना CSS — रंग, कोने और अंतराल सब --nabi-* से तय हैं, गहरा हो या उजला — आपकी मर्ज़ी।
मुक्त स्रोत — GitHub पर मुक्त स्रोत के रूप में उपलब्ध।
दस्तावेज़ देखिए → nabi.saro.me
npm install nabi-noteimport {
createNabiWith, mountSurface, mountToolbar, mountContextToolbar,
mountHints, watchSettle, defaultWings, mountUpload, mountUploadView,
browserFileStore, mountFile, parseNodes, mountViewTools,
browserHistoryStorage, mountLocalHistory, openHistoryPanel,
} from 'nabi-note'
import { mountDiffWing } from 'nabi-note/diff'
// The box that asks — without it the core answers "no" to everything (plug in your own)
const ask = { message: (t: string) => alert(t), confirm: (t: string) => confirm(t) }
const selected = [
...defaultWings,
]
const { nabi, registry } = createNabiWith(selected, { ask })
// Bring your own highlighter (Prism, highlight.js, Shiki, …) — the wing stays as it is
// and only the attach is swapped (`makeCodeAttach` ships from the same door)
// { ...codeWing, attach: makeCodeAttach({ highlight: (source, lang) => [{ text: source }] }) }
const root = document.querySelector('.nabi')!
const content = document.querySelector('.nabi-content')!
const view = mountUploadView({ nabi, surface: content })
const upload = mountUpload({
nabi, root: content,
// your upload goes here — report progress with task.onProgress(0–100)
uploader: async (task) => ({ uri: 'https://cdn.example/uploaded' }),
extensions: ['png', 'jpg', 'pdf'], maxFileSize: 10 * 1024 * 1024,
onStart: (tasks) => view.start(tasks),
onProgress: (id, percent) => view.progress(id, percent),
onSettle: () => view.settle(),
onDone: () => view.done(),
})
const file = mountFile({ nabi, registry, store: browserFileStore(document), parse: parseNodes, locale: 'hi', name: () => 'note' })
const history = mountLocalHistory({ nabi, storage: browserHistoryStorage(window) })
const diff = mountDiffWing({ nabi, registry, surface: content, locale: 'hi' })
// The locale also sets the direction — Arabic and Urdu run right to left
mountSurface({ nabi, registry, root: content, locale: 'hi', fileSink: upload.take })
const settle = watchSettle(document, { surface: content })
const shared = { nabi, registry, surface: content, settle, locale: 'hi' }
// A tool that needs a panel comes back to the host — without this the button is dead
const toolbar = mountToolbar({
...shared, root: document.querySelector('#toolbar')!,
file,
onFiles: upload.take,
onHost: (w) => {
if (w === 'diff') { diff.open(); return }
if (w !== 'localHistory') return
openHistoryPanel({
history, surface: content, locale: 'hi', sessionId: history.sessionId,
render: (record) => createNabiWith(selected, { doc: JSON.parse(record.body) }).nabi.getHtml(),
})
},
})
const context = mountContextToolbar({ ...shared, root: document.querySelector('#context')! })
mountHints({ toolbar, context, root, surface: content })
// The preview and fullscreen buttons — they stand their own box at the end of the row
mountViewTools({ ...shared, root, container: document.querySelector('#toolbar')! })
// on every change — hook up your own code here
// nabi.onChange(() => user_callback(nabi.getHtml()))