Commit 733dcbc0 by pangchong

feat(dtd): 添加海南航空作业卡完整DTD文件定义

- 新增JOBCARD.dtd文件,包含详细的DTD结构定义
- 定义多种元素和属性以支持复杂文档结构
- 包含AXML实体和注释,规范作业卡文本格式
- 实现多层列表、表格、图形及注释的DTD规则
- 增加对任务、步骤、设备、警告等业务元素的支持
- 明确签名、修订和生效日期等元数据规范
parent 45e708d4
<?xml version="1.0" encoding="utf-8"?>
<!-- =========================================================== -->
<!-- This is the DTD for the HAINAN Airlines Job Card -->
<!-- =========================================================== -->
<!-- DTD Reference : HNA-TEXT-DTD-JOBCARD-VER1 -->
<!-- Rev Date : 17 March 2014 -->
<!-- Author : Bireturn -->
<!-- =========================================================== -->
<!-- DOCTYPE JOBCARD [ -->
<!-- The following set of declarations may be referred to
using the public entity as follows:
<!DOCTYPE JOBCARD PUBLIC
"-//ATA-TEXT//DTD JOBCARD-VER1//EN" [ ]> -->
<!-- =========================================================== -->
<!-- NOTATIONS -->
<!-- =========================================================== -->
<!NOTATION cgm PUBLIC
"-//USA-DOD//NOTATION Computer Graphics Metafile//EN" >
<!NOTATION ccitt4 PUBLIC
"-//USA-DOD//NOTATION CCITT Group4 Facsimile//EN" >
<!NOTATION gcf PUBLIC
"-//ATA-TEXT//NOTATION Graphic Companion File//EN" >
<!NOTATION pdf PUBLIC
"-//Adobe Inc.//NOTATION Portable Document Format//EN" >
<!NOTATION png PUBLIC
"-//W3C//NOTATION Portable Network Graphics//EN" >
<!NOTATION jpeg PUBLIC
"+//ISBN 0-7923-9432-1::Graphic Notation//NOTATION Joint
Photographic Experts Group Raster//EN" >
<!NOTATION vrml PUBLIC
"-//ATA-TEXT//NOTATION Virtual Reality Modeling Language//EN" >
<!NOTATION mpeg PUBLIC
"-//ATA-TEXT//NOTATION Motion Pictures Expert Group//EN" >
<!NOTATION mp3 PUBLIC
"-//ATA-TEXT//NOTATION Motion Pictures Expert Group, Audio
Layer 3//EN" >
<!NOTATION tif SYSTEM "tif">
<!-- =========================================================== -->
<!-- ENTITIES -->
<!-- =========================================================== -->
<!ENTITY % G.R "(REFBLOCK* | (GRPHCREF*, REFEXT*, REFINT*))" >
<!ENTITY % W.C "(WARNING*, CAUTION*, HNANOTE*)" >
<!ENTITY % CONTENT "(PARAC | PARA | TABLE | UNLIST | NUMLIST)+" >
<!ENTITY % TEXT "(PARAC | PARA | (TABLE, SIGNOFF?, SIGNOFF?) | UNLIST | NUMLIST | NOTE | (RECORD-LINE, SIGNOFF?, SIGNOFF?) | (SELECTION, SIGNOFF?, SIGNOFF?))+" >
<!ENTITY % DELETED "(DELETED, CHGDESC*)" >
<!ENTITY % YESORNO "CDATA" >
<!ENTITY % REVATT
"CHG (N|R|U|D) #IMPLIED
KEY ID #IMPLIED
REVDATE CDATA #IMPLIED" >
<!ENTITY % EIN "(EIN | EINMFR)" >
<!ENTITY % ISOtech PUBLIC "ISO 8879-1986//ENTITIES General Technical//EN" "iso-tech.ent" >
<!ENTITY % ISOpub PUBLIC "ISO 8879-1986//ENTITIES Publishing//EN" "iso-pub.ent" >
<!ENTITY % ISOnum PUBLIC "ISO 8879-1986//ENTITIES Numeric and Special Graphic//EN" "iso-num.ent" >
<!ENTITY % ISOgrk1 PUBLIC "ISO 8879-1986//ENTITIES Greek Letters//EN" "iso-grk1.ent" >
<!ENTITY % ISOgrk2 PUBLIC "ISO 8879-1986//ENTITIES Monotoniko Greek//EN" "iso-grk2.ent" >
<!ENTITY % ISOgrk3 PUBLIC "ISO 8879-1986//ENTITIES Greek Symbols//EN" "iso-grk3.ent" >
<!ENTITY % ISOgrk4 PUBLIC "ISO 8879-1986//ENTITIES Alternative Greek Symbols//EN" "iso-grk4.ent" >
<!ENTITY % ISOlat1 PUBLIC "ISO 8879-1986//ENTITIES Added Latin 1//EN" "iso-lat1.ent" >
<!ENTITY % ISObox PUBLIC "ISO 8879-1986//ENTITIES Box and Line Drawing//EN" "iso-box.ent" >
<!ENTITY % ISOamso PUBLIC "ISO 8879-1986//ENTITIES Added Math Symbols: Ordinary//EN" "iso-amso.ent" >
<!ENTITY % ISOamsc PUBLIC "ISO 8879-1986//ENTITIES Added Math Symbols: Delimiters//EN" "iso-amsc.ent" >
%ISOtech; %ISOpub; %ISOnum; %ISOgrk1; %ISOgrk2; %ISOgrk3;
%ISOgrk4; %ISOlat1; %ISObox; %ISOamso; %ISOamsc;
<!-- ============================================================ -->
<!-- JOBCARD Main Structure -->
<!-- ============================================================ -->
<!ELEMENT JOBCARD ((SMJC-HEADER | EOTK-HEADER | CMJC-HEADER | LMJC-HEADER | NRCJC-HEADER | EOJC-HEADER | MAOJC-HEADER),
CEP) >
<!ATTLIST JOBCARD
SOURCE-TYPE CDATA #IMPLIED
CARD-NO CDATA #IMPLIED
TASK-NO CDATA #IMPLIED
MERGED (TRUE) #IMPLIED
TC-NO CDATA #IMPLIED>
<!-- ============================================================ -->
<!-- SMJC HEADER -->
<!-- ============================================================ -->
<!ELEMENT SMJC-HEADER (SPRLS?)>
<!ELEMENT SPRLS (SPRL*) >
<!ATTLIST SPRLS
WIDTH CDATA "0.5* 0.5* 2.5* 0.5*"
MERGED (TRUE) #IMPLIED>
<!ELEMENT SPRL (SPID, SPPHASE, SPNAME, SPSKILL) >
<!ELEMENT SPID (#PCDATA) >
<!ELEMENT SPPHASE (#PCDATA) >
<!ELEMENT SPNAME (#PCDATA) >
<!ELEMENT SPSKILL (#PCDATA) >
<!-- ============================================================ -->
<!-- EOTK HEADER -->
<!-- ============================================================ -->
<!ELEMENT EOTK-HEADER (SPRLS?) >
<!-- ============================================================ -->
<!-- CMJC HEADER -->
<!-- ============================================================ -->
<!ELEMENT CMJC-HEADER (SPRLS?) >
<!ELEMENT STEP ((EFFECT?|CONEFFECT?), CHGDESC* , (%W.C; | NOTE)*, TITLEC?, TITLE?,
((%W.C; | NOTE) | TABLE | RECORD-LINE | SELECTION | PARAC | PARA | UNLIST|LIST1)*,SIGNOFF?, SIGNOFF?)>
<!ATTLIST STEP
ITEM-ID CDATA #IMPLIED
ACRHIVE (Y | N) "Y"
HT-LMJC (Y | N) "N"
ETOPS-LMJC (Y | N) "N"
KEY CDATA #IMPLIED
APPLIC-LMJC (ALL | FE | NFE) "ALL"
CAT-LMJC CDATA #IMPLIED
CK-LEVEL (A | B | C ) #IMPLIED
MERGED (TRUE) #IMPLIED
NUM CDATA #IMPLIED>
<!-- ============================================================ -->
<!-- LMJC HEADER -->
<!-- ============================================================ -->
<!ELEMENT LMJC-HEADER EMPTY >
<!-- ============================================================ -->
<!-- NRCJC HEADER -->
<!-- ============================================================ -->
<!ELEMENT NRCJC-HEADER EMPTY >
<!-- ============================================================ -->
<!-- EOJC HEADER -->
<!-- ============================================================ -->
<!ELEMENT EOJC-HEADER EMPTY >
<!-- ============================================================ -->
<!-- MAOJC HEADER -->
<!-- ============================================================ -->
<!ELEMENT MAOJC-HEADER EMPTY >
<!ELEMENT TOPIC-GROUP (TITLEC, TITLE) >
<!-- ============================================================ -->
<!-- RECORDING -->
<!-- ============================================================ -->
<!ELEMENT RECORD-LINE ((PARAC | PARA)* ,RECORD, RECORD-ITEMS?,(PARAC | PARA)*)+ >
<!ELEMENT RECORD (#PCDATA) >
<!ATTLIST RECORD
MID CDATA #IMPLIED
WIDTH CDATA #IMPLIED
MULTI (Y | N) "N"
HEIGHT CDATA #IMPLIED
MANDATORY (Y | N) "Y"
TAG CDATA #IMPLIED
MAX CDATA #IMPLIED
MIN CDATA #IMPLIED
MERGED (TRUE) #IMPLIED
PATTERN CDATA #IMPLIED
MES-NAME CDATA #IMPLIED
MES-TYPE (NUMBER | TEXT | TEXTAREA) "TEXT">
<!ELEMENT SP (#PCDATA) >
<!ATTLIST SP
COLOR CDATA #IMPLIED
UNDERSCORE (Y | N) "N"
MERGED (TRUE) #IMPLIED
FONT-SIZE (8PT | 9PT | 10PT | 11PT
| 12PT | 13PT | 14PT | 15PT | 16PT) "9PT"
FONT-WEIGHT (NORMAL | BOLD) "BOLD">
<!ELEMENT SELECTION (SELECTION-ITEM+) >
<!ATTLIST SELECTION
MULTI (Y | N) "N"
TYPE (INLINE | LIST) "INLINE"
MANDATORY (Y | N) "Y"
MERGED (TRUE) #IMPLIED
TAG CDATA #IMPLIED
MES-NAME CDATA #IMPLIED>
<!ELEMENT SELECTION-ITEM (SELECTION-LBL-CN, SELECTION-LBL-EN,
(PARAC | PARA| (RECORD, RECORD-ITEMS?))*)>
<!ATTLIST SELECTION-ITEM
MID ID #IMPLIED
MERGED (TRUE) #IMPLIED
VALUE CDATA #IMPLIED>
<!ELEMENT SELECTION-LBL-CN (#PCDATA) >
<!ELEMENT SELECTION-LBL-EN (#PCDATA) >
<!ELEMENT RECORD-ITEMS (RECORD-ITEM*) >
<!ELEMENT RECORD-ITEM (#PCDATA) >
<!-- =========================================================== -->
<!-- AMM Front Matter -->
<!-- =========================================================== -->
<!ELEMENT ATANBR (#PCDATA) >
<!ELEMENT MFR (#PCDATA) >
<!ELEMENT SBNBR (#PCDATA) >
<!-- =========================================================== -->
<!-- CEP -->
<!-- =========================================================== -->
<!ELEMENT CEP (((EFFECT?|CONEFFECT?), CHGDESC*, TITLEC?, TITLE?, (%G.R;)?, %W.C;,
NOTE*, ASSODATA?, TFMATR?, (TOPIC-GROUP | TOPIC)*, NOTE*,
(GRAPHIC|APPEND)*) | %DELETED;) >
<!ATTLIST CEP
CHAPPREF CDATA #IMPLIED
CHAPNBR CDATA #IMPLIED
SECTNBR CDATA #IMPLIED
SUBJNBR CDATA #IMPLIED
FUNC CDATA #IMPLIED
SEQ CDATA #IMPLIED
CONFLTR CDATA #IMPLIED
VARNBR CDATA #IMPLIED
ALUNQI CDATA #IMPLIED
PGBLKNBR CDATA #IMPLIED
MERGED (TRUE) #IMPLIED
CONFNBR CDATA #IMPLIED
%REVATT; >
<!ELEMENT SIGNOFF EMPTY >
<!ATTLIST SIGNOFF
CK-LEVEL (A | B) "A"
LOCATION (LEFT | RIGHT) #IMPLIED
TECHNICAL-LEVEL (M | T) #IMPLIED
EXTRA (Y | N) "N"
SR-ID CDATA #IMPLIED
TAG CDATA #IMPLIED
MERGED (TRUE) #IMPLIED
DP-LMJC (Y | N) "N"
SKIP (Y | B) #IMPLIED >
<!-- =========================================================== -->
<!-- Boeing TC Task -->
<!-- =========================================================== -->
<!ELEMENT TASK ((EFFECT?|CONEFFECT?), TITLEC?, TITLE?, %G.R;, REGULATORY?, %W.C;,
NOTE*,TFMATR?, TOPIC* ) >
<!ATTLIST TASK
CHAPPREF CDATA #IMPLIED
CHAPNBR CDATA #REQUIRED
SECTNBR CDATA #REQUIRED
SUBJNBR CDATA #REQUIRED
FUNC CDATA #REQUIRED
SEQ CDATA #REQUIRED
CONFLTR CDATA #IMPLIED
VARNBR CDATA #IMPLIED
ALUNQI CDATA #IMPLIED
PGBLKNBR CDATA #IMPLIED
CONFNBR CDATA #IMPLIED
MERGED (TRUE) #IMPLIED
ID CDATA #IMPLIED >
<!ELEMENT REGULATORY ((EFFECT?|CONEFFECT?), REGULATION+) >
<!-- <!ELEMENT REGULATION (#PCDATA) >
<!ATTLIST REGULATION
REGTYPE (AD | AMOC | AWL | CATIII | CMR
| ETOPS | EWIS | LOI | RII | SFAR88
| RVMS | ALI | CDCCL) #REQUIRED > -->
<!ELEMENT REGULATION (#PCDATA | EFFECT | GRSYMBOL)* >
<!ATTLIST REGULATION
REGTYPE CDATA #REQUIRED
MERGED (TRUE) #IMPLIED
REGSOURCE CDATA #IMPLIED
REGVALUE CDATA #IMPLIED >
<!ELEMENT SEQNUM (#PCDATA) >
<!-- ============================================================ -->
<!-- TASK ASSOCIATED DATA -->
<!-- ============================================================ -->
<!ELEMENT ASSODATA (ZONELST?, ZONE*, ACDATA*, EINLST?, TASKREQ?, ELAPSTIM?,
MANHOUR?, NBRPERS?) >
<!ATTLIST ASSODATA
MERGED (TRUE) #IMPLIED>
<!ELEMENT EINLST (EINDATA+) >
<!ATTLIST EINLST
MERGED (TRUE) #IMPLIED>
<!ELEMENT EINDATA ((EFFECT?|CONEFFECT?), %EIN;) >
<!ATTLIST EINDATA
MERGED (TRUE) #IMPLIED>
<!ELEMENT ZONELST (ZONE+) >
<!ATTLIST ZONELST
MERGED (TRUE) #IMPLIED>
<!ELEMENT TASKREQ EMPTY >
<!ATTLIST TASKREQ
MECHREQ (MECH | NOMECH) #IMPLIED
PANREQ (PAN | NOPAN) #IMPLIED
MERGED (TRUE) #IMPLIED
TEDREQ (TED | NOTED) #IMPLIED >
<!ELEMENT ELAPSTIM (#PCDATA) >
<!ATTLIST ELAPSTIM
MERGED (TRUE) #IMPLIED>
<!ELEMENT MANHOUR (#PCDATA) >
<!ATTLIST MANHOUR
MERGED (TRUE) #IMPLIED>
<!ELEMENT NBRPERS (#PCDATA) >
<!ATTLIST NBRPERS
MERGED (TRUE) #IMPLIED>
<!-- =========================================================== -->
<!-- TASK ASSOCIATED ELEMENTS -->
<!-- =========================================================== -->
<!ELEMENT TFMATR (PRETOPIC+) >
<!ATTLIST TFMATR
MERGED (TRUE) #IMPLIED>
<!ELEMENT PRETOPIC (TITLEC, TITLE, (%TEXT; | LIST1),
((SPECNOTE?, INTNOTE?, APAPNOTE?, EAPPNOTE?, ACPANOTE?)
| (SPECNOTE?, APAPNOTE?, EAPPNOTE?, ACPANOTE?))) >
<!ATTLIST PRETOPIC
MERGED (TRUE) #IMPLIED
CK-LEVEL (A | A1 | B | C | DM) #IMPLIED >
<!ELEMENT TOPIC ((EFFECT?|CONEFFECT?), TITLEC, TITLE, GRPHCREF*, (REVST* | REVEND* | %G.R;
| %W.C; | NOTE* | PARA | PARAC | SELECTION*|
SUBTASK | (TASK | STEP)| TOPIC)*) >
<!ATTLIST TOPIC
ITEM-ID CDATA #IMPLIED
CK-LEVEL (A | B | C) #IMPLIED
MH-LMJC CDATA #IMPLIED
SR-ID CDATA #IMPLIED
MERGED (TRUE) #IMPLIED
SHOWNA (Y | N) "N" >
<!-- =========================================================== -->
<!-- SUBTASK -->
<!-- =========================================================== -->
<!ELEMENT SUBTASK (((EFFECT?|CONEFFECT?), CHGDESC*, %G.R;, %W.C;, NOTE*, RECORD-LINE*, SELECTION*,
LIST1, SIGNOFF?, SIGNOFF?) | (%DELETED;, SIGNOFF?, SIGNOFF?)) >
<!ATTLIST SUBTASK
CHAPPREF CDATA #IMPLIED
CHAPNBR CDATA #REQUIRED
SECTNBR CDATA #REQUIRED
SUBJNBR CDATA #REQUIRED
FUNC CDATA #REQUIRED
SEQ CDATA #REQUIRED
CONFLTR CDATA #IMPLIED
VARNBR CDATA #IMPLIED
ALUNQI CDATA #IMPLIED
PGBLKNBR CDATA #IMPLIED
CONFNBR CDATA #IMPLIED
ID CDATA #IMPLIED
MERGED (TRUE) #IMPLIED
%REVATT; >
<!-- =========================================================== -->
<!-- STANDARD LISTS -->
<!-- =========================================================== -->
<!ELEMENT LIST1 ((EFFECT?|CONEFFECT?),TITLEC?, TITLE?, (%W.C; ,L1ITEM,SIGNOFF?, SIGNOFF?)+)>
<!ATTLIST LIST1
MERGED (TRUE) #IMPLIED>
<!ELEMENT LIST2 (LTITLE?, (EFFECT?|CONEFFECT?),TITLEC?, TITLE?, (%W.C; ,L2ITEM, SIGNOFF?, SIGNOFF?)+)>
<!ATTLIST LIST2
MERGED (TRUE) #IMPLIED>
<!ELEMENT LIST3 ((EFFECT?|CONEFFECT?), TITLEC?, TITLE?, (%W.C; ,L3ITEM,SIGNOFF?, SIGNOFF?)+)>
<!ATTLIST LIST3
MERGED (TRUE) #IMPLIED>
<!ELEMENT LIST4 ((EFFECT?|CONEFFECT?), TITLEC?, TITLE?, (%W.C; ,L4ITEM,SIGNOFF?, SIGNOFF?)+)>
<!ATTLIST LIST4
MERGED (TRUE) #IMPLIED>
<!ELEMENT LIST5 ((EFFECT?|CONEFFECT?), TITLEC?, TITLE?, (%W.C; ,L5ITEM,SIGNOFF?, SIGNOFF?)+)>
<!ATTLIST LIST5
MERGED (TRUE) #IMPLIED>
<!ELEMENT LIST6 ((EFFECT?|CONEFFECT?),TITLEC?, TITLE?, (%W.C; ,L6ITEM,SIGNOFF?, SIGNOFF?)+)>
<!ATTLIST LIST6
MERGED (TRUE) #IMPLIED>
<!ELEMENT LIST7 ((EFFECT?|CONEFFECT?), TITLEC?, TITLE?, (%W.C; ,L7ITEM,SIGNOFF?, SIGNOFF?)+)>
<!ATTLIST LIST7
MERGED (TRUE) #IMPLIED>
<!ELEMENT L1ITEM ((EFFECT?|CONEFFECT?), GRPHCREF?,(%W.C;, NOTE*),((REGULATORY | %TEXT; | %W.C;),SIGNOFF?, SIGNOFF?)*, CHGDESC?,((CBLST | LIST2 | TABLE | ART), (GRAPHIC | NOTE)*,SIGNOFF?, SIGNOFF?)*, ((%TEXT; | %W.C;),SIGNOFF?, SIGNOFF?)*)>
<!ATTLIST L1ITEM
KEY CDATA #IMPLIED
MERGED (TRUE) #IMPLIED
NUM CDATA #IMPLIED>
<!ELEMENT L2ITEM ((EFFECT?|CONEFFECT?), %W.C;,((REGULATORY | %TEXT;| %W.C;|(LIST3, NOTE*)),SIGNOFF?, SIGNOFF?)*)>
<!ATTLIST L2ITEM
KEY CDATA #IMPLIED
MERGED (TRUE) #IMPLIED
NUM CDATA #IMPLIED>
<!ELEMENT L3ITEM ((EFFECT?|CONEFFECT?), %W.C;,((REGULATORY | %TEXT; | %W.C;),SIGNOFF?, SIGNOFF?)*,(LIST4, NOTE*,SIGNOFF?, SIGNOFF?)?, CHGDESC?, ((%TEXT; | %W.C;),SIGNOFF?, SIGNOFF?)*)>
<!ATTLIST L3ITEM
KEY CDATA #IMPLIED
MERGED (TRUE) #IMPLIED
NUM CDATA #IMPLIED>
<!ELEMENT L4ITEM ((EFFECT?|CONEFFECT?), %W.C;,((REGULATORY | %TEXT; | %W.C;),SIGNOFF?, SIGNOFF?)*,(LIST5, NOTE*,SIGNOFF?, SIGNOFF?)?, CHGDESC?, ((%TEXT; | %W.C;),SIGNOFF?, SIGNOFF?)*)>
<!ATTLIST L4ITEM
KEY CDATA #IMPLIED
MERGED (TRUE) #IMPLIED
NUM CDATA #IMPLIED>
<!ELEMENT L5ITEM ((EFFECT?|CONEFFECT?), %W.C;,((REGULATORY | %TEXT; | %W.C;),SIGNOFF?, SIGNOFF?)*,(LIST6, NOTE*,SIGNOFF?, SIGNOFF?)?, CHGDESC?, ((%TEXT; | %W.C;),SIGNOFF?, SIGNOFF?)*)>
<!ATTLIST L5ITEM
KEY CDATA #IMPLIED
MERGED (TRUE) #IMPLIED
NUM CDATA #IMPLIED>
<!ELEMENT L6ITEM ((EFFECT?|CONEFFECT?), %W.C;,((REGULATORY | %TEXT; | %W.C;),SIGNOFF?, SIGNOFF?)*,(LIST7, NOTE*,SIGNOFF?, SIGNOFF?)?, CHGDESC?, ((%TEXT; | %W.C;),SIGNOFF?, SIGNOFF?)*)>
<!ATTLIST L6ITEM
KEY CDATA #IMPLIED
MERGED (TRUE) #IMPLIED
NUM CDATA #IMPLIED>
<!ELEMENT L7ITEM ((EFFECT?|CONEFFECT?), %W.C;, CHGDESC?, ((REGULATORY | %TEXT; | %W.C;),SIGNOFF?, SIGNOFF?)*)>
<!ATTLIST L7ITEM
KEY CDATA #IMPLIED
MERGED (TRUE) #IMPLIED
NUM CDATA #IMPLIED>
<!-- =========================================================== -->
<!-- ACTION RESULT TABLE -->
<!-- =========================================================== -->
<!ELEMENT ART (LTITLE?, (%W.C;, NOTE*, ACTION)+) >
<!ATTLIST ART
MERGED (TRUE) #IMPLIED>
<!ELEMENT ACTION (%TEXT;, RESULT*) >
<!ATTLIST ACTION
MERGED (TRUE) #IMPLIED>
<!ELEMENT RESULT (%TEXT;) >
<!ATTLIST RESULT
MERGED (TRUE) #IMPLIED>
<!-- =========================================================== -->
<!-- DATA ASSOCIATED TO EQUIPMENTS -->
<!-- =========================================================== -->
<!ELEMENT EQULST (EQUDATA+) >
<!ATTLIST EQULST
MERGED (TRUE) #IMPLIED>
<!ELEMENT EQUDATA ((EFFECT?|CONEFFECT?), %EIN;, EQUNAME, SFTLST?, ZONE?,
PAN*, ATANBR?) >
<!ATTLIST EQUDATA
MERGED (TRUE) #IMPLIED>
<!ELEMENT EQUNAME (#PCDATA) >
<!ATTLIST EQUNAME
MERGED (TRUE) #IMPLIED>
<!ELEMENT SFTLST (SFTDATA+) >
<!ATTLIST SFTLST
MERGED (TRUE) #IMPLIED>
<!ELEMENT SFTDATA ((EFFECT?|CONEFFECT?), %EIN;, EQUNAME, ATANBR?) >
<!ATTLIST SFTDATA
MERGED (TRUE) #IMPLIED>
<!-- =========================================================== -->
<!-- CIRCUIT BREAKER TABLE -->
<!-- =========================================================== -->
<!ELEMENT CBLST (CBSUBLST+) >
<!ATTLIST CBLST
CHKSUM CDATA #IMPLIED
MERGED (TRUE) #IMPLIED
ACTION CDATA #IMPLIED >
<!ELEMENT CBSUBLST ((EFFECT?|CONEFFECT?), ((%EIN;), EQUNAME?)*, CBDATA+) >
<!ATTLIST CBSUBLST
MERGED (TRUE) #IMPLIED
CHKSUM CDATA #IMPLIED >
<!ELEMENT CBDATA ((EFFECT?|CONEFFECT?), CB, CBNAME, PAN?, CBLOC?) >
<!ATTLIST CBDATA
MERGED (TRUE) #IMPLIED>
<!ELEMENT CBNAME (#PCDATA) >
<!ATTLIST CBNAME
MERGED (TRUE) #IMPLIED>
<!ELEMENT CBLOC (#PCDATA) >
<!ATTLIST CBLOC
MERGED (TRUE) #IMPLIED>
<!-- =========================================================== -->
<!-- TABLE (CELLULAR, CALS BASED) -->
<!-- =========================================================== -->
<!ELEMENT TABLE ((SEQNUM?, (EFFECT?|CONEFFECT?), TITLEC?, TITLE?,TGROUP, FTNOTE* ) | GRAPHIC+)
> <!-- -(TABLE)-->
<!ATTLIST TABLE
TABSTYLE NMTOKEN #IMPLIED
FRAME (TOP | BOTTOM | TOPBOT | ALL
| SIDES | NONE) #IMPLIED
COLSEP %YESORNO; #IMPLIED
ROWSEP %YESORNO; #IMPLIED
ORIENT (PORT|LAND) #IMPLIED
PGWIDE %YESORNO; #IMPLIED
MERGED (TRUE) #IMPLIED
ID ID #IMPLIED >
<!ELEMENT TGROUP (COLSPEC*, SPANSPEC*, THEAD?, TFOOT?,
TBODY) >
<!ATTLIST TGROUP
COLS CDATA #REQUIRED
COLSEP %YESORNO; #IMPLIED
ROWSEP %YESORNO; #IMPLIED
ALIGN (LEFT | RIGHT | CENTER
| JUSTIFY | CHAR) "LEFT"
CHAROFF NMTOKEN "50"
MERGED (TRUE) #IMPLIED
CHAR CDATA "" >
<!ELEMENT COLSPEC EMPTY >
<!ATTLIST COLSPEC
COLNUM CDATA #IMPLIED
COLNAME NMTOKEN #IMPLIED
ALIGN (LEFT | RIGHT | CENTER
| JUSTIFY | CHAR) #IMPLIED
CHAROFF NMTOKEN #IMPLIED
CHAR CDATA #IMPLIED
COLWIDTH CDATA #IMPLIED
COLSEP %YESORNO; #IMPLIED
MERGED (TRUE) #IMPLIED
ROWSEP %YESORNO; #IMPLIED >
<!ELEMENT SPANSPEC EMPTY >
<!ATTLIST SPANSPEC
NAMEST NMTOKEN #REQUIRED
NAMEEND NMTOKEN #REQUIRED
SPANNAME NMTOKEN #IMPLIED
ALIGN (LEFT | RIGHT | CENTER
| JUSTIFY | CHAR) "CENTER"
CHAROFF NMTOKEN #IMPLIED
CHAR CDATA #IMPLIED
COLSEP %YESORNO; #IMPLIED
MERGED (TRUE) #IMPLIED
ROWSEP %YESORNO; #IMPLIED >
<!ELEMENT THEAD (COLSPEC*, ROW+) >
<!ATTLIST THEAD
MERGED (TRUE) #IMPLIED
VALIGN (TOP | MIDDLE | BOTTOM) "BOTTOM" >
<!ELEMENT TFOOT (COLSPEC*, ROW+) >
<!ATTLIST TFOOT
MERGED (TRUE) #IMPLIED
VALIGN (TOP | MIDDLE | BOTTOM) "TOP" >
<!ELEMENT TBODY (ROW+) >
<!ATTLIST TBODY
MERGED (TRUE) #IMPLIED
VALIGN (TOP | MIDDLE | BOTTOM) "TOP" >
<!ELEMENT ROW ( REVST?, (EFFECT?|CONEFFECT?),ENTRY+, REVEND?) >
<!ATTLIST ROW
MERGED (TRUE) #IMPLIED
ROWSEP %YESORNO; #IMPLIED >
<!ELEMENT ENTRY (%TEXT; | %W.C; | GRAPHIC )* >
<!ATTLIST ENTRY
COLNAME NMTOKEN #IMPLIED
NAMEST NMTOKEN #IMPLIED
NAMEEND NMTOKEN #IMPLIED
SPANNAME NMTOKEN #IMPLIED
MOREROWS CDATA "0"
COLSEP %YESORNO; #IMPLIED
ROWSEP %YESORNO; #IMPLIED
ROTATE %YESORNO; "0"
VALIGN (TOP|MIDDLE|BOTTOM) "TOP"
ALIGN (LEFT | RIGHT | CENTER
| JUSTIFY | CHAR) #IMPLIED
CHAROFF NMTOKEN #IMPLIED
MERGED (TRUE) #IMPLIED
CHAR CDATA #IMPLIED >
<!ELEMENT FTNOTE (%CONTENT;|NOTE)+ >
<!ATTLIST FTNOTE
MERGED (TRUE) #IMPLIED
FTNOTEID ID #REQUIRED >
<!-- =========================================================== -->
<!-- REFERENCE BLOCK and GRAPHIC REFERENCING MECHANISMS -->
<!-- =========================================================== -->
<!ELEMENT REFBLOCK ( #PCDATA | REFINT | REFEXT | GRPHCREF)* >
<!ATTLIST REFBLOCK
MERGED (TRUE) #IMPLIED>
<!--ELEMENT GRPHCREF (EFFECT?, #PCDATA) -->
<!ELEMENT GRPHCREF ( #PCDATA | EFFECT | CONEFFECT | REVST | REVEND)* >
<!ATTLIST GRPHCREF
REFID CDATA #IMPLIED
SHEETNBR CDATA #IMPLIED
STRUCTID CDATA #IMPLIED
MERGED (TRUE) #IMPLIED
SHOWNOW %YESORNO; "0" >
<!ELEMENT GRAPHIC (((EFFECT?|CONEFFECT?), SEQNUM?, CHGDESC*, TITLEC?, TITLE?, SHEET+)
| %DELETED;) >
<!ATTLIST GRAPHIC
CHAPPREF CDATA #IMPLIED
CHAPNBR CDATA #IMPLIED
SECTNBR CDATA #IMPLIED
SUBJNBR CDATA #IMPLIED
FUNC CDATA #IMPLIED
SEQ CDATA #IMPLIED
CONFLTR CDATA #IMPLIED
VARNBR CDATA #IMPLIED
ALUNQI CDATA #IMPLIED
PGBLKNBR CDATA #IMPLIED
CONFNBR CDATA #IMPLIED
ID CDATA #IMPLIED
MERGED (TRUE) #IMPLIED
%REVATT; >
<!ELEMENT SHEET (((EFFECT?|CONEFFECT?), CHGDESC*, TITLEC?, TITLE?, GDESC?, TITLEC?, TITLE?)
| %DELETED;) >
<!ATTLIST SHEET
GNBR CDATA #REQUIRED
CFNBR CDATA #IMPLIED
SHEETNBR CDATA #REQUIRED
SCALE CDATA #IMPLIED
IMGAREA (AP|BP|CP|DL|EL|FP|GP|HL|IL) #IMPLIED
ID CDATA #IMPLIED
MERGED (TRUE) #IMPLIED
%REVATT; >
<!ELEMENT GDESC (PARAC | PARA | UNLIST | NUMLIST | TABLE| %W.C;| NOTE)* >
<!-- =========================================================== -->
<!-- NUMBERED & UN-NUMBERED LIST -->
<!-- =========================================================== -->
<!ELEMENT UNLIST (%W.C;, NOTE*, UNLITEM+) >
<!ATTLIST UNLIST
MERGED (TRUE) #IMPLIED
BULLTYPE (NONE|BULLET|NDASH|MDASH|DIAMOND|ASTERISK
|DELTA|SQUARE|SYSTEM) "SYSTEM" >
<!ELEMENT UNLITEM ((EFFECT?|CONEFFECT?), (PARAC | PARA | %W.C; | NOTE* | TABLE | UNLIST))* >
<!ATTLIST UNLITEM
MERGED (TRUE) #IMPLIED >
<!ELEMENT NUMLIST (NUMLITEM+) >
<!ATTLIST NUMLIST
MERGED (TRUE) #IMPLIED
NUMTYPE (NNP|AUP|NNB|ALB|NNS|RUP|RLP|RUR|RLR
|NNR|AUR|ALR) "NNP" >
<!ELEMENT NUMLITEM (PARAC | PARA |RECORD-LINE | SELECTION | UNLIST)* >
<!ATTLIST NUMLITEM
MERGED (TRUE) #IMPLIED >
<!-- =========================================================== -->
<!-- PARAGRAPH -->
<!-- =========================================================== -->
<!ELEMENT PARA (#PCDATA | CB | CON | CSN | EQU | GRPHCREF
| NCON | PAN | REFEXT | REFINT
| SUB | SUPER | TED | TOC | TXTGRPHC
| STD | ZONE| EXPD | STDNAME | TOR
| REFBLOCK | TOOLNBR | REFMEDIA
| GRSYMBOL| EIN | EINMFR | EFFECT |CONEFFECT | REVST | REVEND
| SP | DWG | PNR | GENRANGE | ELAPHOUR | MANHOUR
| COMPCODE | CUS | CUSTNAME | INSTDISP | KITNBR
| KWD | MDNBR | MOMENT | MSNBR | OLDPNR | PRICE
| QTY | REVDATE | REVNBR | SBNBR | SET | TOOLNAME
| WEIGHT | SSI | ACRO)*>
<!ATTLIST PARA
MERGED (TRUE) #IMPLIED >
<!ELEMENT PARAC (#PCDATA | CB | CON | CSN | EQU | GRPHCREF
| NCON | PAN | REFEXT | REFINT
| SUB | SUPER | TED | TOC | TXTGRPHC
| STD | ZONE| EXPD | STDNAME | TOR
| REFBLOCK | TOOLNBR | REFMEDIA
| GRSYMBOL| EIN | EINMFR | EFFECT |CONEFFECT | REVST | REVEND
| SP | DWG | PNR | GENRANGE | ELAPHOUR | MANHOUR
| COMPCODE | CUS | CUSTNAME | INSTDISP | KITNBR
| KWD | MDNBR | MOMENT | MSNBR | OLDPNR | PRICE
| QTY | REVDATE | REVNBR | SBNBR | SET | TOOLNAME
| WEIGHT | SSI | ACRO)*>
<!ATTLIST PARAC
MERGED (TRUE) #IMPLIED >
<!-- =========================================================== -->
<!-- PARAGRAPH CONTENTS -->
<!-- =========================================================== -->
<!ELEMENT CB (#PCDATA) >
<!ATTLIST CB
CBTYPE CDATA #IMPLIED
ACTION CDATA #IMPLIED
MERGED (TRUE) #IMPLIED
CHKSUM CDATA #IMPLIED >
<!ELEMENT CON (CONNBR, CONNAME?, REFINT?) >
<!ATTLIST CON
CONTYPE CDATA #IMPLIED
MERGED (TRUE) #IMPLIED
HAZD %YESORNO; #IMPLIED >
<!ELEMENT CONNBR (#PCDATA) >
<!ATTLIST CONNBR
MERGED (TRUE) #IMPLIED >
<!ELEMENT CONNAME (#PCDATA) >
<!ATTLIST CONNAME
MERGED (TRUE) #IMPLIED >
<!ELEMENT CSN (#PCDATA) >
<!ATTLIST CSN
MERGED (TRUE) #IMPLIED >
<!ELEMENT EINMFR (EIN, MFR?) >
<!ATTLIST EINMFR
MERGED (TRUE) #IMPLIED >
<!ELEMENT EIN (#PCDATA) >
<!ATTLIST EIN
MERGED (TRUE) #IMPLIED
TYPE CDATA #IMPLIED >
<!ELEMENT EQU (#PCDATA | SUB | SUPER)* >
<!ATTLIST EQU
MERGED (TRUE) #IMPLIED >
<!ELEMENT NCON (#PCDATA) >
<!ATTLIST NCON
MERGED (TRUE) #IMPLIED >
<!ELEMENT PAN (#PCDATA) >
<!ATTLIST PAN
MERGED (TRUE) #IMPLIED
PANTYPE CDATA #IMPLIED >
<!ELEMENT REFEXT (#PCDATA) >
<!ATTLIST REFEXT
REFMAN CDATA #IMPLIED
REFSPL CDATA #IMPLIED
REFMODEL CDATA #IMPLIED
DOCNBR CDATA #IMPLIED
MERGED (TRUE) #IMPLIED
REFLOC CDATA #IMPLIED >
<!ELEMENT REFINT (#PCDATA | REVST | EFFECT | CONEFFECT | REVEND)* >
<!ATTLIST REFINT
REFTYPE CDATA #IMPLIED
MERGED (TRUE) #IMPLIED
REFID CDATA #IMPLIED >
<!ELEMENT REFMEDIA (#PCDATA) >
<!ATTLIST REFMEDIA
MERGED (TRUE) #IMPLIED
MEDNBR ENTITY #REQUIRED >
<!ELEMENT GRSYMBOL EMPTY >
<!ATTLIST GRSYMBOL
GNBR CDATA #REQUIRED
REPROWID CDATA #IMPLIED
REPROHGT CDATA #IMPLIED
MERGED (TRUE) #IMPLIED
REPROSCL CDATA #IMPLIED >
<!ELEMENT EXPD (CSN, EXPDNAME?, ITEMNBR?, GRPHCREF?) >
<!ATTLIST EXPD
MERGED (TRUE) #IMPLIED
EXPDTYPE CDATA #IMPLIED >
<!ELEMENT EXPDNAME (#PCDATA) >
<!ATTLIST EXPDNAME
MERGED (TRUE) #IMPLIED >
<!ELEMENT ITEMNBR (#PCDATA) >
<!ATTLIST ITEMNBR
MERGED (TRUE) #IMPLIED >
<!ELEMENT STD (STDNBR?, STDNAME)+ >
<!ATTLIST STD
MERGED (TRUE) #IMPLIED >
<!ELEMENT STDNBR (#PCDATA) >
<!ATTLIST STDNBR
MERGED (TRUE) #IMPLIED >
<!ELEMENT STDNAME (#PCDATA) >
<!ATTLIST STDNAME
MERGED (TRUE) #IMPLIED >
<!ELEMENT SUB (#PCDATA) >
<!ATTLIST SUB
MERGED (TRUE) #IMPLIED >
<!ELEMENT SUPER (#PCDATA) >
<!ATTLIST SUPER
MERGED (TRUE) #IMPLIED >
<!ELEMENT TED (TOOLNBR, TOOLNAME)+ >
<!ATTLIST TED
MERGED (TRUE) #IMPLIED >
<!ELEMENT TOOLNBR (#PCDATA) >
<!ATTLIST TOOLNBR
MERGED (TRUE) #IMPLIED >
<!ELEMENT TOOLNAME (#PCDATA) >
<!ATTLIST TOOLNAME
MERGED (TRUE) #IMPLIED >
<!ELEMENT TOR (TORVALUE+) >
<!ATTLIST TOR
MERGED (TRUE) #IMPLIED >
<!ELEMENT TORVALUE EMPTY >
<!ATTLIST TORVALUE
MIN CDATA #REQUIRED
MAX CDATA #IMPLIED
MERGED (TRUE) #IMPLIED
UNIT (LBF.IN|LBF.FT|M.DAN|M.N) #REQUIRED >
<!ELEMENT TOC (#PCDATA) >
<!ATTLIST TOC
MERGED (TRUE) #IMPLIED
READABLE %YESORNO; "1" >
<!ELEMENT TXTGRPHC (TXTLINE+) >
<!ATTLIST TXTGRPHC
MERGED (TRUE) #IMPLIED >
<!ELEMENT TXTLINE (#PCDATA) >
<!ATTLIST TXTLINE
MERGED (TRUE) #IMPLIED >
<!ELEMENT ZONE (#PCDATA) >
<!ATTLIST ZONE
MERGED (TRUE) #IMPLIED >
<!ELEMENT SSI (#PCDATA) >
<!ATTLIST SSI
MERGED (TRUE) #IMPLIED >
<!ELEMENT ACRO (#PCDATA) >
<!ATTLIST ACRO
MERGED (TRUE) #IMPLIED >
<!-- =========================================================== -->
<!-- TITLE etc -->
<!-- =========================================================== -->
<!ELEMENT TITLE (#PCDATA | EIN |EINMFR | SBNBR | SUB | SUPER)* >
<!ELEMENT TITLEC (#PCDATA | EIN |EINMFR | SBNBR | SUB | SUPER)* >
<!ATTLIST TITLE
MERGED (TRUE) #IMPLIED >
<!ATTLIST TITLEC
MERGED (TRUE) #IMPLIED >
<!ELEMENT LTITLE (#PCDATA) >
<!ATTLIST LTITLE
MERGED (TRUE) #IMPLIED >
<!ELEMENT WARNING ((EFFECT?|CONEFFECT?), %CONTENT;) >
<!ATTLIST WARNING
MERGED (TRUE) #IMPLIED >
<!ELEMENT NOTE ((EFFECT?|CONEFFECT?), %CONTENT;) >
<!ATTLIST NOTE
MERGED (TRUE) #IMPLIED >
<!ELEMENT CAUTION ((EFFECT?|CONEFFECT?), %CONTENT;) >
<!ATTLIST CAUTION
MERGED (TRUE) #IMPLIED >
<!ELEMENT HNANOTE ((EFFECT?|CONEFFECT?|SELECTION?), %CONTENT;) >
<!ATTLIST HNANOTE
MERGED (TRUE) #IMPLIED >
<!ELEMENT ACPANOTE ((EFFECT?|CONEFFECT?), %CONTENT;) >
<!ATTLIST ACPANOTE
MERGED (TRUE) #IMPLIED >
<!ELEMENT APAPNOTE ((EFFECT?|CONEFFECT?), %CONTENT;) >
<!ATTLIST APAPNOTE
MERGED (TRUE) #IMPLIED >
<!ELEMENT EAPPNOTE ((EFFECT?|CONEFFECT?), %CONTENT;) >
<!ATTLIST EAPPNOTE
MERGED (TRUE) #IMPLIED >
<!ELEMENT INTNOTE ((EFFECT?|CONEFFECT?), %CONTENT;) >
<!ATTLIST INTNOTE
MERGED (TRUE) #IMPLIED >
<!ELEMENT SPECNOTE ((EFFECT?|CONEFFECT?), %CONTENT;) >
<!ATTLIST SPECNOTE
MERGED (TRUE) #IMPLIED >
<!-- =========================================================== -->
<!-- MISCELLANEOUS CONSTRUCTIONS TO: -->
<!-- MARK EFFECTIVITIES AND DOCUMENT UNITS -->
<!-- MARK DELETED AND REVISED ELEMENTS -->
<!-- SUPPORT CROSS-REFERENCING MECHANISMS -->
<!-- =========================================================== -->
<!ELEMENT EFFECT ((SBEFF | COCEFF | REVST | REVEND)*) >
<!ATTLIST EFFECT
EFFRG CDATA #IMPLIED
MERGED (TRUE) #IMPLIED
EFFTEXT CDATA #IMPLIED >
<!-- EFFTEXTC CDATA #IMPLIED -->
<!ELEMENT SBEFF EMPTY >
<!ATTLIST SBEFF
EFFRG CDATA #IMPLIED
EFFTEXT CDATA #IMPLIED
SBNBR CDATA #REQUIRED
SBCOND CDATA #REQUIRED
MERGED (TRUE) #IMPLIED
SBREV CDATA #IMPLIED >
<!ELEMENT COCEFF EMPTY >
<!ATTLIST COCEFF
EFFRG CDATA #IMPLIED
EFFTEXT CDATA #IMPLIED
COCNBR CDATA #REQUIRED
COCCOND CDATA #IMPLIED
MERGED (TRUE) #IMPLIED
COCREV CDATA #IMPLIED >
<!ELEMENT DELETED EMPTY >
<!ATTLIST DELETED
MERGED (TRUE) #IMPLIED >
<!ELEMENT ISEMPTY EMPTY >
<!ATTLIST ISEMPTY
MERGED (TRUE) #IMPLIED >
<!ELEMENT REVST EMPTY >
<!ATTLIST REVST
MERGED (TRUE) #IMPLIED >
<!ELEMENT REVEND EMPTY >
<!ATTLIST REVEND
MERGED (TRUE) #IMPLIED >
<!ELEMENT COCST EMPTY >
<!ATTLIST COCST
MERGED (TRUE) #IMPLIED >
<!ELEMENT COCEND EMPTY >
<!ATTLIST COCEND
MERGED (TRUE) #IMPLIED >
<!ELEMENT CHGDESC (#PCDATA) >
<!ATTLIST CHGDESC
MERGED (TRUE) #IMPLIED >
<!ELEMENT HOTLINK EMPTY >
<!ATTLIST HOTLINK
TARGETID CDATA #IMPLIED
MERGED (TRUE) #IMPLIED
TARGETREFID CDATA #IMPLIED >
<!ELEMENT DOCUNIT EMPTY >
<!ATTLIST DOCUNIT
MERGED (TRUE) #IMPLIED
DOCUNBR CDATA #IMPLIED >
<!-- =========================================================== -->
<!-- SB -->
<!-- =========================================================== -->
<!ELEMENT ACDATA (ACPAN*) >
<!ATTLIST ACDATA
MERGED (TRUE) #IMPLIED >
<!ELEMENT ACPAN (#PCDATA) >
<!ATTLIST ACPAN
MERGED (TRUE) #IMPLIED >
<!-- =========================================================== -->
<!-- SB -->
<!-- =========================================================== -->
<!ELEMENT DWG (#PCDATA) >
<!ATTLIST DWG
MERGED (TRUE) #IMPLIED >
<!ELEMENT PNR (#PCDATA) >
<!ATTLIST PNR
MERGED (TRUE) #IMPLIED >
<!ELEMENT GENRANGE (STNBR, ENDNBR) >
<!ATTLIST GENRANGE
MERGED (TRUE) #IMPLIED
RANGTYPE CDATA #REQUIRED >
<!ELEMENT STNBR (#PCDATA) >
<!ATTLIST STNBR
MERGED (TRUE) #IMPLIED >
<!ELEMENT ENDNBR (#PCDATA) >
<!ATTLIST ENDNBR
MERGED (TRUE) #IMPLIED >
<!ELEMENT COMPCODE (#PCDATA) >
<!ATTLIST COMPCODE
MERGED (TRUE) #IMPLIED >
<!ELEMENT ELAPHOUR (#PCDATA) >
<!ATTLIST ELAPHOUR
MERGED (TRUE) #IMPLIED >
<!ELEMENT CUS (#PCDATA) >
<!ATTLIST CUS
MERGED (TRUE) #IMPLIED >
<!ELEMENT CUSTNAME (#PCDATA) >
<!ATTLIST CUSTNAME
MERGED (TRUE) #IMPLIED >
<!ELEMENT INSTDISP (#PCDATA) >
<!ATTLIST INSTDISP
MERGED (TRUE) #IMPLIED >
<!ELEMENT KITNBR (#PCDATA) >
<!ATTLIST KITNBR
MERGED (TRUE) #IMPLIED >
<!ELEMENT KWD (#PCDATA) >
<!ATTLIST KWD
MERGED (TRUE) #IMPLIED >
<!ELEMENT MDNBR (#PCDATA) >
<!ATTLIST MDNBR
MERGED (TRUE) #IMPLIED >
<!ELEMENT MOMENT (#PCDATA) >
<!ATTLIST MOMENT
MERGED (TRUE) #IMPLIED >
<!ELEMENT MSNBR (#PCDATA) >
<!ATTLIST MSNBR
MERGED (TRUE) #IMPLIED >
<!ELEMENT OLDPNR (#PCDATA) >
<!ATTLIST OLDPNR
MERGED (TRUE) #IMPLIED >
<!ELEMENT PRICE (#PCDATA) >
<!ATTLIST PRICE
MERGED (TRUE) #IMPLIED >
<!ELEMENT QTY (#PCDATA) >
<!ATTLIST QTY
MERGED (TRUE) #IMPLIED >
<!ELEMENT REVDATE (#PCDATA) >
<!ATTLIST REVDATE
MERGED (TRUE) #IMPLIED >
<!ELEMENT REVNBR (#PCDATA) >
<!ATTLIST REVNBR
MERGED (TRUE) #IMPLIED >
<!ELEMENT SET (#PCDATA) >
<!ATTLIST SET
MERGED (TRUE) #IMPLIED >
<!ELEMENT WEIGHT (#PCDATA) >
<!ATTLIST WEIGHT
MERGED (TRUE) #IMPLIED >
<!ELEMENT CONEFFECT EMPTY >
<!ATTLIST CONEFFECT
MERGED (TRUE) #IMPLIED
EFFRG CDATA #REQUIRED >
<!ELEMENT APPEND ((CHGDESC*, TITLEC?, TITLE, (%TEXT; | LIST1 | GRAPHIC)*) | %DELETED;) >
<!ATTLIST APPEND
MERGED (TRUE) #IMPLIED
%REVATT; >
<!-- ]> -->
\ No newline at end of file
......@@ -770,7 +770,7 @@
"defaultValue": null
},
"FONT-SIZE": {
"typeDefinition": "(8PT | 9PT | 10PT | 11PT \n\t\t\t\t\t\t\t| 12PT | 13PT | 14PT | 15PT | 16PT)",
"typeDefinition": "(8PT | 9PT | 10PT | 11PT | 12PT | 13PT | 14PT | 15PT | 16PT)",
"parsedType": "Enumeration",
"requirement": "#DEFAULT",
"enumValues": ["8PT", "9PT", "10PT", "11PT", "12PT", "13PT", "14PT", "15PT", "16PT"],
......@@ -1268,6 +1268,27 @@
"requirement": "#IMPLIED",
"enumValues": null,
"defaultValue": null
},
"CHG": {
"typeDefinition": "(N|R|U|D)",
"parsedType": "Enumeration",
"requirement": "#IMPLIED",
"enumValues": ["N", "R", "U", "D"],
"defaultValue": null
},
"KEY": {
"typeDefinition": "ID",
"parsedType": "ID",
"requirement": "#IMPLIED",
"enumValues": null,
"defaultValue": null
},
"REVDATE": {
"typeDefinition": "CDATA",
"parsedType": "String",
"requirement": "#IMPLIED",
"enumValues": null,
"defaultValue": null
}
},
"allowedChildren": [
......@@ -1991,7 +2012,7 @@
"PRETOPIC": {
"description": "元素: PRETOPIC",
"contentModel": {
"raw": "(TITLEC, TITLE, ((PARAC | PARA | (TABLE, SIGNOFF?, SIGNOFF?) | UNLIST | NUMLIST | NOTE | (RECORD-LINE, SIGNOFF?, SIGNOFF?) | (SELECTION, SIGNOFF?, SIGNOFF?))+ | LIST1),((SPECNOTE?, INTNOTE?, APAPNOTE?, EAPPNOTE?, ACPANOTE?)| (SPECNOTE?, APAPNOTE?, EAPPNOTE?, ACPANOTE?)))",
"raw": "(TITLEC, TITLE, ((PARAC | PARA | (TABLE, SIGNOFF?, SIGNOFF?) | UNLIST | NUMLIST | NOTE | (RECORD-LINE, SIGNOFF?, SIGNOFF?) | (SELECTION, SIGNOFF?, SIGNOFF?))+ | LIST1), ((SPECNOTE?, INTNOTE?, APAPNOTE?, EAPPNOTE?, ACPANOTE?) | (SPECNOTE?, APAPNOTE?, EAPPNOTE?, ACPANOTE?)))",
"parsed": {
"type": "sequence",
"occurrence": "once",
......@@ -2685,6 +2706,27 @@
"requirement": "#IMPLIED",
"enumValues": ["TRUE"],
"defaultValue": null
},
"CHG": {
"typeDefinition": "(N|R|U|D)",
"parsedType": "Enumeration",
"requirement": "#IMPLIED",
"enumValues": ["N", "R", "U", "D"],
"defaultValue": null
},
"KEY": {
"typeDefinition": "ID",
"parsedType": "ID",
"requirement": "#IMPLIED",
"enumValues": null,
"defaultValue": null
},
"REVDATE": {
"typeDefinition": "CDATA",
"parsedType": "String",
"requirement": "#IMPLIED",
"enumValues": null,
"defaultValue": null
}
},
"allowedChildren": [
......@@ -6693,7 +6735,7 @@
"defaultValue": null
},
"FRAME": {
"typeDefinition": "(TOP | BOTTOM | TOPBOT | ALL\n | SIDES | NONE)",
"typeDefinition": "(TOP | BOTTOM | TOPBOT | ALL | SIDES | NONE)",
"parsedType": "Enumeration",
"requirement": "#IMPLIED",
"enumValues": ["TOP", "BOTTOM", "TOPBOT", "ALL", "SIDES", "NONE"],
......@@ -6719,6 +6761,27 @@
"requirement": "#IMPLIED",
"enumValues": null,
"defaultValue": null
},
"COLSEP": {
"typeDefinition": "CDATA",
"parsedType": "String",
"requirement": "#IMPLIED",
"enumValues": null,
"defaultValue": null
},
"ROWSEP": {
"typeDefinition": "CDATA",
"parsedType": "String",
"requirement": "#IMPLIED",
"enumValues": null,
"defaultValue": null
},
"PGWIDE": {
"typeDefinition": "CDATA",
"parsedType": "String",
"requirement": "#IMPLIED",
"enumValues": null,
"defaultValue": null
}
},
"allowedChildren": ["SEQNUM", "EFFECT", "TITLE", "TGROUP", "FTNOTE", "GRAPHIC", "TITLEC", "CONEFFECT"]
......@@ -6769,7 +6832,7 @@
"defaultValue": null
},
"ALIGN": {
"typeDefinition": "(LEFT | RIGHT | CENTER \n | JUSTIFY | CHAR)",
"typeDefinition": "(LEFT | RIGHT | CENTER | JUSTIFY | CHAR)",
"parsedType": "Enumeration",
"requirement": "#DEFAULT",
"enumValues": ["LEFT", "RIGHT", "CENTER", "JUSTIFY", "CHAR"],
......@@ -6795,6 +6858,20 @@
"requirement": "#DEFAULT",
"enumValues": null,
"defaultValue": ""
},
"COLSEP": {
"typeDefinition": "CDATA",
"parsedType": "String",
"requirement": "#IMPLIED",
"enumValues": null,
"defaultValue": null
},
"ROWSEP": {
"typeDefinition": "CDATA",
"parsedType": "String",
"requirement": "#IMPLIED",
"enumValues": null,
"defaultValue": null
}
},
"allowedChildren": ["THEAD", "COLSPEC", "TBODY", "TFOOT", "SPANSPEC"]
......@@ -6825,7 +6902,7 @@
"defaultValue": null
},
"ALIGN": {
"typeDefinition": "(LEFT | RIGHT | CENTER \n | JUSTIFY | CHAR)",
"typeDefinition": "(LEFT | RIGHT | CENTER | JUSTIFY | CHAR)",
"parsedType": "Enumeration",
"requirement": "#IMPLIED",
"enumValues": ["LEFT", "RIGHT", "CENTER", "JUSTIFY", "CHAR"],
......@@ -6858,6 +6935,20 @@
"requirement": "#IMPLIED",
"enumValues": ["TRUE"],
"defaultValue": null
},
"COLSEP": {
"typeDefinition": "CDATA",
"parsedType": "String",
"requirement": "#IMPLIED",
"enumValues": null,
"defaultValue": null
},
"ROWSEP": {
"typeDefinition": "CDATA",
"parsedType": "String",
"requirement": "#IMPLIED",
"enumValues": null,
"defaultValue": null
}
},
"allowedChildren": []
......@@ -6895,7 +6986,7 @@
"defaultValue": null
},
"ALIGN": {
"typeDefinition": "(LEFT | RIGHT | CENTER \n | JUSTIFY | CHAR)",
"typeDefinition": "(LEFT | RIGHT | CENTER | JUSTIFY | CHAR)",
"parsedType": "Enumeration",
"requirement": "#DEFAULT",
"enumValues": ["LEFT", "RIGHT", "CENTER", "JUSTIFY", "CHAR"],
......@@ -6921,6 +7012,20 @@
"requirement": "#IMPLIED",
"enumValues": ["TRUE"],
"defaultValue": null
},
"COLSEP": {
"typeDefinition": "CDATA",
"parsedType": "String",
"requirement": "#IMPLIED",
"enumValues": null,
"defaultValue": null
},
"ROWSEP": {
"typeDefinition": "CDATA",
"parsedType": "String",
"requirement": "#IMPLIED",
"enumValues": null,
"defaultValue": null
}
},
"allowedChildren": []
......@@ -7084,6 +7189,13 @@
"requirement": "#IMPLIED",
"enumValues": ["TRUE"],
"defaultValue": null
},
"ROWSEP": {
"typeDefinition": "CDATA",
"parsedType": "String",
"requirement": "#IMPLIED",
"enumValues": null,
"defaultValue": null
}
},
"allowedChildren": ["EFFECT", "REVST", "ENTRY", "REVEND", "CONEFFECT"]
......@@ -7264,7 +7376,7 @@
"defaultValue": "TOP"
},
"ALIGN": {
"typeDefinition": "(LEFT | RIGHT | CENTER \n | JUSTIFY | CHAR)",
"typeDefinition": "(LEFT | RIGHT | CENTER | JUSTIFY | CHAR)",
"parsedType": "Enumeration",
"requirement": "#IMPLIED",
"enumValues": ["LEFT", "RIGHT", "CENTER", "JUSTIFY", "CHAR"],
......@@ -7290,6 +7402,27 @@
"requirement": "#IMPLIED",
"enumValues": null,
"defaultValue": null
},
"COLSEP": {
"typeDefinition": "CDATA",
"parsedType": "String",
"requirement": "#IMPLIED",
"enumValues": null,
"defaultValue": null
},
"ROWSEP": {
"typeDefinition": "CDATA",
"parsedType": "String",
"requirement": "#IMPLIED",
"enumValues": null,
"defaultValue": null
},
"ROTATE": {
"typeDefinition": "CDATA",
"parsedType": "String",
"requirement": "#DEFAULT",
"enumValues": null,
"defaultValue": "0"
}
},
"allowedChildren": [
......@@ -7480,6 +7613,13 @@
"requirement": "#IMPLIED",
"enumValues": ["TRUE"],
"defaultValue": null
},
"SHOWNOW": {
"typeDefinition": "CDATA",
"parsedType": "String",
"requirement": "#DEFAULT",
"enumValues": null,
"defaultValue": "0"
}
},
"allowedChildren": ["REVEND", "EFFECT", "REVST", "CONEFFECT"]
......@@ -7650,6 +7790,27 @@
"requirement": "#IMPLIED",
"enumValues": ["TRUE"],
"defaultValue": null
},
"CHG": {
"typeDefinition": "(N|R|U|D)",
"parsedType": "Enumeration",
"requirement": "#IMPLIED",
"enumValues": ["N", "R", "U", "D"],
"defaultValue": null
},
"KEY": {
"typeDefinition": "ID",
"parsedType": "ID",
"requirement": "#IMPLIED",
"enumValues": null,
"defaultValue": null
},
"REVDATE": {
"typeDefinition": "CDATA",
"parsedType": "String",
"requirement": "#IMPLIED",
"enumValues": null,
"defaultValue": null
}
},
"allowedChildren": ["TITLE", "CONEFFECT", "SHEET", "EFFECT", "SEQNUM", "CHGDESC", "DELETED", "TITLEC"]
......@@ -7783,6 +7944,27 @@
"requirement": "#IMPLIED",
"enumValues": ["TRUE"],
"defaultValue": null
},
"CHG": {
"typeDefinition": "(N|R|U|D)",
"parsedType": "Enumeration",
"requirement": "#IMPLIED",
"enumValues": ["N", "R", "U", "D"],
"defaultValue": null
},
"KEY": {
"typeDefinition": "ID",
"parsedType": "ID",
"requirement": "#IMPLIED",
"enumValues": null,
"defaultValue": null
},
"REVDATE": {
"typeDefinition": "CDATA",
"parsedType": "String",
"requirement": "#IMPLIED",
"enumValues": null,
"defaultValue": null
}
},
"allowedChildren": ["EFFECT", "CHGDESC", "TITLE", "GDESC", "DELETED", "TITLEC", "CONEFFECT"]
......@@ -7905,7 +8087,7 @@
"defaultValue": null
},
"BULLTYPE": {
"typeDefinition": "(NONE|BULLET|NDASH|MDASH|DIAMOND|ASTERISK\n |DELTA|SQUARE|SYSTEM)",
"typeDefinition": "(NONE|BULLET|NDASH|MDASH|DIAMOND|ASTERISK |DELTA|SQUARE|SYSTEM)",
"parsedType": "Enumeration",
"requirement": "#DEFAULT",
"enumValues": ["NONE", "BULLET", "NDASH", "MDASH", "DIAMOND", "ASTERISK", "DELTA", "SQUARE", "SYSTEM"],
......@@ -8025,7 +8207,7 @@
"defaultValue": null
},
"NUMTYPE": {
"typeDefinition": "(NNP|AUP|NNB|ALB|NNS|RUP|RLP|RUR|RLR\n |NNR|AUR|ALR)",
"typeDefinition": "(NNP|AUP|NNB|ALB|NNS|RUP|RLP|RUR|RLR |NNR|AUR|ALR)",
"parsedType": "Enumeration",
"requirement": "#DEFAULT",
"enumValues": ["NNP", "AUP", "NNB", "ALB", "NNS", "RUP", "RLP", "RUR", "RLR", "NNR", "AUR", "ALR"],
......@@ -8881,6 +9063,13 @@
"requirement": "#IMPLIED",
"enumValues": ["TRUE"],
"defaultValue": null
},
"HAZD": {
"typeDefinition": "CDATA",
"parsedType": "String",
"requirement": "#IMPLIED",
"enumValues": null,
"defaultValue": null
}
},
"allowedChildren": ["CONNBR", "CONNAME", "REFINT"]
......@@ -9654,6 +9843,13 @@
"requirement": "#IMPLIED",
"enumValues": ["TRUE"],
"defaultValue": null
},
"READABLE": {
"typeDefinition": "CDATA",
"parsedType": "String",
"requirement": "#DEFAULT",
"enumValues": null,
"defaultValue": "1"
}
},
"allowedChildren": []
......@@ -11621,6 +11817,27 @@
"requirement": "#IMPLIED",
"enumValues": ["TRUE"],
"defaultValue": null
},
"CHG": {
"typeDefinition": "(N|R|U|D)",
"parsedType": "Enumeration",
"requirement": "#IMPLIED",
"enumValues": ["N", "R", "U", "D"],
"defaultValue": null
},
"KEY": {
"typeDefinition": "ID",
"parsedType": "ID",
"requirement": "#IMPLIED",
"enumValues": null,
"defaultValue": null
},
"REVDATE": {
"typeDefinition": "CDATA",
"parsedType": "String",
"requirement": "#IMPLIED",
"enumValues": null,
"defaultValue": null
}
},
"allowedChildren": [
......
......@@ -1433,6 +1433,48 @@ export const useEditorStore = defineStore('editor', {
*/
resetZoom() {
this.editorZoom = 100
},
/**
* 根据 REFID / KEY / ID / GRAPHICKEY / GNBR 查找目标节点(支持优先匹配特定标签如 GRAPHIC / SHEET)
*/
findNodeByRef(refId: string, preferredTagName?: string): XmlNode | null {
if (!this.nodeMap || !refId) return null
const cleanRefId = refId.trim()
const isMatch = (n: XmlNode) => {
const attrs = n.attributes || {}
return (
attrs.KEY === cleanRefId ||
attrs.ID === cleanRefId ||
attrs.GRAPHICKEY === cleanRefId ||
attrs.GNBR === cleanRefId
)
}
if (preferredTagName) {
for (const item of this.nodeMap.values()) {
const n = item.node
if (n.tagName === preferredTagName || (preferredTagName === 'GRAPHIC' && n.tagName === 'SHEET')) {
if (isMatch(n)) {
if (n.tagName === 'SHEET' && preferredTagName === 'GRAPHIC' && item.parent) {
return item.parent
}
return n
}
}
}
}
for (const item of this.nodeMap.values()) {
const n = item.node
if (isMatch(n)) {
return n
}
}
return null
}
}
})
......@@ -14,6 +14,15 @@
:options="def.enumValues.map((v: any) => ({ label: v, value: v }))"
@change="handleAttrChange"
/>
<CommonSelect
v-else-if="name === 'REFID' && node.tagName === 'GRPHCREF' && graphicKeyOptions.length > 0"
v-model:value="model[name]"
:options="graphicKeyOptions"
tag
filterable
placeholder="可选择或输入引用的 GRAPHIC KEY"
@change="handleAttrChange"
/>
<n-input v-else v-model:value="model[name]" @input="handleAttrChange" />
</n-form-item>
</div>
......@@ -25,12 +34,14 @@
import { SettingsOutline } from '@vicons/ionicons5'
import type { XmlNode } from '@/types/xmlNode'
import { useAttributeEditor } from './functionals'
import { useEditorStore } from '@/store/editor'
const props = defineProps<{
node: XmlNode
}>()
const themeVars = useThemeVars()
const store = useEditorStore()
const { updateAttributes } = useAttributeEditor()
const model = ref<Record<string, string>>({})
......@@ -43,6 +54,24 @@ const hasAttributes = computed(() => {
return Object.keys(attributesDef.value).length > 0
})
const graphicKeyOptions = computed(() => {
const options: { label: string; value: string }[] = []
if (!store.nodeMap) return options
for (const item of store.nodeMap.values()) {
const n = item.node
if (n.tagName === 'GRAPHIC' && n.attributes?.KEY) {
const keyVal = n.attributes.KEY
const titleChild = n.children.find((c) => c.tagName === 'TITLE' || c.tagName === 'TITLEC')
const titleText = titleChild ? titleChild.textContent : ''
options.push({
label: titleText ? `${keyVal} (${titleText})` : keyVal,
value: keyVal
})
}
}
return options
})
watch(
() => props.node.id,
() => {
......
......@@ -433,7 +433,8 @@
<span
class="inline-ref font-mono font-medium hover:underline cursor-pointer select-all"
style="color: blue"
@click.stop="editorStore.setSelectedNodeId(node.id)"
title="按住 Ctrl + 点击直接跳转到关联插图节点"
@click.stop="handleNodeClick($event)"
>
<template v-if="!insideRefBlock">
{{ shouldShowPrefix(node.textContent) ? (isChineseContext ? '(参考: ' : '(Ref: ') : '(' }}
......@@ -1441,6 +1442,34 @@ const {
hasNonCbDataChildren,
getNonCbDataChildren
} = useDocNodeRenderer(props)
const handleNodeClick = (e: MouseEvent) => {
if (e.ctrlKey || e.metaKey) {
let refId =
props.node.attributes?.REFID ||
props.node.attributes?.STRUCTID ||
props.node.attributes?.GRAPHICKEY ||
props.node.attributes?.GNBR
if (!refId && props.node.textContent) {
refId = props.node.textContent.trim()
refId = refId
.replace(/^\(?(?:Ref:\s*|参考:\s*)?|\)?$/gi, '')
.replace(/\[Sh\.\d+\]/gi, '')
.trim()
}
if (refId) {
const targetNode = editorStore.findNodeByRef(refId, 'GRAPHIC')
if (targetNode) {
editorStore.setSelectedNodeId(targetNode.id)
window.$message?.success?.(`已按 Ctrl 跳转到关联插图 <${targetNode.tagName}> (KEY/ID: ${refId})`)
return
} else {
window.$message?.warning?.(`未找到 KEY/ID 为 "${refId}" 的目标插图节点`)
}
}
}
editorStore.setSelectedNodeId(props.node.id)
}
</script>
<style scoped>
......
......@@ -11,37 +11,61 @@ export const TRANSPARENT_TAGS_SET = new Set(TRANSPARENT_TAGS)
*/
export const ESTIMATED_HEIGHT = 200
/** 按节点类型获取预估高度(用于虚拟列表初始高度计算) */
export const getEstimatedHeight = (tagName: string): number => {
/** 递归计算节点及其子节点的估算总高度 */
export const getNodeEstimatedHeight = (node: XmlNode): number => {
if (!node) return ESTIMATED_HEIGHT
const baseHeight = (tagName: string): number => {
switch (tagName) {
case 'TABLE':
return 400 // 表格通常较高
return 400
case 'GRAPHIC':
case 'SHEET':
return 350 // 图片/图纸/图纸页通常较高
return 350
case 'WARNING':
return 180 // 警告块
case 'CAUTION':
return 180
case 'NOTE':
return 150
case 'PRETOPIC':
return 160 // 模板段落
case 'PARA':
case 'PARAC':
case 'TITLE':
case 'TITLEC':
return 60
case 'UNLIST':
case 'LIST1':
case 'LIST2':
case 'LIST3':
return 200 // 列表
case 'PARA':
case 'PARAC':
return 80 // 普通段落
return 100
case 'L1ITEM':
case 'L2ITEM':
case 'L3ITEM':
case 'UNLITEM':
return 60
case 'SMJC-HEADER':
case 'SMUC-HEADER':
return 120
case 'FINLIST':
return 100
case 'SIGNOFF':
return 40
default:
return ESTIMATED_HEIGHT
return 80
}
}
if (!node.children || node.children.length === 0) {
return baseHeight(node.tagName)
}
let sum = 30
for (const child of node.children) {
sum += getNodeEstimatedHeight(child)
}
return Math.max(sum, baseHeight(node.tagName))
}
/** 按节点类型获取预估高度(用于虚拟列表初始高度计算) */
export const getEstimatedHeight = (tagName: string): number => {
return getNodeEstimatedHeight({ tagName, children: [] } as any)
}
// 编辑器文档块接口
......
import { useEditorStore } from '@/store/editor'
import type { XmlNode } from '@/types/xmlNode'
import { TRANSPARENT_TAGS_SET, getEstimatedHeight, type EditorBlock, type BlockPosition } from '../constants'
import { TRANSPARENT_TAGS_SET, getNodeEstimatedHeight, type EditorBlock, type BlockPosition } from '../constants'
const getRealNodeId = (id: string): string => {
if (id && id.includes('-txt-')) {
......@@ -110,8 +110,8 @@ export function useEditorPanel() {
const list: BlockPosition[] = []
let currentTop = 0
for (const block of blocksList.value) {
// 优先使用 ResizeObserver 测量到的真实高度,否则按节点类型估算
const h = heightsMap.value[block.id] ?? getEstimatedHeight(block.tagName)
// 优先使用 ResizeObserver 测量到的真实高度,否则按节点结构递归计算估算高度
const h = heightsMap.value[block.id] ?? getNodeEstimatedHeight(block.rawNode)
list.push({ id: block.id, top: currentTop, bottom: currentTop + h, height: h })
currentTop += h
}
......@@ -270,6 +270,28 @@ export function useEditorPanel() {
return -1
}
/**
* 辅助函数:严格限制在目标块 (blockElement) 容器内部精准匹配节点 DOM 元素
* 绝跨块全局检索,防止定位错跳至无关联的全局元素
*/
const findElInBlock = (blockElement: HTMLElement, targetNodeId: string, nodePath: XmlNode[]): HTMLElement => {
let targetEl = blockElement.querySelector(`[data-node-id="${targetNodeId}"]`) as HTMLElement | null
if (targetEl) return targetEl
if (nodePath && nodePath.length > 0) {
for (let i = nodePath.length - 1; i >= 0; i--) {
const pid = nodePath[i].id
if (blockElement.dataset.nodeId === pid || blockElement.dataset.blockId === pid) {
return blockElement
}
targetEl = blockElement.querySelector(`[data-node-id="${pid}"]`) as HTMLElement | null
if (targetEl) return targetEl
}
}
return blockElement
}
const syncEditorScroll = (newId: string | null, force = false) => {
if (!newId || !editorStore.xmlTree) return
......@@ -280,13 +302,13 @@ export function useEditorPanel() {
nextTick(() => {
if (!viewportRef.value) return
// 1. 先从路径中由下到上找最近的已挂载 DOM 元素,需限制在所属文档块已挂载的前提下
const blockId = blocksList.value[blockIdx]?.id
const blockEl =
blockId && viewportRef.value ? (viewportRef.value.querySelector(`[data-node-id="${blockId}"]`) as HTMLElement | null) : null
(blockId ? (blockElMap.get(blockId) as HTMLElement | null) : null) ||
(blockId && viewportRef.value
? (viewportRef.value.querySelector(`[data-block-id="${blockId}"], [data-node-id="${blockId}"]`) as HTMLElement | null)
: null)
let el: HTMLElement | null = null
let foundNodeId: string | null = null
const path: XmlNode[] = []
const realId = getRealNodeId(newId)
let curr = editorStore.nodeMap.get(realId)
......@@ -294,72 +316,82 @@ export function useEditorPanel() {
path.unshift(curr.node)
curr = curr.parent ? editorStore.nodeMap.get(curr.parent.id) : undefined
}
if (blockEl && path.length > 0) {
// 优先在所属块内寻找虚拟文本节点本身的 DOM 元素
el = blockEl.querySelector(`[data-node-id="${newId}"]`) as HTMLElement | null
if (!el) {
for (let i = path.length - 1; i >= 0; i--) {
if (blockEl.dataset.nodeId === path[i].id) {
el = blockEl
foundNodeId = path[i].id
break
}
el = blockEl.querySelector(`[data-node-id="${path[i].id}"]`) as HTMLElement | null
if (el) {
foundNodeId = path[i].id
break
}
}
}
}
if (el) {
const rect = el.getBoundingClientRect()
// 1. 若 DOM 块已挂载在视口中
if (blockEl) {
const targetEl = findElInBlock(blockEl, newId, path)
const rect = targetEl.getBoundingClientRect()
const containerRect = viewportRef.value.getBoundingClientRect()
// 已在可视范围内且非强制滚动,不做处理
// 计算 targetEl 中心点与容器中心的偏离距离
const targetCenter = rect.top + rect.height / 2
const containerCenter = containerRect.top + containerRect.height / 2
const diff = Math.abs(targetCenter - containerCenter)
// 已在可视范围内且非强制,不做处理
if (!force && rect.top >= containerRect.top + 20 && rect.bottom <= containerRect.bottom - 20) {
return
}
el.scrollIntoView({ behavior: 'auto', block: 'center' })
// 如果当前节点已基本居中 (偏差 <= 35px),不再重复触发 scrollIntoView,防止画面二次抖动与闪烁
if (diff <= 35 && rect.top >= containerRect.top && rect.bottom <= containerRect.bottom) {
return
}
targetEl.scrollIntoView({ behavior: 'auto', block: 'center' })
return
}
// 2. DOM 未挂载:先瞬间跳转到估算位置触发虚拟列表挂载
// 2. 若 DOM 未挂载:精准累加子节点内部 offset 估算位置,实现一步到位精准跳转,彻底消除闪烁
const pos = positions.value[blockIdx]
if (!pos) return
const vHeight = viewportRef.value.clientHeight
// 计算目标节点在 Raw Block 内部的垂直高度偏移
let internalOffset = 0
const rawBlockNode = blocksList.value[blockIdx].rawNode
if (rawBlockNode && rawBlockNode.children && realId !== rawBlockNode.id) {
for (const child of rawBlockNode.children) {
if (child.id === realId || path.some((p) => p.id === child.id)) break
internalOffset += getNodeEstimatedHeight(child)
}
}
const estimatedTargetTop = pos.top + internalOffset
const targetScrollTop = Math.max(0, estimatedTargetTop - vHeight / 2)
viewportRef.value.scrollTo({
top: Math.max(0, pos.top - vHeight / 2 + pos.height / 2),
top: targetScrollTop,
behavior: 'instant' as ScrollBehavior
})
// 立即同步更新 scrollTop.value,避免等待 scroll 事件 + rAF 延迟,从而在当前 Tick / nextTick 立即渲染出目标块 DOM
scrollTop.value = viewportRef.value.scrollTop
// 等挂载后再精确定位
setTimeout(() => {
// DOM 挂载后微调:仅在实际偏移大于 45px 时才进行二次修正,消除画面微抖与闪烁
nextTick(() => {
if (!viewportRef.value) return
let targetEl: HTMLElement | null = null
// 优先寻找虚拟文本节点本身
targetEl = viewportRef.value.querySelector(`[data-node-id="${newId}"]`) as HTMLElement | null
if (!targetEl && path && path.length > 0) {
for (let i = path.length - 1; i >= 0; i--) {
targetEl = viewportRef.value.querySelector(`[data-node-id="${path[i].id}"]`) as HTMLElement | null
if (targetEl) {
break
}
}
}
if (targetEl) {
const curBlockEl =
(blockId ? (blockElMap.get(blockId) as HTMLElement | null) : null) ||
(blockId && viewportRef.value
? (viewportRef.value.querySelector(`[data-block-id="${blockId}"], [data-node-id="${blockId}"]`) as HTMLElement | null)
: null)
if (!curBlockEl) return
const targetEl = findElInBlock(curBlockEl, newId, path)
const rect = targetEl.getBoundingClientRect()
const containerRect = viewportRef.value.getBoundingClientRect()
const targetCenter = rect.top + rect.height / 2
const containerCenter = containerRect.top + containerRect.height / 2
if (Math.abs(targetCenter - containerCenter) > 45) {
targetEl.scrollIntoView({ behavior: 'auto', block: 'center' })
}
}, 100)
})
})
}
watch(
() => editorStore.selectedNodeId,
(newId) => syncEditorScroll(newId, false)
(newId) => syncEditorScroll(newId, true)
)
watch(
() => editorStore.lastUndoRedoTime,
......
......@@ -371,6 +371,24 @@ export function useAddNodeModal(formRef: Ref<FormInst | null>) {
}
}
const graphicKeyOptions = computed(() => {
const options: { label: string; value: string }[] = []
if (!store.nodeMap) return options
for (const item of store.nodeMap.values()) {
const n = item.node
if (n.tagName === 'GRAPHIC' && n.attributes?.KEY) {
const keyVal = n.attributes.KEY
const titleChild = n.children.find((c) => c.tagName === 'TITLE' || c.tagName === 'TITLEC')
const titleText = titleChild ? titleChild.textContent : ''
options.push({
label: titleText ? `${keyVal} (${titleText})` : keyVal,
value: keyVal
})
}
}
return options
})
return {
form,
rules,
......@@ -378,6 +396,7 @@ export function useAddNodeModal(formRef: Ref<FormInst | null>) {
modalTitle,
tagOptions,
attributeDefs,
graphicKeyOptions,
showTextContentField,
onTagChange,
handleConfirm
......
......@@ -24,6 +24,15 @@
v-model:value="form.attrs[attr.name]"
:options="attr.enumValues.map((v) => ({ label: v, value: v }))"
/>
<!-- 引用插图 KEY:带快捷下拉的 select/tag -->
<CommonSelect
v-else-if="attr.name === 'REFID' && form.tagName === 'GRPHCREF' && graphicKeyOptions.length > 0"
v-model:value="form.attrs[attr.name]"
:options="graphicKeyOptions"
tag
filterable
placeholder="可直接选择或输入目标 GRAPHIC 的 KEY"
/>
<!-- 普通文本 -->
<n-input v-else v-model:value="form.attrs[attr.name]" />
<!-- 属性说明 -->
......@@ -52,7 +61,7 @@ import { useAddNodeModal } from './functionals'
const formRef = ref<FormInst | null>(null)
const { form, rules, saving, modalTitle, tagOptions, attributeDefs, showTextContentField, onTagChange, handleConfirm } = useAddNodeModal(formRef)
const { form, rules, saving, modalTitle, tagOptions, attributeDefs, graphicKeyOptions, showTextContentField, onTagChange, handleConfirm } = useAddNodeModal(formRef)
const open = (mode: 'child' | 'before' | 'after' | 'edit', targetId: string, allowedTags: string[]) => {
addNodeMode.value = mode
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment