react-native-address-parse 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.OpenHarmony.md +85 -0
- package/README.OpenHarmony_CN.md +97 -0
- package/harmony/AppScope/app.json5 +10 -0
- package/harmony/AppScope/resources/base/element/string.json +8 -0
- package/harmony/AppScope/resources/base/media/app_icon.png +0 -0
- package/harmony/address_parse/BuildProfile.ets +17 -0
- package/harmony/address_parse/Index.ets +2 -0
- package/harmony/address_parse/build-profile.json5 +11 -0
- package/harmony/address_parse/hvigor/hvigor-config.json5 +8 -0
- package/harmony/address_parse/hvigorfile.ts +13 -0
- package/harmony/address_parse/oh-package.json5 +22 -0
- package/harmony/address_parse/src/main/cpp/CMakeLists.txt +8 -0
- package/harmony/address_parse/src/main/cpp/ReactNativeAddressParsePackage.cpp +1 -0
- package/harmony/address_parse/src/main/cpp/ReactNativeAddressParsePackage.h +44 -0
- package/harmony/address_parse/src/main/ets/AddressParsePackage.ets +10 -0
- package/harmony/address_parse/src/main/ets/AddressParseTurboModule.ets +600 -0
- package/harmony/address_parse/src/main/ets/data/Areas.ets +12 -0
- package/harmony/address_parse/src/main/ets/data/Cities.ets +12 -0
- package/harmony/address_parse/src/main/ets/data/GovData.ets +11 -0
- package/harmony/address_parse/src/main/ets/data/Names.ets +6 -0
- package/harmony/address_parse/src/main/ets/data/Provinces.ets +12 -0
- package/harmony/address_parse/src/main/module.json5 +11 -0
- package/harmony/build-profile.json5 +26 -0
- package/harmony/hvigor/hvigor-config.json5 +8 -0
- package/harmony/hvigorfile.ts +6 -0
- package/harmony/oh-package.json5 +6 -0
- package/harmony/react_native_address_parse.har +0 -0
- package/index.d.ts +33 -0
- package/index.tsx +43 -0
- package/package.json +29 -0
- package/src/NativeAddressParse.ts +27 -0
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# react-native-address-parse HarmonyOS Adaptation
|
|
2
|
+
|
|
3
|
+
English | [简体中文](./README.OpenHarmony_CN.md)
|
|
4
|
+
|
|
5
|
+
HarmonyOS/OpenHarmony adaptation of [zh-address-parse](https://github.com/zhaocjcc/zh-address-parse): parse Chinese delivery addresses (province/city/area/detail/name/phone/postalCode).
|
|
6
|
+
|
|
7
|
+
## Directory Structure
|
|
8
|
+
|
|
9
|
+
```text
|
|
10
|
+
├── src/NativeAddressParse.ts # codegen TurboModule spec
|
|
11
|
+
├── index.tsx # JS entry
|
|
12
|
+
├── index.d.ts # type declarations
|
|
13
|
+
├── harmony/
|
|
14
|
+
│ ├── address_parse/ # ArkTS module source
|
|
15
|
+
│ │ ├── src/main/ets/
|
|
16
|
+
│ │ │ ├── AddressParseTurboModule.ets # core parser (built-in admin-division data)
|
|
17
|
+
│ │ │ └── AddressParsePackage.ets # Package registration
|
|
18
|
+
│ │ ├── src/main/cpp/
|
|
19
|
+
│ │ │ └── ReactNativeAddressParsePackage.h/.cpp # C++ glue layer
|
|
20
|
+
│ │ └── oh-package.json5
|
|
21
|
+
│ └── react_native_address_parse.har # prebuilt HAR artifact
|
|
22
|
+
└── package.json # includes harmony.autolinking config
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Compatibility
|
|
26
|
+
|
|
27
|
+
| Item | Description |
|
|
28
|
+
|------|-------------|
|
|
29
|
+
| RNOH version | 0.84.x |
|
|
30
|
+
| HarmonyOS / OpenHarmony | API 12+ (modelVersion 26.0.0) |
|
|
31
|
+
| Architecture | Fabric + TurboModule (New Architecture) |
|
|
32
|
+
|
|
33
|
+
## Usage
|
|
34
|
+
|
|
35
|
+
The API is identical to the original library:
|
|
36
|
+
|
|
37
|
+
```tsx
|
|
38
|
+
import parseAddress from 'react-native-address-parse';
|
|
39
|
+
|
|
40
|
+
const result = await parseAddress('浙江省杭州市西湖区文三路138号张三 13812345678');
|
|
41
|
+
// {
|
|
42
|
+
// province: '浙江省', provinceCode: '33',
|
|
43
|
+
// city: '杭州市', cityCode: '3301',
|
|
44
|
+
// area: '西湖区', areaCode: '330106',
|
|
45
|
+
// detail: '文三路138号',
|
|
46
|
+
// name: '张三', phone: '13812345678', postalCode: ''
|
|
47
|
+
// }
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Optional options:
|
|
51
|
+
|
|
52
|
+
```tsx
|
|
53
|
+
parseAddress(address, {
|
|
54
|
+
type: 0, // 0: normal mode (default), 1: extra gov data mode
|
|
55
|
+
textFilter: [], // keywords to filter out
|
|
56
|
+
nameMaxLength: 0, // max name length, 0 = unlimited
|
|
57
|
+
extraGovData: { province: [], city: [], area: [] }, // custom admin divisions
|
|
58
|
+
});
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Integration (host project)
|
|
62
|
+
|
|
63
|
+
1. After `npm install react-native-address-parse`, add to `harmony/oh-package.json5` and `harmony/entry/oh-package.json5`:
|
|
64
|
+
|
|
65
|
+
```json5
|
|
66
|
+
"dependencies": {
|
|
67
|
+
"@rnoh/react-native-address-parse--address_parse": "file:../node_modules/react-native-address-parse/harmony/react_native_address_parse.har",
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
2. Run `ohpm install` again; autolinking will generate `RNOHPackagesFactory.ets` / `autolinking.cmake` and link the C++ Package (class name `ReactNativeAddressParsePackage`).
|
|
72
|
+
|
|
73
|
+
3. Rebuild the JS bundle (`npx react-native bundle-harmony`) and the HAP.
|
|
74
|
+
|
|
75
|
+
## Implementation Notes
|
|
76
|
+
|
|
77
|
+
- Address parsing and admin-division matching run synchronously on the ArkTS side via the TurboModule `parse` method; built-in data covers 34 provinces (incl. HK/MO/TW) / 392 cities / 3209 districts.
|
|
78
|
+
- **Admin-division data source**: [AreaCity-JsSpider-StatsGov](https://github.com/xiangyuecn/AreaCity-JsSpider-StatsGov) release `2025.251231.260403` (collected 2026-04-03, includes latest changes such as Chongqing Liangjiang New Area). It aggregates [National Place Name Information Base](https://dmfw.mca.gov.cn/) (2025-12-31; the authoritative official source since MCA/MoS stopped publishing division codes in 2026), Tencent Maps divisions v20251119 and AMap divisions. The generated `.ets` data files also carry the source attribution in their headers — do not edit them manually.
|
|
79
|
+
- The C++ glue layer must declare `methodMap_` in the `ArkTSTurboModule` subclass constructor (`ARK_METHOD_METADATA(parse, 5)`); otherwise the TM registers but JS calls fail with "undefined is not a function".
|
|
80
|
+
- Host oh-package dependency keys must carry the HAR module suffix (`--address_parse`).
|
|
81
|
+
- If "Cannot find module" appears after upgrading the HAR, delete `harmony/entry/src/main/ets/RNOHPackagesFactory.ets` and both `oh-package-lock.json5` files, then reinstall.
|
|
82
|
+
|
|
83
|
+
## License
|
|
84
|
+
|
|
85
|
+
MIT © zh-address-parse contributors. Adaptation for HarmonyOS/OpenHarmony under the same MIT license.
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# react-native-address-parse HarmonyOS 适配文档
|
|
2
|
+
|
|
3
|
+
> 基于 [zh-address-parse](https://github.com/zhaocjcc/zh-address-parse) 的鸿蒙适配版。原库为纯 JS 中国地址解析库,本版本将其核心解析算法移植为 ArkTS TurboModule,供 RNOH (React Native OpenHarmony) 项目使用。
|
|
4
|
+
|
|
5
|
+
## 下载安装
|
|
6
|
+
|
|
7
|
+
| 资料来源 | 地址 |
|
|
8
|
+
|---------|------|
|
|
9
|
+
| AtomGit | https://atomgit.com/oh-react-native/react-native-address-parse |
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
npm install react-native-address-parse
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## 目录结构
|
|
16
|
+
|
|
17
|
+
```text
|
|
18
|
+
├── src/NativeAddressParse.ts # codegen TurboModule spec
|
|
19
|
+
├── index.tsx # JS 入口
|
|
20
|
+
├── index.d.ts # 类型声明
|
|
21
|
+
├── harmony/
|
|
22
|
+
│ ├── address_parse/ # ArkTS 模块源码
|
|
23
|
+
│ │ ├── src/main/ets/
|
|
24
|
+
│ │ │ ├── AddressParseTurboModule.ets # 核心解析实现(内置行政区划数据)
|
|
25
|
+
│ │ │ └── AddressParsePackage.ets # Package 注册
|
|
26
|
+
│ │ ├── src/main/cpp/
|
|
27
|
+
│ │ │ └── ReactNativeAddressParsePackage.h/.cpp # C++ 胶水层
|
|
28
|
+
│ │ └── oh-package.json5
|
|
29
|
+
│ └── react_native_address_parse.har # 预构建 HAR 产物
|
|
30
|
+
└── package.json # 含 harmony.autolinking 配置
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## 兼容性说明
|
|
34
|
+
|
|
35
|
+
| 项目 | 说明 |
|
|
36
|
+
|------|------|
|
|
37
|
+
| RNOH 版本 | 0.84.x |
|
|
38
|
+
| HarmonyOS / OpenHarmony | API 12+ (modelVersion 26.0.0) |
|
|
39
|
+
| 架构 | Fabric + TurboModule (New Architecture) |
|
|
40
|
+
|
|
41
|
+
## 使用方法
|
|
42
|
+
|
|
43
|
+
与原库 API 完全一致:
|
|
44
|
+
|
|
45
|
+
```tsx
|
|
46
|
+
import parseAddress from 'react-native-address-parse';
|
|
47
|
+
|
|
48
|
+
const result = await parseAddress('浙江省杭州市西湖区文三路138号张三 13812345678');
|
|
49
|
+
// {
|
|
50
|
+
// province: '浙江省', provinceCode: '33',
|
|
51
|
+
// city: '杭州市', cityCode: '3301',
|
|
52
|
+
// area: '西湖区', areaCode: '330106',
|
|
53
|
+
// detail: '文三路138号',
|
|
54
|
+
// name: '张三', phone: '13812345678', postalCode: ''
|
|
55
|
+
// }
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
可选参数:
|
|
59
|
+
|
|
60
|
+
```tsx
|
|
61
|
+
parseAddress(address, {
|
|
62
|
+
type: 0, // 0: 正常模式(默认),1: 补充政府区划数据模式
|
|
63
|
+
textFilter: [], // 需过滤的关键词
|
|
64
|
+
nameMaxLength: 0, // 姓名最大长度限制,0 表示不限制
|
|
65
|
+
extraGovData: { province: [], city: [], area: [] }, // 自定义行政区划数据
|
|
66
|
+
});
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## 接入方式(宿主工程)
|
|
70
|
+
|
|
71
|
+
1. `npm install react-native-address-parse` 后,在 `harmony/oh-package.json5` 与 `harmony/entry/oh-package.json5` 添加:
|
|
72
|
+
|
|
73
|
+
```json5
|
|
74
|
+
"dependencies": {
|
|
75
|
+
"@rnoh/react-native-address-parse--address_parse": "file:../node_modules/react-native-address-parse/harmony/react_native_address_parse.har",
|
|
76
|
+
}
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
2. 重新执行 `ohpm install`,autolinking 会自动生成 `RNOHPackagesFactory.ets` / `autolinking.cmake` 并链接 C++ Package(类名 `ReactNativeAddressParsePackage`)。
|
|
80
|
+
|
|
81
|
+
3. JS 侧重新打包 bundle(`npx react-native bundle-harmony`)并构建 HAP。
|
|
82
|
+
|
|
83
|
+
## 实现说明与注意事项
|
|
84
|
+
|
|
85
|
+
- 地址解析、行政区划匹配均在 ArkTS 侧同步完成,JS 侧通过 TurboModule `parse` 方法调用;内置数据:34 省(含港澳台)/ 392 市 / 3209 区县。
|
|
86
|
+
- **行政区划数据出处**:[AreaCity-JsSpider-StatsGov](https://github.com/xiangyuecn/AreaCity-JsSpider-StatsGov) `2025.251231.260403` 版(2026-04-03 采集,含重庆两江新区等最新变更)。该数据聚合自 [国家地名信息库](https://dmfw.mca.gov.cn/)(2025-12-31,2026 年起民政部/统计局不再另行公布区划代码,此为官方权威渠道)、腾讯地图行政区划 v20251119、高德地图行政区域。数据转换脚本生成的 `.ets` 文件头部亦标注了出处,请勿手工编辑。
|
|
87
|
+
- C++ 胶水层需在 `ArkTSTurboModule` 子类构造函数中声明 `methodMap_`(`ARK_METHOD_METADATA(parse, 5)`),否则 TM 注册成功但 JS 调用会报 "undefined is not a function"。
|
|
88
|
+
- `package.json` 的 `harmony.autolinking.ohPackageName` 为 `@rnoh/react-native-address-parse`;宿主 oh-package 的依赖 key 需带 HAR 模块名后缀(`--address_parse`)。
|
|
89
|
+
- 升级 HAR 后若报 "Cannot find module",删除 `harmony/entry/src/main/ets/RNOHPackagesFactory.ets` 与两级 `oh-package-lock.json5` 后重装。
|
|
90
|
+
|
|
91
|
+
## 遗留问题
|
|
92
|
+
|
|
93
|
+
- 无。
|
|
94
|
+
|
|
95
|
+
## 开源协议
|
|
96
|
+
|
|
97
|
+
本项目基于 [The MIT License (MIT)](https://opensource.org/licenses/mit-license.php) ,请自由地享受和参与开源。
|
|
Binary file
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Use these variables when you tailor your ArkTS code. They must be of the const type.
|
|
3
|
+
*/
|
|
4
|
+
export const HAR_VERSION = '1.0.0';
|
|
5
|
+
export const BUILD_MODE_NAME = 'debug';
|
|
6
|
+
export const DEBUG = true;
|
|
7
|
+
export const TARGET_NAME = 'default';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* BuildProfile Class is used only for compatibility purposes.
|
|
11
|
+
*/
|
|
12
|
+
export default class BuildProfile {
|
|
13
|
+
static readonly HAR_VERSION = HAR_VERSION;
|
|
14
|
+
static readonly BUILD_MODE_NAME = BUILD_MODE_NAME;
|
|
15
|
+
static readonly DEBUG = DEBUG;
|
|
16
|
+
static readonly TARGET_NAME = TARGET_NAME;
|
|
17
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026 react-native-address-parse contributors.
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the MIT license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { harTasks } from '@ohos/hvigor-ohos-plugin';
|
|
9
|
+
|
|
10
|
+
export default {
|
|
11
|
+
system: harTasks, /* Built-in plugin of Hvigor. It cannot be modified. */
|
|
12
|
+
plugins: [] /* Custom plugin to extend the functionality of Hvigor. */
|
|
13
|
+
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"modelVersion": "26.0.0",
|
|
3
|
+
"name": "@rnoh/react-native-address-parse",
|
|
4
|
+
"version": "1.0.0",
|
|
5
|
+
"description": "HarmonyOS/OpenHarmony adaptation package for react-native-address-parse",
|
|
6
|
+
"main": "Index.ets",
|
|
7
|
+
"author": "",
|
|
8
|
+
"license": "MIT",
|
|
9
|
+
"dependencies": {
|
|
10
|
+
"@rnoh/react-native-openharmony": "^0.84.3"
|
|
11
|
+
},
|
|
12
|
+
"metadata": {
|
|
13
|
+
"sourceRoots": [
|
|
14
|
+
"./src/main"
|
|
15
|
+
],
|
|
16
|
+
"debug": true
|
|
17
|
+
},
|
|
18
|
+
"compatibleSdkVersionStage": "beta1",
|
|
19
|
+
"compatibleSdkVersion": 12,
|
|
20
|
+
"compatibleSdkType": "HarmonyOS",
|
|
21
|
+
"obfuscated": false
|
|
22
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
cmake_minimum_required(VERSION 3.5)
|
|
2
|
+
set(CMAKE_VERBOSE_MAKEFILE on)
|
|
3
|
+
|
|
4
|
+
file(GLOB address_parse_SRC CONFIGURE_DEPENDS *.cpp)
|
|
5
|
+
|
|
6
|
+
add_library(rnoh__react_native_address_parse SHARED ${address_parse_SRC})
|
|
7
|
+
target_include_directories(rnoh__react_native_address_parse PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
|
|
8
|
+
target_link_libraries(rnoh__react_native_address_parse PUBLIC rnoh)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
#include "ReactNativeAddressParsePackage.h"
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include "RNOH/Package.h"
|
|
4
|
+
#include "RNOH/ArkTSTurboModule.h"
|
|
5
|
+
#include "RNOH/TurboModuleFactory.h"
|
|
6
|
+
|
|
7
|
+
namespace rnoh {
|
|
8
|
+
|
|
9
|
+
// JS 可见的方法表必须在此声明(等价于 codegen 生成的 spec):
|
|
10
|
+
// parse(address, type, textFilter, nameMaxLength, extraGovData) 返回 ParseResult。
|
|
11
|
+
class AddressParseArkTSTurboModule : public ArkTSTurboModule {
|
|
12
|
+
public:
|
|
13
|
+
AddressParseArkTSTurboModule(
|
|
14
|
+
const ArkTSTurboModule::Context ctx,
|
|
15
|
+
const std::string name)
|
|
16
|
+
: rnoh::ArkTSTurboModule(ctx, name) {
|
|
17
|
+
methodMap_ = {
|
|
18
|
+
ARK_METHOD_METADATA(parse, 5),
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
class AddressParseTurboModuleFactoryDelegate : public TurboModuleFactoryDelegate {
|
|
24
|
+
public:
|
|
25
|
+
SharedTurboModule createTurboModule(Context ctx, const std::string& name) const override {
|
|
26
|
+
if (name == "AddressParse") {
|
|
27
|
+
return std::make_shared<AddressParseArkTSTurboModule>(ctx, name);
|
|
28
|
+
}
|
|
29
|
+
return nullptr;
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
class ReactNativeAddressParsePackage : public rnoh::Package {
|
|
34
|
+
using Super = rnoh::Package;
|
|
35
|
+
|
|
36
|
+
public:
|
|
37
|
+
using Super::Super;
|
|
38
|
+
|
|
39
|
+
std::unique_ptr<TurboModuleFactoryDelegate> createTurboModuleFactoryDelegate()
|
|
40
|
+
override {
|
|
41
|
+
return std::make_unique<AddressParseTurboModuleFactoryDelegate>();
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
} // namespace rnoh
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { RNOHPackage, AnyThreadTurboModule, AnyThreadTurboModuleContext } from '@rnoh/react-native-openharmony';
|
|
2
|
+
import { AddressParseTurboModule } from './AddressParseTurboModule';
|
|
3
|
+
|
|
4
|
+
export class AddressParsePackage extends RNOHPackage {
|
|
5
|
+
override getAnyThreadTurboModuleFactoryByNameMap(): Map<string, (ctx: AnyThreadTurboModuleContext) => AnyThreadTurboModule | null> {
|
|
6
|
+
return new Map([
|
|
7
|
+
[AddressParseTurboModule.NAME, (ctx) => new AddressParseTurboModule(ctx)],
|
|
8
|
+
]);
|
|
9
|
+
}
|
|
10
|
+
}
|