Hylafax: Qui luật chuyển đổi số fax

Hylafax chuyển đổi chuỗi số điện thoại truyền cho sendfax thành dạng chuẩn (CanonicalNumber) và số gọi theo chuẩn quốc gia (DialString) trước khi gọi, theo các qui luật riêng tuỳ theo vùng.
Mỗi một qui luật bắt đầu bằng tên_qui_luật := [ … ]

! bắt đầu một chú thích

Area=${AreaCode}                  ! local area code
Country=${CountryCode}            ! local country code
IDPrefix=${InternationalPrefix}   ! prefix inter. call
LDPrefix=${LongDistancePrefix}    ! prefix long dist. call
WS=" "                            ! white space

CanonicalNumber := [
#.*           =                ! strip calling card stuff
[abcABC]      = 2              ! convert alpha to numbers
[defDEF]      = 3
[ghiGHI]      = 4
[jklJKL]      = 5
[mnoMNO]      = 6
[prsPRS]      = 7
[tuvTUV]      = 8
[wxyWXY]      = 9
[^+0-9]+      =                ! strip white space etc.
^${IDPrefix}  = +              ! replace int. dialing code
^${LDPrefix}  = +${Country}    ! replace l.d. dialing code
^[^+]         = +${Country}${Area}&  ! otherwise, insert canon form
]
  • Các dòng 2 đến 9 chuyển đổi các chữ cái trên bàn phím điện thoại thành số tương ứng, dành cho người lưu số điện thoại bằng bằng chữ.
  • Dòng 10 xoá các ký tự không phải là + hay chữ số. Do đó có thể thêm vào điện thoại vài ký hiệu như +84 (28) 1234 5678 hay +84.28.1234-5678
  • Dòng 11 thay prefix gọi quốc tế (thí dụ 00) thành dấu +
  • Dòng 12 thay prefix gọi đường dài (thí dụ 0) thành +${Country}
  • Dòng cuối, nếu không phải prefix gọi quốc tế /prefix gọi đường dài /dấu + thì chèn phía trước +${Country}${Area}
DialString := [
[-${WS}.]+        =       ! strip syntactic sugar
[abcABC]          = 2     ! these convert alpha to numbers
[defDEF]          = 3
[ghiGHI]          = 4
[jklJKL]          = 5
[mnoMNO]          = 6
[prsPRS]          = 7
[tuvTUV]          = 8
[wxyWXY]          = 9
[^+0-9]+          =                ! strip white space etc
^[+]${Country}    = ${LDPrefix}    ! long distance call
^[+]              = ${IDPrefix}    ! international call
]
  • Dòng 2 đến 9 tương tự như trên
  • Dòng 10 nên thêm vào để xoá các ký tự lạ
  • Dóng 11, nếu bắt đầu là +${Country} thì đổi thành prefix gọi đường dài (+84 28 1234 5678 đổi thành 02812345678)
  • Dòng 12, còn lại nếu bắt đầu là + thì đổi thành prefix gọi quốc tế (+1 123 1234 5678 đổi thành 001123412345678)

DialString ngắn gọn và đúng qui định của quốc gia mà server đang ở.

Test

Dùng lệnh

dialtest -a 28 -c 84 -i 00 -l 0 -v /var/spool/hylafax/etc/dialrules

a: mã vùng, c: mã quốc gia, i: prefix gọi quốc tế, l: prefix gọi đường dài

Ứng dụng sẽ hiện dấu nhắc ready> để chúng ta gõ một số điện thoại để ứng dụng phân tích

ready> 538hello
input = "538hello"
Apply CanonicalNumber rules to "538hello"
--> match rule "[defDEF]", result now "538h3llo"
--> match rule "[ghiGHI]", result now "53843llo"
--> match rule "[jklJKL]", result now "538435lo"
--> match rule "[jklJKL]", result now "5384355o"
--> match rule "[mnoMNO]", result now "53843556"
--> match rule "^[^+]", result now "+842853843556"
--> return result "+842853843556"
Apply DialString rules to "538hello"
--> match rule "[defDEF]", result now "538h3llo"
--> match rule "[ghiGHI]", result now "53843llo"
--> match rule "[jklJKL]", result now "538435lo"
--> match rule "[jklJKL]", result now "5384355o"
--> match rule "[mnoMNO]", result now "53843556"
--> return result "53843556"
Apply DisplayNumber rules to "538hello"
--> return result "538hello"
canonical = "+842853843556"
dial-string = "53843556"
display = "538hello"

Chuyển đổi bằng Bash

  • Các dòng 2 đến 9
sed -e 's/[abc]/2/gi' -e 's/[def]/3/g' -e 's/[ghi]/4/gi' -e 's/[jkl]/5/gi' -e 's/[mno]/6/gi' -e 's/[pqrs]/7/gi' -e 's/[tuv]/8/gi' -e 's/[wxyz]/9/gi'
  • Xoá các ký tự không phải là + hay chữ số
sed -r 's/[^+0-9]//g'
  • Nếu bắt đầu là +MQG thì đổi thành prefix gọi đường dài
MQG=84
pfDD=0
pfQT=00
sed -r "s/^\+$MQG(.*)/$pfDD\1/"
  • Còn lại nếu bắt đầu là + thì đổi thành prefix gọi quốc tế 
sed -r "s/^\+(.*)/$pfQT\1/"

Tập tin Bash dialstring

#!/bin/bash
MQG=84
pfDD=0
pfQT=00
echo "$1" | \
sed -e 's/[abc]/2/gi' -e 's/[def]/3/gi' -e 's/[ghi]/4/gi' -e 's/[jkl]/5/gi' -e 's/[mno]/6/gi' -e 's/[pqrs]/7/gi' -e 's/[tuv]/8/gi' -e 's/[wxyz]/9/gi' | \
sed -e 's/[^+0-9]//g' | \
sed -e "s/^\+${MQG}\(.*\)/${pfDD}\1/" | \
sed -e "s/^\+\(.*\)/${pfQT}\1/"

Các lệnh sed có thể viết gọn lại

#!/bin/bash
MQG=84
pfDD=0
pfQT=00
echo "$1" | \
sed -e 's/[abc]/2/gi' \
-e 's/[def]/3/gi' \
-e 's/[ghi]/4/gi' \
-e 's/[jkl]/5/gi' \
-e 's/[mno]/6/gi' \
-e 's/[pqrs]/7/gi' \
-e 's/[tuv]/8/gi' \
-e 's/[wxyz]/9/gi' \
-e 's/[^+0-9]//g' \
-e "s/^\+${MQG}\(.*\)/${pfDD}\1/" \
-e "s/^\+\(.*\)/${pfQT}\1/"

Chuyển đổi bằng PHP

$MQG  = '84';
$MV   = '28';
$pfDD = '0';
$pfQT = '00';
$faxNum = preg_replace(
    ['/abc/i','/def/i','/ghi/i','/jkl/i','/mno/i','/pqrs/i','/tuv/i','/wxyz/i'],
    ['2','3','4','5','6','7','8','9'],
    $faxNum);
$faxNum = preg_replace(
    ['/[^\+\d]/',"/^\+$MQG/",'/^\+/', "/^$pfDD$MV/"],
    ['', $pfDD, $pfQT, ''],
    $faxNum);

 

Comments Off on Hylafax: Qui luật chuyển đổi số fax

Filed under Software

Comments are closed.