#
# Copyright (C) 2016 and later: Unicode, Inc. and others.
# License & terms of use: http://www.unicode.org/copyright.html
# Copyright (C) 2002-2016, International Business Machines Corporation
# and others. All Rights Reserved.
#
# file:  word.txt
#
# ICU Word Break Rules
#      See Unicode Standard Annex #29.
#      These rules are based on UAX #29 Revision 34 for Unicode Version 12.0
#
# Note:  Updates to word.txt will usually need to be merged into
#        word_POSIX.txt also.

##############################################################################
#
#  Character class definitions from TR 29
#
##############################################################################

!!chain;
!!quoted_literals_only;


#
#  Character Class Definitions.
#

$Han                = [:Han:];

$CR                 = [\p{Word_Break = CR}];
$LF                 = [\p{Word_Break = LF}];
$Newline            = [\p{Word_Break = Newline}];
$Extend             = [\p{Word_Break = Extend}-$Han];
$ZWJ                = [\p{Word_Break = ZWJ}];
$Regional_Indicator = [\p{Word_Break = Regional_Indicator}];
$Format             = [\p{Word_Break = Format}];
$Katakana           = [\p{Word_Break = Katakana}];
$Hebrew_Letter      = [\p{Word_Break = Hebrew_Letter}];
$ALetter            = [\p{Word_Break = ALetter}];
$Single_Quote       = [\p{Word_Break = Single_Quote}];
$Double_Quote       = [\p{Word_Break = Double_Quote}];
# Remove two full stop characters from $MidNumLet and add them to $MidNum
# to break a hostname into its components at the cost of breaking
# 'e.g.' and 'i.e.' as well.
# $MidNumLet is used in rules 6/7 (rules of our interest) and rules 11/12.
# Because it's OR'd with $MidNum in rules 11/12, rules 11/12 are not affected
# while rules 6/7 are reverted to the old behavior we want.
$MidNumLet          = [[\p{Word_Break = MidNumLet}] - [\u002E \uFF0E]];
$MidLetter          = [\p{Word_Break = MidLetter}];
$MidNum             = [\p{Word_Break = MidNum}[\u002E \uFF0E]];
$Numeric            = [\p{Word_Break = Numeric}];
$ExtendNumLet       = [\p{Word_Break = ExtendNumLet}];
$WSegSpace          = [\p{Word_Break = WSegSpace}];
$Extended_Pict      = [\p{Extended_Pictographic}];

$Hiragana           = [:Hiragana:];
$Ideographic        = [\p{Ideographic}];


#   Dictionary character set, for triggering language-based break engines. Currently
#   limited to LineBreak=Complex_Context. Note that this set only works in Unicode
#   5.0 or later as the definition of Complex_Context was corrected to include all
#   characters requiring dictionary break.

$Control        = [\p{Grapheme_Cluster_Break = Control}];
$HangulSyllable = [\uac00-\ud7a3];
$ComplexContext = [:LineBreak = Complex_Context:];
$KanaKanji      = [$Han $Hiragana $Katakana];
$dictionaryCJK  = [$KanaKanji $HangulSyllable];
$dictionary     = [$ComplexContext $dictionaryCJK];

# TODO: check if handling of katakana in dictionary makes rules incorrect/void

# leave CJK scripts out of ALetterPlus
$ALetterPlus  = [$ALetter-$dictionaryCJK [$ComplexContext-$Extend-$Control]];


## -------------------------------------------------

# Rule 3 - CR x LF
#
$CR $LF;

# Rule 3c   Do not break within emoji zwj sequences.
#             ZWJ ×  \p{Extended_Pictographic}.  Precedes WB4, so no intervening Extend chars allowed.
#
$ZWJ $Extended_Pict;

# Rule 3d - Keep horizontal whitespace together.
#
$WSegSpace $WSegSpace;

# Rule 4 - ignore Format and Extend characters, except when they appear at the beginning
#          of a region of Text.

$ExFm  = [$Extend $Format $ZWJ];

^$ExFm+;            # This rule fires only when there are format or extend characters at the
                    # start of text, or immediately following another boundary. It groups them, in
                    # the event there are more than one.

[^$CR $LF $Newline $ExFm] $ExFm*;   # This rule rule attaches trailing format/extends to words,
                                    # with no special rule status value.

$Numeric $ExFm* {100};              # This group of rules also attach trailing format/extends, but
$ALetterPlus $ExFm* {200};          # with rule status set based on the word's final base character.
$HangulSyllable {200};
$Hebrew_Letter $ExFm* {200};
$Katakana $ExFm* {400};             # note:  these status values override those from rule 5
$Hiragana $ExFm* {400};             #        by virtue of being numerically larger.
$Ideographic $ExFm* {400};          #

#
# rule 5
#    Do not break between most letters.
#
($ALetterPlus | $Hebrew_Letter) $ExFm* ($ALetterPlus | $Hebrew_Letter);

# rule 6 and 7
($ALetterPlus | $Hebrew_Letter)  $ExFm* ($MidLetter | $MidNumLet | $Single_Quote) $ExFm* ($ALetterPlus | $Hebrew_Letter) {200};

# rule 7a
$Hebrew_Letter $ExFm* $Single_Quote {200};

# rule 7b and 7c
$Hebrew_Letter $ExFm* $Double_Quote $ExFm* $Hebrew_Letter;

# rule 8

$Numeric $ExFm* $Numeric;

# rule 9

($ALetterPlus | $Hebrew_Letter)  $ExFm* $Numeric;

# rule 10

$Numeric $ExFm* ($ALetterPlus | $Hebrew_Letter);

# rule 11 and 12

$Numeric $ExFm* ($MidNum | $MidNumLet | $Single_Quote) $ExFm* $Numeric;

# rule 13
# to be consistent with $KanaKanji $KanaKanhi, changed
# from 300 to 400.
# See also TestRuleStatus in intltest/rbbiapts.cpp
$Katakana $ExFm*  $Katakana {400};

# rule 13a/b

$ALetterPlus   $ExFm* $ExtendNumLet {200};    #  (13a)
$Hebrew_Letter $ExFm* $ExtendNumLet {200};    #  (13a)
$Numeric       $ExFm* $ExtendNumLet {100};    #  (13a)
$Katakana      $ExFm* $ExtendNumLet {400};    #  (13a)
$ExtendNumLet  $ExFm* $ExtendNumLet {200};    #  (13a)

$ExtendNumLet  $ExFm* $ALetterPlus  {200};    #  (13b)
$ExtendNumLet  $ExFm* $Hebrew_Letter {200};    #  (13b)
$ExtendNumLet  $ExFm* $Numeric      {100};    #  (13b)
$ExtendNumLet  $ExFm* $Katakana     {400};    #  (13b)

# rules 15 - 17
#    Pairs of Regional Indicators stay together.
#    With incoming rule chaining disabled by ^, this rule will match exactly two of them.
#    No other rule begins with a Regional_Indicator, so chaining cannot extend the match.
#
^$Regional_Indicator $ExFm* $Regional_Indicator;

# special handling for CJK characters: chain for later dictionary segmentation
$HangulSyllable $HangulSyllable {200};
$KanaKanji $KanaKanji {400}; # different rule status if both kana and kanji found

# Rule 999
#     Match a single code point if no other rule applies.
.;
