Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,9 @@
<a href="docs/i18n/README-kr.md#readme">
<span>:kr:</span>
</a>
<a href="docs/i18n/README-bn.md#readme">
<span>:bangladesh:</span>
</a>
</div>

<div align="center">
Expand Down
3 changes: 3 additions & 0 deletions docs/i18n/README-ar.md
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,9 @@
<a href="README-kr.md#readme">
<span>:kr:</span>
</a>
<a href="README-bn.md#readme">
<span>:bangladesh:</span>
</a>
</div>

<div dir="rtl" align="center">
Expand Down
201 changes: 201 additions & 0 deletions docs/i18n/README-bn.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,201 @@
<p align="center"><img src="../assets/logo-small.png" alt="MarkText" width="100" height="100"></p>

<h1 align="center">MarkText</h1>

<div align="center">
<a href="https://twitter.com/intent/tweet?via=marktextme&url=https://github.com/marktext/marktext/&text=What%20do%20you%20want%20to%20say%20to%20app?&hashtags=happyMarkText">
<img src="https://img.shields.io/twitter/url/https/github.com/marktext/marktext.svg?style=for-the-badge" alt="twitter">
</a>
</div>
<div align="center">
<strong>:high_brightness: আধুনিক প্রজন্মের Markdown এডিটর :crescent_moon:</strong><br>
একটি সাধারণ এবং অত্যাধুনিক ওপেন-সোর্স Markdown এডিটর যা গতি এবং ব্যবহারযোগ্যতার দিকে গুরুত্ত দেয়।<br>
<sub>Linux, macOS এবং Windows-এর জন্য।</sub>
</div>

<br>

<div align="center">
<!-- License -->
<a href="../../LICENSE">
<img src="https://img.shields.io/github/license/marktext/marktext.svg" alt="LICENSE">
</a>
<!-- Downloads total -->
<a href="https://github.com/marktext/marktext/releases">
<img src="https://img.shields.io/github/downloads/marktext/marktext/total.svg" alt="total download">
</a>
<!-- Downloads latest release -->
<a href="https://github.com/marktext/marktext/releases/latest">
<img src="https://img.shields.io/github/downloads/marktext/marktext/latest/total.svg" alt="latest download">
</a>
<!-- sponsors -->
<a href="https://opencollective.com/marktext">
<img src="https://opencollective.com/marktext/tiers/silver-sponsors/badge.svg?label=SilverSponsors&color=brightgreen" alt="sponsors">
</a>
</div>

<div align="center">
<h3>
<a href="https://github.com/marktext/marktext">
Website
</a>
<span> | </span>
<a href="https://github.com/marktext/marktext#features">
বৈশিষ্ট্য
</a>
<span> | </span>
<a href="https://github.com/marktext/marktext#download-and-installation">
ডাউনলোড
</a>
<span> | </span>
<a href="https://github.com/marktext/marktext#development">
ডেভেলপমেন্ট
</a>
<span> | </span>
<a href="https://github.com/marktext/marktext#contribution">
অবদান
</a>
</h3>
</div>

<div align="center">
<sub>অনুবাদসমূহ:</sub>
<a href="../../README.md">
<span>:uk:</span>
</a>
<a href="README-zh_cn.md#readme">
<span>:cn:</span>
</a>
<a href="README-zh_tw.md#readme">
<span>:taiwan:</span>
</a>
<a href="README-de.md#readme">
<span>:de:</span>
</a>
<a href="README-jp.md#readme">
<span>:jp:</span>
</a>
<a href="README-fr.md#readme">
<span>:fr:</span>
</a>
<a href="README-tr.md#readme">
<span>:tr:</span>
</a>
<a href="README-es.md#readme">
<span>:es:</span>
</a>
<a href="README-pt.md#readme">
<span>:portugal:</span>
</a>
<a href="README-kr.md#readme">
<span>:kr:</span>
</a>
<a href="README-ar.md#readme">
<span>:saudi_arabia:</span>
</a>
</div>

<div align="center">
<sub>এই Markdown এডিটরটি ❤︎ দিয়ে তৈরি করেছেন
<a href="https://github.com/Jocs">Jocs</a> এবং
<a href="https://github.com/marktext/marktext/graphs/contributors">
অবদানকারীরা
</a>
</sub>
</div>

<br />

<h2 align="center">স্পনসর</h2>

MarkText একটি ওপেন-সোর্স Markdown এডিটর, যা এর কমিউনিটির সহায়তায় এগিয়ে চলছে। MarkText যদি আপনার কাজের ধারা উন্নত করে থাকে, তাহলে অনুগ্রহ করে [প্রজেক্টটিকে স্পনসর করার](https://github.com/sponsors/marktext) কথা বিবেচনা করুন। সব স্পনসরকে ধন্যবাদ ❤️

**বিশেষ স্পনসর**

| [<img src="../assets/sponsors/serpapi.png" width="150">](https://serpapi.com/?utm_source=marktext) | [আমাদের দ্রুত, সহজ এবং পূর্ণাঙ্গ API দিয়ে Google ও অন্যান্য সার্চ ইঞ্জিন থেকে ফলাফল সংগ্রহ করুন।](https://serpapi.com/?utm_source=marktext) |
| ------------- |:-------------|

## স্ক্রিনশট

![](../assets/marktext.png?raw=true)

## বৈশিষ্ট্য

- রিয়েলটাইম প্রিভিউ (WYSIWYG) এবং পরিচ্ছন্ন, আধুনিক ইন্টারফেস আপনাকে গভীর মনোযোগের সাথে লেখার অভিজ্ঞতা দেয়।
- [CommonMark Spec](https://spec.commonmark.org), [GitHub Flavored Markdown Spec](https://github.github.com/gfm/) এবং আংশিকভাবে [Pandoc markdown](https://pandoc.org/MANUAL.html#pandocs-markdown) সমর্থন করে।
- Markdown এক্সটেনশন যেমন গণিতের অভিব্যক্তি (KaTeX), front matter এবং emoji সমর্থন করে।
- দ্রুত লেখার জন্য paragraph ও inline style shortcut সমর্থন করে।
- **HTML** এবং **PDF** ফাইলে এক্সপোর্ট করা যায়।
- বিভিন্ন [theme](https://marktext.me/docs/themes): **Cadmium Light**, **Material Dark** ইত্যাদি।
- বিভিন্ন এডিটিং মোড: **Source Code mode**, **Typewriter mode**, **Focus mode**।
- ক্লিপবোর্ড থেকে সরাসরি ছবি পেস্ট করা যায়।

## ডাউনলোড ও ইনস্টলেশন

![platform](https://img.shields.io/static/v1.svg?label=Platform&message=Linux%20x64%20|%20macOS%20x64%2Farm64%20|%20Windows%20x64%2Farm64&style=for-the-badge)

| ![](https://raw.githubusercontent.com/wiki/ryanoasis/nerd-fonts/screenshots/v1.0.x/mac-pass-sm.png) | ![](https://raw.githubusercontent.com/wiki/ryanoasis/nerd-fonts/screenshots/v1.0.x/windows-pass-sm.png) | ![](https://raw.githubusercontent.com/wiki/ryanoasis/nerd-fonts/screenshots/v1.0.x/linux-pass-sm.png) |
|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|
| [![Download for macOS](https://img.shields.io/badge/macOS-Download-blue)](https://github.com/marktext/marktext/releases/latest) | [![Download for Windows](https://img.shields.io/badge/Windows-Download-blue)](https://github.com/marktext/marktext/releases/latest) | [![Download for Linux](https://img.shields.io/badge/Linux-Download-blue)](https://github.com/marktext/marktext/releases/latest) |

সর্বশেষ সংস্করণের নতুন ফিচারগুলো দেখতে [CHANGELOG](https://marktext.me/docs/changelog) দেখুন।

#### macOS

macOS 11 (Big Sur) বা পরবর্তী সংস্করণ প্রয়োজন। Universal build প্রকাশ করা হয় না, তাই আপনার মেশিনের সঙ্গে মিল থাকা `arm64` বা `x64` installer বেছে নিন।

আপনি [release page](https://github.com/marktext/marktext/releases/latest) থেকে সর্বশেষ `marktext-mac-(arm64|x64)-%version%.dmg` ডাউনলোড করতে পারেন, অথবা [**homebrew cask**](https://github.com/caskroom/homebrew-cask) ব্যবহার করে MarkText ইনস্টল করতে পারেন। Homebrew-Cask ব্যবহার করতে হলে আগে [Homebrew](https://brew.sh/) ইনস্টল করা থাকতে হবে।

```bash
brew install --cask mark-text
```

#### Windows

Windows 10 অথবা 11 প্রয়োজন। x64 এবং arm64 - উভয় installer প্রকাশ করা হয়, তাই আপনার মেশিনের architecture অনুযায়ীটি বেছে নিন।

শুধু setup wizard (`marktext-win-(x64|arm64)-%version%-setup.exe`) ডাউনলোড করে ইনস্টল করুন এবং user-only নাকি machine-wide ইনস্টল করবেন তা বেছে নিন। বিকল্পভাবে, [Chocolatey](https://chocolatey.org/) বা [Winget](https://docs.microsoft.com/en-us/windows/package-manager/winget/) এর মতো package manager ব্যবহার করেও MarkText ইনস্টল করতে পারেন।

Chocolatey ব্যবহার করতে চাইলে আগে [Chocolatey](https://chocolatey.org/install) ইনস্টল করা থাকতে হবে:

```bash
choco install marktext
```

Winget ব্যবহার করতে চাইলে আগে [Winget](https://docs.microsoft.com/en-us/windows/package-manager/winget/#install-winget) ইনস্টল করা থাকতে হবে:

```bash
winget install marktext
```

#### Linux

অনুগ্রহ করে [Linux installation instructions](https://marktext.me/docs/installation) অনুসরণ করুন।

#### অন্যান্য

Linux, macOS এবং Windows-এর সব binary [release page](https://github.com/marktext/marktext/releases/latest) থেকে ডাউনলোড করা যাবে। আপনার সিস্টেমের জন্য কোনো সংস্করণ না থাকলে একটি [issue](https://github.com/marktext/marktext/issues) খুলুন।

## ডেভেলপমেন্ট

আপনি যদি নিজে MarkText build করতে চান, তাহলে আমাদের [build instructions](https://marktext.me/docs/dev/build) দেখুন।

- [ব্যবহারকারী ডকুমেন্টেশন](https://marktext.me/docs/introduction)
- [ডেভেলপার ডকুমেন্টেশন](https://marktext.me/docs/dev/overview)

MarkText সম্পর্কে আপনার কোনো প্রশ্ন থাকলে issue খুলতে পারেন। Issue খোলার সময় অনুগ্রহ করে ডিফল্ট ফরম্যাটটি ব্যবহার করুন। অবশ্যই, সরাসরি PR পাঠালে সেটিও অত্যন্ত প্রশংসিত হবে।

## অবদান

MarkText এখনো উন্নয়নাধীন, তাই pull request করার আগে [Contributing Guide](../../.github/CONTRIBUTING.md) পড়ে নিন। MarkText-এ নতুন ফিচার যোগ করতে চান? আমাদের [roadmap](https://github.com/marktext/marktext/projects) এবং open issue দেখুন।

## অবদানকারীরা

যারা ইতিমধ্যেই MarkText-এ অবদান রেখেছেন, তাদের সবাইকে ধন্যবাদ [[contributors](https://github.com/marktext/marktext/graphs/contributors)]।

<a href="https://github.com/marktext/marktext/graphs/contributors"><img src="https://opencollective.com/marktext/contributors.svg?width=890" /></a>

## লাইসেন্স

[**MIT**](../../LICENSE)।
3 changes: 3 additions & 0 deletions docs/i18n/README-de.md
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,9 @@
<a href="README-ar.md#readme">
<span>:saudi_arabia:</span>
</a>
<a href="README-bn.md#readme">
<span>:bangladesh:</span>
</a>
</div>

<div align="center">
Expand Down
3 changes: 3 additions & 0 deletions docs/i18n/README-es.md
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,9 @@
<a href="README-ar.md#readme">
<span>:saudi_arabia:</span>
</a>
<a href="README-bn.md#readme">
<span>:bangladesh:</span>
</a>
</div>

<div align="center">
Expand Down
3 changes: 3 additions & 0 deletions docs/i18n/README-fr.md
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,9 @@
<a href="README-ar.md#readme">
<span>:saudi_arabia:</span>
</a>
<a href="README-bn.md#readme">
<span>:bangladesh:</span>
</a>
</div>

<div align="center">
Expand Down
3 changes: 3 additions & 0 deletions docs/i18n/README-jp.md
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,9 @@
<a href="README-ar.md#readme">
<span>:saudi_arabia:</span>
</a>
<a href="README-bn.md#readme">
<span>:bangladesh:</span>
</a>
</div>

<div align="center">
Expand Down
3 changes: 3 additions & 0 deletions docs/i18n/README-kr.md
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,9 @@
<a href="README-ar.md#readme">
<span>:saudi_arabia:</span>
</a>
<a href="README-bn.md#readme">
<span>:bangladesh:</span>
</a>
</div>

<div align="center">
Expand Down
3 changes: 3 additions & 0 deletions docs/i18n/README-pt.md
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,9 @@
<a href="README-ar.md#readme">
<span>:saudi_arabia:</span>
</a>
<a href="README-bn.md#readme">
<span>:bangladesh:</span>
</a>
</div>

<div align="center">
Expand Down
3 changes: 3 additions & 0 deletions docs/i18n/README-tr.md
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,9 @@
<a href="README-ar.md#readme">
<span>:saudi_arabia:</span>
</a>
<a href="README-bn.md#readme">
<span>:bangladesh:</span>
</a>
</div>

<div align="center">
Expand Down
3 changes: 3 additions & 0 deletions docs/i18n/README-zh_cn.md
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,9 @@
<a href="README-ar.md#readme">
<span>:saudi_arabia:</span>
</a>
<a href="README-bn.md#readme">
<span>:bangladesh:</span>
</a>
</div>

<div align="center">
Expand Down
3 changes: 3 additions & 0 deletions docs/i18n/README-zh_tw.md
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,9 @@
<a href="README-ar.md#readme">
<span>:saudi_arabia:</span>
</a>
<a href="README-bn.md#readme">
<span>:bangladesh:</span>
</a>
</div>

<div align="center">
Expand Down
77 changes: 77 additions & 0 deletions packages/muya/src/history/__tests__/identityOpJsonChange.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
// @vitest-environment happy-dom

// Regression for #4806: an identity (`null`) ot-json1 op must never crash
// History. `compose()` legitimately yields `null` when queued ops cancel out
// (e.g. IME edits), and both the deferred-flush emitter and the `dispatch`
// path can surface it through `json-change`. `History` reads `op.length`, so a
// forwarded `null` threw `Cannot read properties of null (reading 'length')`.

import * as json1 from 'ot-json1';
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
import { Muya } from '../../muya';
import { asDoc } from '../../state';

const bootedHosts: HTMLElement[] = [];

beforeEach(() => {
window.MUYA_VERSION = 'test';
});

afterEach(() => {
while (bootedHosts.length)
bootedHosts.pop()!.remove();
document.getSelection()?.removeAllRanges();
delete (window as Partial<Window>).MUYA_VERSION;
});

function bootMuya(markdown: string): Muya {
const host = document.createElement('div');
document.body.appendChild(host);
const muya = new Muya(host, { markdown } as ConstructorParameters<typeof Muya>[1]);
muya.init();
bootedHosts.push(muya.domNode);
return muya;
}

function undoDepth(muya: Muya): number {
// @ts-expect-error — reach into the private stack for test assertions.
return muya.editor.history._stack.undo.length;
}

describe('identity (null) op via json-change — #4806', () => {
it('updateContents(null) does not crash History and records nothing', () => {
const muya = bootMuya('hello\n');

// `Editor.updateContents` deliberately forwards the identity op to
// `dispatch`, which emits a `json-change` carrying `op: null`.
expect(() => muya.editor.updateContents(null, null, 'user')).not.toThrow();

expect(muya.getMarkdown().trim()).toBe('hello');
expect(undoDepth(muya)).toBe(0);
});

it('flushing a compose-to-null batch is a no-op (locks #4815)', () => {
const muya = bootMuya('hello\n');
const jsonState = muya.editor.jsonState;

// A real op and its exact inverse compose to the identity op — the
// op-level shape of an IME insert cancelled by a delete in one frame.
const op = json1.insertOp([1], asDoc({ name: 'paragraph', text: 'x' } as never))!;
const inverse = json1.type.invert(op);
expect(json1.type.compose(op, inverse)).toBe(null);

let changes = 0;
muya.eventCenter.on('json-change', () => {
changes += 1;
});

// @ts-expect-error — drive the private deferred-flush path directly.
jsonState._operationCache.push(op, inverse);
// @ts-expect-error — the function the crash stack named.
expect(() => jsonState._flushOperationCache()).not.toThrow();

expect(changes).toBe(0);
expect(muya.getMarkdown().trim()).toBe('hello');
expect(undoDepth(muya)).toBe(0);
});
});
Loading
Loading