import {Meta} from '@storybook/addon-docs/blocks'

<Meta title='@dxtmisha/vi/functional-basic/Classes/MetaManager - Quản lý thẻ meta'/>

# Lớp MetaManager

Lớp generic cơ sở để đồng bộ hóa các thẻ meta HTML của tài liệu. Đọc các thẻ hiện có từ DOM khi khởi tạo và cung cấp giao diện thống nhất để đọc và ghi chúng.

Lớp này là lớp cha của `MetaOg`, `MetaTwitter` và `Meta`.

## Khởi tạo

Lớp này là **trừu tượng (abstract)**. Bạn không thể tạo instance của nó trực tiếp qua `new MetaManager()`. Thay vào đó, nó phải được kế thừa.

**Tham số constructor (cho các lớp con):**
- `listMeta: T` — danh sách tên các thẻ meta được quản lý bởi instance này.
- `isProperty?: boolean` — xác định thuộc tính được sử dụng: `true` cho `property` (Open Graph), `false` for `name` (thẻ tiêu chuẩn). Mặc định: `false`.

```typescript
import { MetaManager } from '@dxtmisha/functional-basic'

// Ví dụ kế thừa
class MyMeta extends MetaManager<string[]> {
  constructor() {
    super(['description', 'keywords'])
  }
}

const myMeta = new MyMeta()
```

## Phương thức

- `getListMeta(): T` — trả về danh sách tên thẻ được quản lý.
- `get(name): string` — trả về nội dung thẻ theo tên. Trả về `''` nếu chưa đặt.
- `getItems(): MetaList<T>` — trả về đối tượng với tất cả thẻ: `{ [name]: content }`.
- `set(name, content): this` — đặt thẻ trong DOM (tạo nếu chưa có). Hỗ trợ chuỗi phương thức.
- `setByList(metaList): this` — đặt nhiều thẻ từ một đối tượng. Hỗ trợ chuỗi phương thức.

## Tạo HTML

### `html(): string`

Tạo chuỗi HTML cho tất cả thẻ có nội dung. Dùng cho SSR.

```javascript
manager.set('description', 'Mô tả của tôi').set('keywords', 'vue, typescript')

manager.html()
// '<meta name="description" content="Mô tả của tôi"><meta name="keywords" content="vue, typescript">'
```

### `htmlTitle(title: string): string`

Chuyển đổi chuỗi tiêu đề thành thẻ HTML `<title>`.

```javascript
manager.htmlTitle('Tiêu đề trang')
// '<title>Tiêu đề trang</title>'
```
