2024-11-22 00:17:48 +00:00

70 lines
7.6 KiB
Go

//
// Copyright 2020 FoxyUtils ehf. All rights reserved.
//
// This is a commercial product and requires a license to operate.
// A trial license can be obtained at https://unidoc.io
//
// DO NOT EDIT: generated by unitwist Go source code obfuscator.
//
// Use of this source code is governed by the UniDoc End User License Agreement
// terms that can be accessed at https://unidoc.io/eula/
package reference ;import (_b "errors";_d "fmt";_ab "github.com/unidoc/unioffice/spreadsheet/update";_bf "regexp";_a "strconv";_f "strings";);
// CellReference is a parsed reference to a cell. Input is of the form 'A1',
// '$C$2', etc.
type CellReference struct{RowIdx uint32 ;ColumnIdx uint32 ;Column string ;AbsoluteColumn bool ;AbsoluteRow bool ;SheetName string ;};
// String returns a string representation of ColumnReference.
func (_gga ColumnReference )String ()string {_db :=make ([]byte ,0,4);if _gga .AbsoluteColumn {_db =append (_db ,'$');};_db =append (_db ,_gga .Column ...);return string (_db );};
// String returns a string representation of CellReference.
func (_g CellReference )String ()string {_e :=make ([]byte ,0,4);if _g .AbsoluteColumn {_e =append (_e ,'$');};_e =append (_e ,_g .Column ...);if _g .AbsoluteRow {_e =append (_e ,'$');};_e =_a .AppendInt (_e ,int64 (_g .RowIdx ),10);return string (_e );
};var _fa =_bf .MustCompile ("^\u005b\u0061\u002d\u007aA-\u005a]\u0028\u005b\u0061\u002d\u007aA\u002d\u005a\u005d\u003f\u0029\u0024");
// ColumnToIndex maps a column to a zero based index (e.g. A = 0, B = 1, AA = 26)
func ColumnToIndex (col string )uint32 {col =_f .ToUpper (col );_eb :=uint32 (0);for _ ,_gc :=range col {_eb *=26;_eb +=uint32 (_gc -'A'+1);};return _eb -1;};
// ParseRangeReference splits a range reference of the form "A1:B5" into its
// components.
func ParseRangeReference (s string )(_de ,_ae CellReference ,_dge error ){_fcc ,_ed ,_dge :=_bb (s );if _dge !=nil {return CellReference {},CellReference {},_dge ;};_fce :=_f .Split (_ed ,"\u003a");if len (_fce )!=2{return CellReference {},CellReference {},_b .New ("i\u006ev\u0061\u006c\u0069\u0064\u0020\u0072\u0061\u006eg\u0065\u0020\u0066\u006frm\u0061\u0074");
};if _fcc !=""{_fce [0]=_fcc +"\u0021"+_fce [0];_fce [1]=_fcc +"\u0021"+_fce [1];};_ade ,_dge :=ParseCellReference (_fce [0]);if _dge !=nil {return CellReference {},CellReference {},_dge ;};_ba ,_dge :=ParseCellReference (_fce [1]);if _dge !=nil {return CellReference {},CellReference {},_dge ;
};return _ade ,_ba ,nil ;};func _bb (_gf string )(string ,string ,error ){_eag :="";_fbe :=_f .LastIndex (_gf ,"\u0021");if _fbe > -1{_eag =_gf [:_fbe ];_gf =_gf [_fbe +1:];if _eag ==""{return "","",_b .New ("\u0049n\u0076a\u006c\u0069\u0064\u0020\u0073h\u0065\u0065t\u0020\u006e\u0061\u006d\u0065");
};};return _eag ,_gf ,nil ;};
// IndexToColumn maps a column number to a column name (e.g. 0 = A, 1 = B, 26 = AA)
func IndexToColumn (col uint32 )string {var _fg [64+1]byte ;_dc :=len (_fg );_cb :=col ;const _be =26;for _cb >=_be {_dc --;_bfb :=_cb /_be ;_fg [_dc ]=byte ('A'+uint (_cb -_bfb *_be ));_cb =_bfb -1;};_dc --;_fg [_dc ]=byte ('A'+uint (_cb ));return string (_fg [_dc :]);
};
// Update updates reference to point one of the neighboring columns with respect to the update type after removing a row/column.
func (_fb *ColumnReference )Update (updateType _ab .UpdateAction )*ColumnReference {switch updateType {case _ab .UpdateActionRemoveColumn :_bdf :=_fb ;_bdf .ColumnIdx =_fb .ColumnIdx -1;_bdf .Column =IndexToColumn (_bdf .ColumnIdx );return _bdf ;default:return _fb ;
};};
// ColumnReference is a parsed reference to a column. Input is of the form 'A',
// '$C', etc.
type ColumnReference struct{ColumnIdx uint32 ;Column string ;AbsoluteColumn bool ;SheetName string ;};
// ParseCellReference parses a cell reference of the form 'A10' and splits it
// into column/row segments.
func ParseCellReference (s string )(CellReference ,error ){s =_f .TrimSpace (s );if len (s )< 2{return CellReference {},_b .New ("\u0063\u0065\u006c\u006c\u0020\u0072\u0065\u0066e\u0072\u0065\u006ece\u0020\u006d\u0075\u0073\u0074\u0020h\u0061\u0076\u0065\u0020\u0061\u0074\u0020\u006c\u0065\u0061\u0073\u0074\u0020\u0074\u0077o\u0020\u0063\u0068\u0061\u0072\u0061\u0063\u0074e\u0072\u0073");
};_dd :=CellReference {};_ad ,_fc ,_ea :=_bb (s );if _ea !=nil {return CellReference {},_ea ;};if _ad !=""{_dd .SheetName =_ad ;};if s [0]=='$'{_dd .AbsoluteColumn =true ;_fc =_fc [1:];};_ef :=-1;_bd :for _ca :=0;_ca < len (_fc );_ca ++{switch {case _fc [_ca ]>='0'&&_fc [_ca ]<='9'||_fc [_ca ]=='$':_ef =_ca ;
break _bd ;};};switch _ef {case 0:return CellReference {},_d .Errorf ("\u006e\u006f\u0020\u006cet\u0074\u0065\u0072\u0020\u0070\u0072\u0065\u0066\u0069\u0078\u0020\u0069\u006e\u0020%\u0073",_fc );case -1:return CellReference {},_d .Errorf ("\u006eo\u0020d\u0069\u0067\u0069\u0074\u0073\u0020\u0069\u006e\u0020\u0025\u0073",_fc );
};_dd .Column =_fc [0:_ef ];if _fc [_ef ]=='$'{_dd .AbsoluteRow =true ;_ef ++;};_dd .ColumnIdx =ColumnToIndex (_dd .Column );_dg ,_ea :=_a .ParseUint (_fc [_ef :],10,32);if _ea !=nil {return CellReference {},_d .Errorf ("e\u0072\u0072\u006f\u0072 p\u0061r\u0073\u0069\u006e\u0067\u0020r\u006f\u0077\u003a\u0020\u0025\u0073",_ea );
};if _dg ==0{return CellReference {},_d .Errorf ("\u0065\u0072\u0072\u006f\u0072\u0020\u0070\u0061\u0072\u0073i\u006e\u0067\u0020\u0072\u006f\u0077\u003a \u0063\u0061\u006e\u006e\u006f\u0074\u0020\u0062\u0065\u0020\u0030");};_dd .RowIdx =uint32 (_dg );
return _dd ,nil ;};
// ParseColumnReference parses a column reference of the form 'Sheet1!A' and splits it
// into sheet name and column segments.
func ParseColumnReference (s string )(ColumnReference ,error ){s =_f .TrimSpace (s );if len (s )< 1{return ColumnReference {},_b .New ("\u0063\u006f\u006c\u0075\u006d\u006e \u0072\u0065\u0066\u0065\u0072\u0065\u006e\u0063\u0065\u0020\u006d\u0075\u0073\u0074\u0020\u0068\u0061\u0076\u0065\u0020a\u0074\u0020\u006c\u0065\u0061\u0073\u0074\u0020\u006f\u006e\u0065\u0020\u0063\u0068a\u0072a\u0063\u0074\u0065\u0072");
};_af :=ColumnReference {};_cc ,_bdc ,_ag :=_bb (s );if _ag !=nil {return ColumnReference {},_ag ;};if _cc !=""{_af .SheetName =_cc ;};if _bdc [0]=='$'{_af .AbsoluteColumn =true ;_bdc =_bdc [1:];};if !_fa .MatchString (_bdc ){return ColumnReference {},_b .New ("\u0063\u006f\u006c\u0075\u006dn\u0020\u0072\u0065\u0066\u0065\u0072\u0065\u006e\u0063\u0065\u0020\u006d\u0075s\u0074\u0020\u0062\u0065\u0020\u0062\u0065\u0074\u0077\u0065\u0065\u006e\u0020\u0041\u0020\u0061\u006e\u0064\u0020\u005a\u005a");
};_af .Column =_bdc ;_af .ColumnIdx =ColumnToIndex (_af .Column );return _af ,nil ;};
// Update updates reference to point one of the neighboring cells with respect to the update type after removing a row/column.
func (_dgb *CellReference )Update (updateType _ab .UpdateAction )*CellReference {switch updateType {case _ab .UpdateActionRemoveColumn :_gg :=_dgb ;_gg .ColumnIdx =_dgb .ColumnIdx -1;_gg .Column =IndexToColumn (_gg .ColumnIdx );return _gg ;default:return _dgb ;
};};
// ParseColumnRangeReference splits a range reference of the form "A:B" into its
// components.
func ParseColumnRangeReference (s string )(_bda ,_ebf ColumnReference ,_faf error ){_dbb :="";_cd :=_f .Split (s ,"\u0021");if len (_cd )==2{_dbb =_cd [0];s =_cd [1];};_aef :=_f .Split (s ,"\u003a");if len (_aef )!=2{return ColumnReference {},ColumnReference {},_b .New ("i\u006ev\u0061\u006c\u0069\u0064\u0020\u0072\u0061\u006eg\u0065\u0020\u0066\u006frm\u0061\u0074");
};if _dbb !=""{_aef [0]=_dbb +"\u0021"+_aef [0];_aef [1]=_dbb +"\u0021"+_aef [1];};_ga ,_faf :=ParseColumnReference (_aef [0]);if _faf !=nil {return ColumnReference {},ColumnReference {},_faf ;};_dgg ,_faf :=ParseColumnReference (_aef [1]);if _faf !=nil {return ColumnReference {},ColumnReference {},_faf ;
};return _ga ,_dgg ,nil ;};