2024-05-08 13:54:39 +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";_c "fmt";_cg "github.com/unidoc/unioffice/spreadsheet/update";_e "regexp";_fd "strconv";_f "strings";);func _gcf (_cae string )(string ,string ,error ){_fbd :="";_bg :=_f .LastIndex (_cae ,"\u0021");if _bg > -1{_fbd =_cae [:_bg ];
_cae =_cae [_bg +1:];if _fbd ==""{return "","",_b .New ("\u0049n\u0076a\u006c\u0069\u0064\u0020\u0073h\u0065\u0065t\u0020\u006e\u0061\u006d\u0065");};};return _fbd ,_cae ,nil ;};
// IndexToColumn maps a column number to a column name (e.g. 0 = A, 1 = B, 26 = AA)
func IndexToColumn (col uint32 )string {var _dff [64+1]byte ;_ag :=len (_dff );_bf :=col ;const _fg =26;for _bf >=_fg {_ag --;_fgg :=_bf /_fg ;_dff [_ag ]=byte ('A'+uint (_bf -_fgg *_fg ));_bf =_fgg -1;};_ag --;_dff [_ag ]=byte ('A'+uint (_bf ));return string (_dff [_ag :]);
};
// 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 ;};
// 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");
};_ee :=CellReference {};_ae ,_gg ,_d :=_gcf (s );if _d !=nil {return CellReference {},_d ;};if _ae !=""{_ee .SheetName =_ae ;};if s [0]=='$'{_ee .AbsoluteColumn =true ;_gg =_gg [1:];};_cd :=-1;_bd :for _gb :=0;_gb < len (_gg );_gb ++{switch {case _gg [_gb ]>='0'&&_gg [_gb ]<='9'||_gg [_gb ]=='$':_cd =_gb ;
break _bd ;};};switch _cd {case 0:return CellReference {},_c .Errorf ("\u006e\u006f\u0020\u006cet\u0074\u0065\u0072\u0020\u0070\u0072\u0065\u0066\u0069\u0078\u0020\u0069\u006e\u0020%\u0073",_gg );case -1:return CellReference {},_c .Errorf ("\u006eo\u0020d\u0069\u0067\u0069\u0074\u0073\u0020\u0069\u006e\u0020\u0025\u0073",_gg );
};_ee .Column =_gg [0:_cd ];if _gg [_cd ]=='$'{_ee .AbsoluteRow =true ;_cd ++;};_ee .ColumnIdx =ColumnToIndex (_ee .Column );_ggg ,_d :=_fd .ParseUint (_gg [_cd :],10,32);if _d !=nil {return CellReference {},_c .Errorf ("e\u0072\u0072\u006f\u0072 p\u0061r\u0073\u0069\u006e\u0067\u0020r\u006f\u0077\u003a\u0020\u0025\u0073",_d );
};if _ggg ==0{return CellReference {},_c .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");};_ee .RowIdx =uint32 (_ggg );
return _ee ,nil ;};
// String returns a string representation of ColumnReference.
func (_fb ColumnReference )String ()string {_gc :=make ([]byte ,0,4);if _fb .AbsoluteColumn {_gc =append (_gc ,'$');};_gc =append (_gc ,_fb .Column ...);return string (_gc );};
// ParseRangeReference splits a range reference of the form "A1:B5" into its
// components.
func ParseRangeReference (s string )(_aga ,_bbd CellReference ,_dd error ){_dfa ,_de ,_dd :=_gcf (s );if _dd !=nil {return CellReference {},CellReference {},_dd ;};_ba :=_f .Split (_de ,"\u003a");if len (_ba )!=2{return CellReference {},CellReference {},_b .New ("i\u006ev\u0061\u006c\u0069\u0064\u0020\u0072\u0061\u006eg\u0065\u0020\u0066\u006frm\u0061\u0074");
};if _dfa !=""{_ba [0]=_dfa +"\u0021"+_ba [0];_ba [1]=_dfa +"\u0021"+_ba [1];};_be ,_dd :=ParseCellReference (_ba [0]);if _dd !=nil {return CellReference {},CellReference {},_dd ;};_gf ,_dd :=ParseCellReference (_ba [1]);if _dd !=nil {return CellReference {},CellReference {},_dd ;
};return _be ,_gf ,nil ;};
// 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 );_gda :=uint32 (0);for _ ,_eg :=range col {_gda *=26;_gda +=uint32 (_eg -'A'+1);};return _gda -1;};
// Update updates reference to point one of the neighboring columns with respect to the update type after removing a row/column.
func (_caa *ColumnReference )Update (updateType _cg .UpdateAction )*ColumnReference {switch updateType {case _cg .UpdateActionRemoveColumn :_ff :=_caa ;_ff .ColumnIdx =_caa .ColumnIdx -1;_ff .Column =IndexToColumn (_ff .ColumnIdx );return _ff ;default:return _caa ;
};};
// 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 ;};
// ParseColumnRangeReference splits a range reference of the form "A:B" into its
// components.
func ParseColumnRangeReference (s string )(_bfc ,_ddd ColumnReference ,_cgg error ){_cab :="";_eb :=_f .Split (s ,"\u0021");if len (_eb )==2{_cab =_eb [0];s =_eb [1];};_agag :=_f .Split (s ,"\u003a");if len (_agag )!=2{return ColumnReference {},ColumnReference {},_b .New ("i\u006ev\u0061\u006c\u0069\u0064\u0020\u0072\u0061\u006eg\u0065\u0020\u0066\u006frm\u0061\u0074");
};if _cab !=""{_agag [0]=_cab +"\u0021"+_agag [0];_agag [1]=_cab +"\u0021"+_agag [1];};_gfg ,_cgg :=ParseColumnReference (_agag [0]);if _cgg !=nil {return ColumnReference {},ColumnReference {},_cgg ;};_egb ,_cgg :=ParseColumnReference (_agag [1]);if _cgg !=nil {return ColumnReference {},ColumnReference {},_cgg ;
};return _gfg ,_egb ,nil ;};var _af =_e .MustCompile ("^\u005b\u0061\u002d\u007aA-\u005a]\u0028\u005b\u0061\u002d\u007aA\u002d\u005a\u005d\u003f\u0029\u0024");
// Update updates reference to point one of the neighboring cells with respect to the update type after removing a row/column.
func (_cdd *CellReference )Update (updateType _cg .UpdateAction )*CellReference {switch updateType {case _cg .UpdateActionRemoveColumn :_bb :=_cdd ;_bb .ColumnIdx =_cdd .ColumnIdx -1;_bb .Column =IndexToColumn (_bb .ColumnIdx );return _bb ;default:return _cdd ;
};};
// 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");
};_gd :=ColumnReference {};_df ,_fa ,_ec :=_gcf (s );if _ec !=nil {return ColumnReference {},_ec ;};if _df !=""{_gd .SheetName =_df ;};if _fa [0]=='$'{_gd .AbsoluteColumn =true ;_fa =_fa [1:];};if !_af .MatchString (_fa ){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");
};_gd .Column =_fa ;_gd .ColumnIdx =ColumnToIndex (_gd .Column );return _gd ,nil ;};
// String returns a string representation of CellReference.
func (_g CellReference )String ()string {_ca :=make ([]byte ,0,4);if _g .AbsoluteColumn {_ca =append (_ca ,'$');};_ca =append (_ca ,_g .Column ...);if _g .AbsoluteRow {_ca =append (_ca ,'$');};_ca =_fd .AppendInt (_ca ,int64 (_g .RowIdx ),10);return string (_ca );
};