{"version":3,"sources":["App.tsx","../../src/script/api.js","../../src/script/chem/element.js","../../src/script/util/vec2.js","../../src/script/util/pool.js","../../src/script/util/pile.js","../../src/script/util/box2abs.js","../../src/script/chem/struct/atomlist.js","../../src/script/chem/struct/atom.js","../../src/script/chem/struct/bond.js","../../src/script/chem/struct/fragment.js","../../src/script/chem/struct/sgroup.js","../../src/script/chem/struct/rgroup.js","../../src/script/chem/struct/sgforest.js","../../src/script/chem/struct/index.js","../../src/script/chem/molfile/utils.js","../../src/script/chem/molfile/parseSGroup.js","../../src/script/chem/molfile/v2000.js","../../src/script/chem/molfile/v3000.js","../../src/script/chem/molfile/common.js","../../src/script/chem/molfile/molfile.js","../../src/script/chem/molfile/index.js","../../src/script/chem/smiles/cis_trans.js","../../src/script/chem/smiles/dfs.js","../../src/script/chem/smiles/stereocenters.js","../../src/script/chem/smiles/index.js","../../src/script/format/schemes/rootSchema.js","../../src/script/format/utils.js","../../src/script/format/schemes/moleculeSchema.js","../../src/script/format/chemGraph/toGraph/moleculeToGraph.js","../../src/script/format/chemGraph/convertStruct.js","../../src/script/format/schemes/rgroupSchema.js","../../src/script/format/chemGraph/toGraph/rgroupToGraph.js","../../src/script/format/chemGraph/fromGraph/moleculeToStruct.js","../../src/script/format/chemGraph/fromGraph/rgroupToStruct.js","../../src/script/format/chemGraph/fromGraph/rxnToStruct.js","../../src/script/format/chemGraph/toGraph/prepare.js","../../src/script/format/chemGraph/index.js","../../src/script/format/chemGraph/fromGraph/simpleObjectToStruct.js","../../src/script/format/chemGraph/toGraph/headerToGraph.js","../../src/script/format/chemGraph/toGraph/rxnToGraph.js","../../src/script/format/chemGraph/toGraph/simpleObjectToGraph.js","../../src/script/ui/data/convert/structformat.js","../../src/contexts/settingsContext.tsx","../../src/contexts/formContext.tsx","../../src/script/ui/component/cliparea.jsx","../../src/script/ui/data/convert/keynorm.js","../../src/script/ui/data/schema/schema-helper.js","../../src/script/ui/data/schema/struct-schema.js","../../src/script/ui/data/schema/sdata-schema.js","../../src/script/ui/data/convert/structconv.js","../../src/script/ui/action/tools.js","../../src/script/ui/action/atoms.js","../../src/script/ui/action/zoom.js","../../src/script/ui/data/schema/options-schema.js","../../src/script/ui/storage-ext.js","../../src/script/ui/state/options/index.js","../../src/script/ui/state/modal/sdata.js","../../src/script/ui/state/modal/form.js","../../src/script/ui/state/shared.js","../../src/script/ui/state/server/index.js","../../src/script/ui/action/server.js","../../src/script/ui/action/debug.js","../../src/script/ui/data/templates.js","../../src/script/ui/action/templates.js","../../src/script/ui/action/index.js","../../src/script/ui/state/modal/index.js","../../src/script/ui/state/hotkeys.js","../../src/script/chem/sdf.js","../../src/script/ui/state/templates/init-lib.js","../../src/script/ui/state/templates/index.js","../../src/hooks/useSettingsContext.ts","../../src/hooks/useFormContext.tsx","../../src/script/ui/app/hidden.jsx","../../src/script/ui/state/editor/index.js","../../src/script/raphael-ext.js","../../src/script/util/scale.js","../../src/script/render/util.js","../../src/script/render/restruct/visel.js","../../src/script/render/restruct/reobject.js","../../src/script/chem/element-color.js","../../src/script/render/draw.js","../../src/script/render/restruct/reatom.js","../../src/script/render/restruct/rebond.js","../../src/script/render/restruct/rerxnplus.js","../../src/script/render/restruct/rerxnarrow.js","../../src/script/render/restruct/refrag.js","../../src/script/render/restruct/rergroup.js","../../src/script/render/restruct/redatasgroupdata.js","../../src/script/render/restruct/reenhancedflag.js","../../src/script/render/restruct/resgroup.js","../../src/script/render/restruct/reloop.js","../../src/script/render/restruct/resimpleobject.js","../../src/script/render/restruct/index.js","../../src/script/editor/shared/utils.js","../../src/script/render/index.js","../../src/script/render/options.js","../../src/script/editor/operations/base.js","../../src/script/editor/operations/op-frag.js","../../src/script/editor/operations/op.js","../../src/script/editor/shared/action.js","../../src/script/editor/actions/basic.js","../../src/script/editor/shared/closest.js","../../src/script/editor/actions/utils.js","../../src/script/editor/shared/constants.js","../../src/script/editor/actions/sgroup.js","../../src/script/editor/actions/rgroup.js","../../src/script/editor/actions/atom.js","../../src/script/editor/tool/rgroupatom.js","../../src/script/editor/tool/helper/locate.js","../../src/script/editor/tool/helper/lasso.js","../../src/script/editor/tool/sgroup.js","../../src/script/editor/actions/bond.js","../../src/script/editor/tool/atom.js","../../src/script/editor/actions/fragment.js","../../src/script/editor/actions/closely-fusing.js","../../src/script/editor/tool/select.js","../../src/script/editor/actions/simpleobject.js","../../src/script/editor/actions/erase.js","../../src/script/editor/tool/eraser.js","../../src/script/editor/tool/bond.js","../../src/script/editor/tool/chain.js","../../src/script/editor/actions/aromatic-fusing.js","../../src/script/editor/actions/paste.js","../../src/script/editor/actions/template.js","../../src/script/editor/tool/template.js","../../src/script/editor/tool/charge.js","../../src/script/editor/tool/rgroupfragment.js","../../src/script/editor/tool/apoint.js","../../src/script/editor/tool/attach.js","../../src/script/editor/tool/reactionarrow.js","../../src/script/editor/tool/reactionplus.js","../../src/script/editor/tool/reactionmap.js","../../src/script/editor/tool/reactionunmap.js","../../src/script/editor/tool/paste.js","../../src/script/editor/actions/rotate.js","../../src/script/editor/tool/rotate.js","../../src/script/editor/tool/simpleobject.js","../../src/script/editor/actions/reaction.js","../../src/script/editor/actions/chain.js","../../src/script/editor/tool/index.js","../../src/script/editor/tool/enhanced-stereo.js","../../src/script/editor/index.js","../../src/script/ui/component/structeditor.jsx","../../src/script/ui/app/editor.jsx","../../src/script/ui/component/dialog.jsx","../../src/script/ui/component/view/openbutton.jsx","../../src/script/ui/state/action/index.js","../../src/script/ui/state/toolbar/index.js","../../src/script/ui/state/index.js","../../src/script/ui/dialog/mainmenu/open.jsx","../../src/script/ui/component/form/input.jsx","../../src/script/ui/dialog/mainmenu/analyse.jsx","../../src/script/ui/component/structrender.jsx","../../src/script/ui/component/view/spin.jsx","../../src/script/ui/dialog/mainmenu/recognize.jsx","../../src/script/ui/component/view/atom.jsx","../../src/script/ui/component/view/tabs.jsx","../../src/script/chem/generics.js","../../src/script/ui/dialog/elements/generic-groups.jsx","../../src/script/ui/dialog/elements/period-table.jsx","../../src/script/ui/component/form/form.jsx","../../src/script/ui/component/form/buttonlist.jsx","../../src/script/ui/dialog/toolbox/rgroup.jsx","../../src/script/ui/dialog/template/template-attach.jsx","../../src/script/ui/component/view/visibleview.jsx","../../src/script/ui/component/view/savebutton.jsx","../../src/script/ui/component/form/select.jsx","../../src/script/ui/dialog/template/template-lib.jsx","../../src/script/ui/dialog/mainmenu/about.jsx","../../src/script/ui/dialog/mainmenu/miew.jsx","../../src/script/ui/dialog/toolbox/atom.jsx","../../src/script/ui/dialog/toolbox/attach.jsx","../../src/script/ui/dialog/toolbox/automap.jsx","../../src/script/ui/dialog/toolbox/bond.jsx","../../src/script/ui/dialog/mainmenu/check.jsx","../../src/script/ui/dialog/toolbox/enhanced-stereo.jsx","../../src/script/ui/dialog/toolbox/labeledit.jsx","../../src/script/ui/dialog/toolbox/rgroup-logic.jsx","../../src/script/ui/dialog/mainmenu/save.jsx","../../src/script/ui/component/view/accordion.jsx","../../src/script/ui/component/form/measure-input.jsx","../../src/script/ui/component/form/systemfonts.jsx","../../src/script/ui/component/form/select-checkbox.jsx","../../src/script/ui/dialog/mainmenu/options.jsx","../../src/script/ui/dialog/toolbox/sgroup.jsx","../../src/script/ui/component/form/combobox.jsx","../../src/script/ui/dialog/toolbox/sdata.jsx","../../src/script/ui/dialog/index.js","../../src/script/ui/dialog/mainmenu/help.jsx","../../src/script/ui/app/modal.jsx","../../src/icons/index.tsx","../../src/script/ui/component/view/icon.jsx","../../src/script/ui/component/actionmenu.jsx","../../src/script/ui/app/toolbar.jsx","../../src/script/ui/app/index.jsx","../../src/script/format/schemes/rxnSchemas.js","../../src/script/format/schemes/simpleObjectSchema.js","../../src/script/index.js","../../src/script/ui/index.js","../../src/script/format/graphValidator.js","../../src/index.tsx","index.tsx"],"names":["global","Miew","App","staticResourcesUrl","process","apiPath","pollDeferred","complete","timeGap","startTimeGap","Promise","resolve","reject","setTimeout","iterate","then","val","e","err","element","label","period","group","title","state","origin","type","atomic_mass","leftH","Vec2","x","y","z","arguments","length","this","parseFloat","Error","map","reduce","res","el","index","ZERO","UNIT","prototype","Math","sqrt","equals","v","add","add_","get_xy0","sub","scaled","s","negated","yComplement","y1","addScaled","f","normalized","normalize","l","turnLeft","coordStr","toString","toFixed","max","min","ceil","floor","rotate","angle","si","sin","co","cos","rotateSC","oxAngle","atan2","dist","a","b","diff","v1","v2","sum","dot","cross","lc","args","i","lc2","f1","f2","centre","Pool","arg","_nextId","item","id","entries","key","predicate","Array","from","filter","value","Map","Pile","setB","isSuperset","subset","has","filterFunc","union","Set","Box2Abs","p0","p1","AtomList","params","notList","ids","Atom","def","attrGetDefault","fragment","pseudo","ifDef","valence","implicitH","pp","sgs","atomList","neighbors","badConn","radicalElectrons","radical","PATTERN","RADICAL","NONE","DOUPLET","SINGLET","TRIPLET","dst","src","prop","Bond","begin","end","xxx","stereo","STEREO","topology","TOPOLOGY","EITHER","reactingCenterStatus","hb1","hb2","len","sb","sa","center","Fragment","flag","stereoAtoms","enhancedStereoFlag","calcStereoFlag","struct","stereoAids","stereoLabel","atoms","get","aid","some","atom","split","SGroup","bracketBox","bracketDir","areas","highlight","highlighting","selected","selectionPlate","patoms","bonds","xBonds","neiAtoms","data","mul","connectivity","name","subscript","attached","absolute","showUnits","nCharsToDisplay","tagChar","daspPos","fieldType","fieldName","fieldValue","units","query","queryOp","RGroup","logic","frags","resth","range","ifthen","SGroupForest","parent","children","set","atomSets","Struct","sgroups","halfBonds","loops","isReaction","rxnArrows","rxnPluses","rgroups","sGroupForest","simpleObjects","HalfBond","bid","dir","norm","ang","p","loop","contra","next","leftSin","leftCos","leftNeighbor","rightSin","rightCos","rightNeighbor","Loop","hbs","isConvex","dblBonds","aromatic","convex","forEach","hb","bond","TYPE","AROMATIC","DOUBLE","RxnPlus","SimpleObject","pos","mode","RxnArrow","arrayAddIfMissing","array","push","clone","extend","lp","rb","include","contains","ext","translate","d","transform","options","sz","fromRelBox","relBox","width","height","b1","b2","segmentIntersection","c","dc","dd","da","db","labelList","labels","join","sort","getAttrHash","attrs","attr","attrlist","STEREO_PARITY","ODD","EVEN","alias","isotope","charge","explicitValence","ringBondCount","substitutionCount","unsaturatedAtom","hCount","invRet","exactChangeFlag","rglabel","attpnt","aam","stereoParity","fidMap","ret","isQuery","pureHydrogen","isPlainCarbon","isPseudo","hasRxnProps","calcValence","conn","elem","undefined","groupno","rad","hyd","absCharge","abs","calcValenceMinusHyd","SINGLE","TRIPLE","SINGLE_OR_DOUBLE","SINGLE_OR_AROMATIC","DOUBLE_OR_AROMATIC","ANY","UP","DOWN","CIS_TRANS","RING","CHAIN","REACTING_CENTER","NOT_CENTER","UNMARKED","CENTER","UNCHANGED","MADE_OR_BROKEN","ORDER_CHANGED","MADE_OR_BROKEN_AND_CHANGED","getCenter","p2","getDir","aidMap","cp","Object","create","fr","STEREO_FLAG","Mixed","and","or","null","updateStereoFlag","updateStereoAtom","isAdd","includes","TYPES","MUL","SRU","SUP","DAT","GEN","getAttr","getAttrs","keys","setAttr","oldValue","checkAttr","filterAtoms","newAtoms","removeNegative","j","mol","sg","atomMap","sgroup","field","allAtoms","addAtom","removeAtom","splice","getCrossBonds","inBonds","parentAtomSet","bracketPos","xbonds","bb","contentBoxes","bba","bbb","vext","getBracketParameters","atomSet","n","BracketParams","w","h","brackets","bracketWidth","cl","cr","bracketHeight","cl0","cr0","dr","dl","getObjBBox","a0","getAtoms","getBonds","indexOf","prepareMulForSaving","xAtom1","xAtom2","crossBond","bond1","bond2","amap","tailAtom","aid2","newBond","newCrossBond","xBond2","getPathToRoot","reverse","sgid","atomAddToSGroup","getMassCentre","findRGroupByFragment","frid","find","rgid","rgroup","fid","getSGroupsBFS","order","queue","shift","concat","getAtomSetRelations","newId","isStrictSuperset","isSubset","parents","findIndex","childId","path","insert","guess","childs","remove","parentId","hasRxnArrow","size","isBlank","bondSet","dropRxnSymbols","simpleObjectsSet","mergeInto","getScaffold","rg","fnum","getFragmentIds","getFragment","keepAllRGroups","fidMask","frag","rgroupsIds","keepGroup","newfid","oldfid","JSON","parse","stringify","bidMap","soid","findBondId","initNeighbors","a1","a2","bondInitHalfBonds","halfBondUpdate","hbid","initHalfBonds","clear","setHbNext","halfBondSetAngle","left","hbl","atomAddNeighbor","ir","il","atomSortNeighbors","nei","nei2","nextNei","sortNeighbors","list","atomUpdateHalfBonds","updateHalfBonds","sGroupsRecalcCrossBonds","sGroupDelete","atomSetPos","rxnPlusSetPos","rxnArrowSetPos","simpleObjectSetPos","getCoordBoundingBox","getCoordBoundingBoxObj","getBondLengthData","totalLength","cnt","getAvgBondLength","bld","getAvgClosestAtomDistance","minDist","k","totalDist","checkBondExists","findConnectedComponent","firstaid","pop","neiId","findConnectedComponents","discardExistingFragments","addedAtoms","components","component","markFragment","idSet","markFragments","comp","scale","rescale","avg","loopHasSelfIntersections","hbi","ai","bi","hbj","aj","bj","partitionLoop","subloops","continueFlag","atomToHalfBond","aid1","subloop","slice","halfBondAngle","hbid1","hbid2","hba","hbb","loopIsConvex","every","loopArr","loopIsInner","totalAngle","PI","hbida","hbidb","findLoops","hbIdNext","loopId","newLoops","bondsToMark","hbId","prepareLoopStructure","calcConn","calcImplicitHydrogen","isAromatic","correctConn","hasImplicitH","setImplicitHydrogen","getComponents","connectedComponents","barriers","arrowPos","reactants","products","defineRxnFragmentTypeForAtomset","atomset","arrowpos","getBondFragment","fmtInfo","bondTypeMap","1","2","3","4","5","6","7","8","bondStereoMap","0","v30bondStereoMap","bondTopologyMap","countsLinePartition","atomLinePartition","bondLinePartition","atomListHeaderPartition","atomListHeaderLength","atomListHeaderItemLength","chargeMap","valenceMap","implicitHydrogenMap","v30atomPropMap","CHG","RAD","MASS","VAL","HCOUNT","INVRET","SUBST","UNSAT","RBCNT","rxnItemsPartition","FRAGMENT","paddedNum","number","precision","numStr","replace","padStart","parseDecimalInt","str","parseInt","isNaN","partitionLine","parts","withspace","partitionLineFixed","itemLength","rxnMerge","mols","nReactants","nProducts","nAgents","shouldReactionRelayout","bbReact","bbAgent","bbProd","molReact","molAgent","molProd","bondLengthData","bondLengthDataMol","bb1","bb2","avgBondLength","fragmentType","rxnFragmentType","shiftMol","xorig","over","bbReactAll","bbProdAll","readKeyValuePairs","valueString","partition","utils","count","trim","postLoadMul","atomReductionMap","m","raid","patomsMap","identityMap","bondsToRemove","beginIn","endIn","postLoadSru","toLowerCase","postLoadSup","postLoadGen","postLoadDat","applyDataSGroupInfo","propData","applyDataSGroupData","finalize","startsWith","endsWith","substr","readKeyMultiValuePairs","loadSGroup","postLoadMap","initSGroup","sGroups","applySGroupProp","propName","numeric","core","kv","applySGroupArrayProp","sid","num","part","strArray","toIntArray","applyDataSGroupName","applyDataSGroupQuery","applyDataSGroupQueryOp","applyDataSGroupDesc","sGroup","applyDataSGroupInfoLine","applyDataSGroupDataLine","parseAtomLine","atomLine","atomSplit","massDifference","stereoCare","parseBondLine","bondLine","bondSplit","parseAtomListLine","atomListLine","parseCTabV2000","ctabLines","countsSplit","ctab","atomCount","bondCount","atomListCount","isAbs","stextLinesCount","propertyLinesCount","atomLines","bondLines","atomListLines","pair","rLogic","props","line","charAt","propValue","test","propertyData","rglabels","a2rs","a2ri","a2r","iii","hhh","ooo","pool","parsePropertyLineAtomList","parsePropertyLines","values","propId","propVal","applyAtomProp","psg","call","emptyGroups","parseRg2000","coreLines","fragmentLines","parseCTab","strId","scaffold","rgMerge","hdr","lst","labelsListToIds","parseRxn2000","lines","search","parseAtomLineV3000","subsplit","spaceparsplit","atomListParams","splitonce","ival","rgrsplit","parseBondLineV3000","v3000parseCollection","v3000parseSGroup","stripV30","splitSGroupDef","parseBracedNumberList","brkxyzStrs","brkxyz","stripQuotes","parseCTabV3000","norgroups","vals","substring","readRGroups3000","rfrags","rfrag","rlsplit","pc","i0","quoted","delim","braceBalance","parseRxn3000","findCtabEnd","findRGroupEnd","molLinesReactants","molLinesProducts","current","rGroups","molLines","version","v2000","v3000","prepareForSaving","message","saveToMolfile","sgMap","bondMap","idstr","makeAtomBondLines","smtLine","bracketsToMolfile","sdtLine","padEnd","sddLine","nCharnCharsToDisplay","nlRe","chars","prefix","rem","salLine","bracket","coord","parseMol","parseRxn","Molfile","molecule","molfile","parseCTFile","molfileLines","common","prepareSGroups","skipErrors","preserveIndigoDesc","toRemove","errors","errorIgnore","ex","getCTab","writeCTab2000","saveMolecule","skipSGroupErrors","reaction","all","saver","submol","writePaddedNumber","writeHeader","date","Date","writeCR","writeWhiteSpace","write","getMonth","getDate","getFullYear","getHours","getMinutes","repeat","writePadded","writePaddedFloat","writeCTab2000Header","isAbsFlag","mapping","atomList_list","atomProps_list","bondMapping","chargeList","isotopeList","radicalList","rglabelList","rglogicList","aplabelList","rbcountList","unsaturatedList","substcountList","writeAtomPropList","rgi","sgmap","sgmapback","q","parentid","toUpperCase","molFileManager","opts","ignoreErrors","noRgroups","reactionRelayout","badHeaderRecover","ex1","ex2","molFileStr","match","exec","CisTrans","neighborsFunc","context","getNeighbors","swap","arr","i1","i2","tmp","Dfs","atomData","atom_data","nComponentsInReactants","vertices","VertexDesc","edges","EdgeDesc","v_seq","Stereocenters","Smiles","smiles","writtenAtoms","writtenComponents","ignore_errors","PARITY","CIS","TRANS","each","func","getParity","idx","parity","getSubstituents","substituents","sameside","beg","neiBeg","neiEnd","normBeg","normEnd","prodBeg","prodEnd","samesides","iBeg","iEnd","iNeiBeg","iNeiEnd","sortSubstituents","h0","h1","h2","h3","isGeomStereoBond","bondIdx","label1","label2","neiBegin","neiЕnd","build","excludeBonds","ct","isArray","sign","dfs_state","parent_vertex","parent_edge","branches","opening_cycles","closing_cycle","SeqElem","vIdx","parVertex","parEdge","walk","vStack","cid","parentVertex","seqElem","atomD","neighbours","neiIdx","edgeIdx","edgeClosingCycle","eIdx","numBranches","numOpeningCycles","buildFromBonds","alleneMask","neiList","nei1","nei1nei","nei2nei","stereocenter","buildOneCenter","allowed_stereocenters","degree","n_double_bonds","implicit_degree","atomIdx","implicitDegree","pyramid","edgeIds","lastAtomDir","nDoubleBonds","nPureHydrogens","neiAtom","edge_idx","nei_idx","rank","vec","as","xyz1","xyz2","main1","main2","side1","side2","mainDir","getBondStereo","xyzzy","stereo0","stereo1","stereo2","nUp","nDown","xyz","centerIdx","u","sine1","cosine1","sine2","cosine2","v3","isPyramidMappingRigid","rigid","_Atom","hСount","lowercase","chirality","branch_cnt","paren_written","h_count","isBondInRing","inLoop","allowedLowercase","bondsInLoops","hbids","touchedCistransbonds","markCisTrans","componentsAll","seqEl","vPrevIdx","openingCycles","stereocenters","sc","implicitHIdx","pyramidMapping","counter","cycleNumbers","firstComponent","writeAtom","writeCycleNumber","calcBondDirection","comma","writeRadicals","needBrackets","hydro","cis_trans","dbonds","ctbond_beg","ctbond_end","saved","aromFailBeg","aromFailEnd","updateSideBonds","subst","sidebonds","n1","n2","n3","n4","vprev","ntouched","marked","graphSchema","required","properties","header","$ref","root","patternProperties","nodes","items","oneOf","$refs","maxItems","moleculeName","default","creatorProgram","comment","target","defaultValue","moleculeSchema","stereoFlag","enum","maxLength","location","minimum","maximum","enumNames","attachmentPoints","pattern","weight","atomlist","elements","minItems","rgatom","stereobox","allOf","invalidMessage","minLength","display","placement","moleculeToGraph","body","source","schema","structSchema","result","refsToRGroups","fromRlabel","rgnumber","rglabelToGraph","atomListToGraph","atomToGraph","bondToGraph","sgroupToGraph","rgroupSchema","rlogic","rgroupLogicToGraph","rglogic","moleculeToStruct","graphItem","toRlabel","rglabelToStruct","atomListToStruct","atomToStruct","bondToStruct","fieldData","sgroupToStruct","rgroupToStruct","rgroupLogicToStruct","rxnToStruct","getFragmentCenter","parseNode","node","simpleObjectToStruct","toGraph","headerSchema","rootSchema","headerToGraph","graphNodes","rgFrags","fragsAtoms","moleculeFragsAtoms","acc","fragAtoms","prepareStructForGraph","moleculeId","rgroupToGraph","plusNode","plusToGraph","arrowNode","arrowToGraph","fromGraph","graph","resultingStruct","mime","supportsCoords","rxn","smarts","inchi","cml","format","server","serverOpts","moldata","convert","output_format","fromString","structStr","strict","molStr","er","molMatch","withCoords","layout","formatError","settingsContext","React","createContext","formContext","ieCb","window","clipboardData","ClipArea","textAreaRef","createRef","parentNode","listeners","mouseup","event","cliparea","isActiveElement","focused","focus","select","mousedown","shiftKey","preventDefault","copy","onCopy","cut","onCut","paste","onPaste","cb","formats","getData","fmt","en","addEventListener","removeEventListener","ref","className","contentEditable","autoFocus","suppressContentEditableWarning","Component","tagName","setData","curFmt","console","info","actions","action","enabled","document","queryCommandSupported","execCommand","ClipboardEvent","mac","navigator","platform","normalizeKeyName","alt","ctrl","meta","mod","normalizeKeyMap","modifiers","altKey","ctrlKey","metaKey","rusToEng","KN","keyCode","normalizeKeyEvent","base","isChar","keyNorm","obj","KeyboardEvent","mapOf","desc","constant","lookup","baseName","labelEdit","primary","secondary","sgroupMap","rgroupLogic","minium","radioButtonsSchema","contextSchema","sData","radiobuttons","Multifragment","Group","sdataCustomSchema","sdataSchema","firstKeyOf","getSdataDefault","fromElement","selem","satom","fromAtom","ap","sap","toElement","toAtomList","capitalize","toAtom","pch","atomSchema","conv","assign","toBond","toBondType","caption","bondCaptionMap","fromBondType","single","up","down","updown","double","crossed","triple","singledouble","singlearomatic","doublearomatic","any","fromSgroup","ssgroup","toSgroup","bondCuts","typeSchema","bondSchema","shortcut","tool","erase","chain","basic","atomCuts","H","C","N","O","S","P","F","Cl","Br","I","A","zoomList","zoom","editor","disabled","findLastIndex","SERVER_OPTIONS","miew","miewMode","miewTheme","miewAtomLabel","MIEW_OPTIONS","optionsSchema","resetToSelect","rotationStep","showValenceWarnings","atomColoring","hideStereoFlags","font","fontsz","fontszsub","carbonExplicitly","showCharge","showValence","showHydrogenLabels","aromaticCircle","doubleBondWidth","bondThickness","stereoBondWidth","showAtomIds","showBondIds","showHalfBondIds","showLoopIds","getDefaultOptions","storage","localStorage","getItem","isSet","setItem","initOptionsState","app","templates","analyse","roundWeight","roundMass","check","checkOptions","recognize","file","settings","errProps","jsonschema","Validator","validate","property","validation","getServerSettings","pick","appUpdate","dispatch","recognizeActions","setStruct","correctErrors","payload","valid","onContextChange","fValue","onFieldNameChange","formsState","atomProps","automap","bondProps","moleculeErrors","save","filename","sdata","initSdata","updateFormState","formReducer","formName","init","actionContext","actionFieldName","newstate","sdataReducer","onAction","dialog","thunk","loadStruct","getState","load","structFormat","optsTypes","ketcherErrors","checkParams","badVal","ketcherCheck","types","without","serverCall","serverTransform","method","selection","selectedAtoms","explicitSelected","reindexMap","omit","clean","arom","dearom","cip","update","molQs","encodeURIComponent","qs","new","tools","open","undo","historySize","redo","dontClipMessage","hasSelection","active","help","about","selectionTool","toolbar","visibleTools","alignDescriptors","debug","sgroupData","alert","openDialog","dialogName","onResult","onCancel","initKeydownListener","hotKeys","act","actName","setHotKey","initHotKeys","modal","actionState","actionTool","activeTool","atomsSelected","letter","isEqual","checkGroupOnTool","clipArea","newAction","keyHandle","rxnTextPlain","initClipboard","debAction","debounce","currentState","clipData","render","structSelected","graphData","chunk","regexp","propChunks","isFinite","initLib","lib","initTmplLib","baseUrl","cacheEl","prefetchStatic","text","tmpls","sdf","files","tmpl","prefetchSplit","fn","svgs","svgContent","innerHTML","prefetchRender","cachedFiles","pr","prerender","userLib","userTmpls","url","fetch","credentials","resp","ok","updateLocalStore","initTmplsState","attach","tmplActions","attachActions","useSettingsContext","useContext","SettingsContext","useFormContext","FormContext","AppHidden","connect","onInitTmpls","rootRef","useRef","useEffect","AppCliparea","initEditor","updateAction","sleep","time","selectMode","resetOption","acts","onInit","onChange","onSelectionChange","onElementEdit","dlg","disabledIds","fragId","onEnhancedStereoEdit","fromStereoLabel","sstereoLabel","onQuickEdit","onBondEdit","sbond","onRgroupEdit","rgroupLabels","onSgroupEdit","onSdataEdit","onMessage","msg","error","onAromatizeStruct","onDearomatizeStruct","onMouseDown","Raphael","translateAbs","delta","st","scaled2obj","obj2scaled","tfx","box","shiftRayBox","r","rc","rd","pid","nid","id0","id1","Visel","paths","boxes","boundingBox","ReObject","exts","viselType","visel","getVBoxObj","vbox","offset","setHighlight","highLight","noredraw","removed","show","paper","setStart","drawHighlight","setFinish","hide","makeSelectionPlate","colors","He","Li","Be","B","Ne","Na","Mg","Al","Si","Ar","K","Ca","Sc","Ti","V","Cr","Mn","Fe","Co","Ni","Cu","Zn","Ga","Ge","As","Se","Kr","Rb","Sr","Y","Zr","Nb","Mo","Tc","Ru","Rh","Pd","Ag","Cd","In","Sn","Sb","Te","Xe","Cs","Ba","La","Ce","Pr","Nd","Pm","Sm","Eu","Gd","Tb","Dy","Ho","Er","Tm","Yb","Lu","Hf","Ta","W","Re","Os","Ir","Pt","Au","Hg","Tl","Pb","Bi","Po","At","Rn","Fr","Ra","Ac","Th","Pa","U","Np","Pu","Am","Cm","Bk","Cf","Es","Fm","Md","No","Lr","Rf","Db","Sg","Bh","Hs","Mt","Ds","Rg","Cn","Nh","Fl","Mc","Lv","Ts","Og","sketchingColors","util","makeStroke","dashedPath","dash","t0","t1","black","t2","recenterText","rbb","vml","gap","arrow","lineattr","plus","aromaticBondPaths","a3","b3","mask","bondSingle","bondSingleUp","fill","bondSingleStereoBold","a4","stroke","bondDoubleStereoBold","sgBondPath","bondSingleDown","nlines","step","bsp","stereoBond","bondSingleEither","bondDouble","cisTrans","bondSingleOrDouble","nSect","pi","bondSpace","bondTriple","bondAromatic","bondShift","l1","l2","bondAny","reactingCenter","pathdesc","topologyMark","mark","getBBox","radicalCap","lineWidth","dw","dh","radicalBullet","circle","b0","sgroupBracketStyle","selectionRectangle","rect","lassoStyle","selectionPolygon","pstr","selectionLine","rectangle","polyline","ReAtom","showLabel","hydrogenOnTheLeft","color","pathAndRBoxTranslate","bisectLargestSector","angles","daMax","shiftBondEnd","pos0","margin","t","ReBond","doubleBondShift","findIncomingStereoUpBond","bid0","includeBoldStereoBond","restruct","neibond","boldStereo","findIncomingUpBonds","halfbonds","neihbid1","neihbid2","getBondSingleStereoBoldPath","coords1","stereoUpBondGetCoordinates","coords2","draw","getBondLineShift","neihbid","neihb","cosHalf","biss","getBondAromaticPath","shiftA","shiftB","dashdotPattern","s1","s2","getAromaticBondPaths","getIdsPath","bondIdxOff","param1","param2","pb","ipath","irbb","bondRecalc","atom1","atom2","ReRxnPlus","ReRxnArrow","ReFrag","isSelectable","makeHighlightPlate","addReObjectPath","ps","atomSelectionPlateRadius","highlightStyle","styles","selectionStyle","yl","yr","nl","nr","setHydrogenPos","visibleTerminal","isLabelVisible","getLabelText","elementColor","buildLabel","rightMargin","leftMargin","implh","isHydrogen","hydroIndex","showHydroIndex","hshift","vshift","showRadical","showIsotope","hydrogenLabels","displayHydrogen","hydrogenLeft","hydrogen","showHydrogen","9","10","11","12","13","14","showExplicitValence","warning","showWarning","lsb","attpntText","pos1","attpntPath1","attpntRbb","lsbn","arrowLeft","arrowRight","attpntPath","showAttpnt","bind","aamText","getAamText","queryAttrsText","getQueryAttrsText","aamPath","aamBox","checkStereoBold","loop1","loop2","d1","d2","selectDoubleBondShift","nLeft","nRight","selectDoubleBondShiftChain","setDoubleBondShift","coords","getBondSingleUpPath","interval","getBondSingleDownPath","getBondSingleEitherPath","getBondDoubleStereoBoldPath","getBondDoublePath","inAromaticLoop","getSingleOrDoublePath","getBondPath","lw","bs","alongIntRc","alongIntMadeBroken","alongSz","acrossInt","acrossSz","getReactingCenterPath","fixed","getTopologyMark","subFontSize","highlightPath","fragGetAtoms","fragGetBonds","firstFrag","secondFrag","calcBBox","_ui_editor","_draw","keyOf","BORDER_EXT","ReRGroup","labelBox","rLogicToString","ifThen","rangeExists","restH","nextRg","ReDataSGroupData","ReEnhancedFlag","bbf","cy","leftBracket","rightBracket","rGroupdrawBrackets","labelSet","fontRLabel","logicStyle","fontRLogic","logicPath","logicBox","drawing","dataArea","ReSGroup","SGroupdrawBrackets","lowerIndexText","upperIndexText","indexAttribute","tl","tr","tt","tb","cc","dt","bracketR","renderIndex","indexPos","indexPath","indexBox","showValue","toFront","descriptorIntersects","topLeftPoint","sgBottomRightPoint","bottomRightPoint","remol","definePP","nameI","boxI","sboxI","drawAttachedDat","sbox","drawAbsoluteDat","drawGroupDat","ReLoop","radius","rlid","apos","bpos","pathStr","halfAngle","qi","isValid","ReSimpleObject","simpleObject","generatePath","calcDistance","distRef","point","dist1","dist2","topX","topY","bottomX","bottomY","distances","per","refPoint","getReferencePointDistance","getReferencePoints","rp","refPoints","poly","atan","enhPaths","stylesApplied","scaledRP","enhPath","highlightStyleSimpleObject","LAYER_MAP","background","warnings","indices","ReStruct","reloops","enhancedFlags","initialized","layers","initLayers","ccFragmentType","clearMarks","structChanged","lid","scaleRPath","connectedComponentRemoveAtom","clearConnectedComponents","getConnectedComponent","adjacentComponents","neighbor","addConnectedComponent","compId","aidSet","removeConnectedComponent","ccid","assignConnectedComponents","class","opacity","visible","insertBefore","maps","markItemRemoved","markBond","markItem","markAtom","mapChanged","clearVisel","eachItem","isSelectionEmpty","scaleVisel","clearVisels","force","atomsChanged","atomsChangedArray","verifyLoops","updLoops","updateLoops","showLabels","showBonds","showLoops","showReactionSymbols","showSGroups","showFragments","showRGroups","showEnhancedFlags","showSimpleObjects","reloop","simpleObjectsChanged","rxnArrowsChanged","rxnPlusesChanged","loopRemove","bondlist","enhancedFlagsChanged","chid","bondsChanged","setSelection","redraw","showItemSelection","exists","FRAC","calcAngle","fracAngle","angle2","round","degrees","calcNewAtomPos","setFracAngle","mergeBondsParams","struct1","struct2","begin1","begin2","end1","end2","mergeAngle","merged","inRange","DEBUG","logcnt","logmouse","hl","Render","clientArea","opt","renderWidth","clientWidth","renderHeight","clientHeight","userOpts","scaleFactor","labelFontSize","defaultOptions","autoScale","autoScaleMargin","maxBondLength","hideImplicitHydrogen","hideTerminalLabels","Base","execute","invert","perform","_inverted","isDummy","_isDummy","invalidateAtom","level","invalidateLoop","lid1","lid2","invalidateBond","invalidateItem","FragmentAdd","FragmentDelete","FragmentStereoFlag","invert_flag","invalidateEnhancedFlag","FragmentAddStereoAtom","FragmentDeleteStereoAtom","reEnhancedFlag","EnhancedFlagMove","enhancedFlag","logMethod","view2obj","isRelative","scroll","scrollPos","useOldZoom","obj2view","scrollLeft","scrollTop","page2obj","pagePos","curtop","curleft","offsetTop","offsetLeft","offsetParent","top","cumulativeOffset","pageX","pageY","setPaperSize","setSize","setViewBox","setOffset","newoffset","setZoom","setScrollOffset","cx","sSz","x0","y0","x1","ey","calcExtend","setScale","canvas","setAttribute","setMolecule","viewSz","changes","sf","sz1","marg","mv","csz","sz2","eb","vb","oldCb","oldBb","AtomAdd","AtomDelete","AtomAttr","attribute","data2","AtomMove","noinvalidate","BondMove","LoopMove","SGroupAtomAdd","SGroupAtomRemove","SGroupAttr","SGroupCreate","SGroupDelete","SGroupAddToHierarchy","relations","SGroupRemoveFromHierarchy","BondAdd","BondDelete","rebond","prev","BondAttr","RGroupAttr","rgp","RGroupFragment","rgid_new","rg_new","rgid_old","rg_old","rgNew","UpdateIfThen","rgOld","skipRgids","ifThenHistory","RestoreIfThen","history","rgValue","RxnArrowAdd","arid","RxnArrowDelete","RxnArrowMove","RxnPlusAdd","plid","RxnPlusDelete","RxnPlusMove","SGroupDataMove","CanvasLoad","oldStruct","AlignDescriptors","structBox","alignPoint","RestoreDescriptorsPosition","SimpleObjectAdd","performed","SimpleObjectDelete","SimpleObjectMove","SimpleObjectResize","anchor","previousPos1","previousPos0","operations","Action","fromNewCanvas","addOp","op","operation","mergeWith","findMaps","findClosestAtom","findClosestBond","inBox","xDist","pg","skip","closestAtom","closestBond","atomId","skipId","closestBondCenter","minCDist","mid","cdist","mp","merge","srcId","atomGetAttr","atomGetDegree","atomGetNeighbors","atomGetSGroups","atomGetPos","structSelection","atomForNewBond","neiPos","maxI","maxAngle","neiNeighbours","neiV","neiAngle","neiNei","neiNeiPos","vDiff","closest","getRelSgroupsBySelection","difference","SgContexts","fromSeveralSgroupAddition","descriptors","fromSgroupAddition","localAttrs","sGroupAttributeAction","fromSgroupDeletion","sG","asteriskAction","plainCarbon","fromSgroupAttrs","fromSgroupAction","newSg","sourceAtoms","currSelection","getAtomsBondIds","uniq","bondid","fromBondAction","atomsFromBonds","newSourceAtoms","fromGroupAction","fromMultiFragmentAction","fromAtomAction","targetAtoms","allFragments","removeAtomFromSgroupIfNeeded","removeSgroupIfNeeded","sgCounts","fromRGroupAttrs","fromRGroupFragment","rgidNew","fromUpdateIfThen","rgidOld","fromAtomAddition","fromAtomsAttrs","reset","fromStereoAtomAttrs","withReverse","fromAtomsFragmentAttr","aids","newfrid","oldfrid","fromAtomMerge","dstId","fragAction","mergeFragmentsIfNeeded","mergeBondId","frid2","fridAtoms","atomsToNewFrag","moveAtomsAction","mergeSgroups","srcAtoms","dstAtom","RGroupAtomTool","propsDialog","elementEdit","isPointInPolygon","v0","n0","d0","w0","flag1","flag0","w1","mousemove","hover","findItem","click","rnd","ci","inRectangle","bondList","rxnArrowsList","rxnPlusesList","simpleObjectsList","enhancedFlagList","sgroupDataList","inPolygon","rr","LassoHelper","getSelection","locate","points","running","addPoint","dp","searchMaps","SGroupTool","_","sgroupDialog","lassoHelper","defaultType","eventName","sgAtoms","manyComponentsSelected","singleComponentSelected","anyChainedBonds","getContextBySgroup","getContextBySelection","checkOverlapping","fromContextType","allBondsSelected","fixedBond","countOfSelectedComponents","fromBondAddition","pos2","mergeFragments","fromBondStereoUpdate","fromBondsAttrs","fromBondFlipping","neigs","stereoNeig","newAtomParity","bondChangingAction","itemID","plainBondTypes","bondFlipRequired","mouseleave","cancel","AtomTool","atomLongtapEvent","dragCtx","atomid","timeout","quickEdit","newatom","xy0","stopTapping","clearTimeout","fromMultipleMove","lists","atomsToInvalidate","rxnArrow","rxnPulse","sgData","fromStereoFlagUpdate","processAtom","usedIds","fromFragmentSplit","rgForRemove","fromItemsFuse","usedAtoms","mergeMap","atomPairs","bondCI","fromBondsMerge","getItemsToFuse","mergeItems","closestMap","closestToMerge","findMerge","getHoverToFuse","hoverItems","now","SelectTool","closestToSel","selMerge","reversible","dest","xor","uniqArray","isSelected","fromSimpleObjectDeletion","fromSimpleObjectAddition","fromSimpleObjectResizing","fromBondDeletion","skipAtoms","atomsToRemove","fromFragmentDeletion","frids","actionRemoveDataSGroups","actionRemoveBonds","frid3","EraserTool","BondTool","ChainTool","fromAromaticTemplateOnBond","template","events","simpleFusing","beforeMerge","getFragmentWithBondMap","afterMerge","pasteItems","canBeAromatized","aromatizeStruct","astruct","atmpl","aromatizeAction","fromAromatize","aromTemplate","templateFusingAction","dearomatizeStruct","destruct","dearomatizeAction","dastruct","fromDearomatize","hasAromLoop","atomsInStruct","fromPaste","pstruct","getStructCenter","fridMap","tmpAtom","newsgid","oper","newRgId","xmin","ymin","xmax","ymax","fromTemplateOnCanvas","fromTemplateOnAtom","extraBond","extraRes","additionalAtom","middleAtom","actionRes","extraBondAction","angle0","fromTemplateOnBondAction","flip","fromTemplateOnBond","tmplBond","tmplBegin","atomsMap","bondAtoms","mergeA","tBond","existId","TemplateTool","findItems","getSign","ChargeTool","RGroupFragmentTool","APointTool","AttachTool","attachPoints","ReactionArrowTool","ReactionPlusTool","ReactionMapTool","isValidMap","rcs","ri","ro","po","ReactionUnmapTool","PasteTool","lastEvent","fromFlip","fids","bbox","calcCenter","flipItemByCenter","fromRotate","rotateDelta","did","RotateTool","fromBondAlign","SimpleObjectTool","newAtomPos","selectFragment","sel","expSel","dblclick","ra","bondEdit","newbond","fromOneAtomDeletion","fromOneBondDeletion","fromArrowDeletion","fromPlusDeletion","Number","MAX_VALUE","xy1","xy","bondAddition","sectCount","dx","dy","chainItems","fromChain","newItems","frIds","sign1","sign2","hasOwnProperty","extra_bond","completeAction","rgroupEdit","newRg","attachEdit","fromArrowAddition","fromPlusAddition","updateLine","aam1","aam2","rotId","rotAll","neiHb","angle1","isNew","previous","itemId","rgroupatom","eraser","rgroupfragment","apoint","reactionarrow","reactionplus","reactionmap","reactionunmap","enhancedStereo","EnhancedStereoTool","fragAids","selectionAids","checkSelectionForFragment","enhancedStereoEdit","changeAtomsStereoAction","changeFragmentStereoAction","simpleobject","structObjects","Editor","_selection","_tool","historyStack","historyPtr","Subscription","PipelineSubscription","sgroupEdit","sdataEdit","change","selectionChange","DOMSubscription","subs","which","button","isMouseRight","nodeName","EditorTool","domEventSetup","toolMap","recoordinate","newTool","highlightTargets","setupEditor","oldProps","toolOpts","upperFirst","item1","item2","ignoreHistory","HISTORY_SIZE","on","handler","elementOffset","srcItems","fromDescriptorsAlign","StructEditor","editorRef","logRef","classList","removeEditorHandlers","Tag","onAttachEdit","ev","AppEditor","Dialog","formRef","activeElement","activeTextarea","exit","stopPropagation","fe","querySelector","buttons","role","onSubmit","onKeyDown","keyDown","tabIndex","onClick","OpenButton","FileReader","throughFileReader","ActiveXObject","fso","fd","OpenTextFile","content","ReadAll","Close","throughFileSystemObject","fileOpener","opener","setState","noop","onLoad","onError","btn","accept","onload","msClose","onerror","readAsText","actObj","status","pickBy","initial","freqAtoms","currentAtom","opened","updateVisibleTools","visibleTool","regExp","menuHeight","innerHeight","addFreqAtom","basicAtoms","toolInMenu","toolName","getElementById","dropdown","hiddenAncestor","findEl","getComputedStyle","overflow","shared","combineReducers","isEmpty","newState","correctTools","menuName","formState","form","store","ketcher","sh","finalState","Open","checked","structAcceptMimes","changeStructStr","onInput","changeFragment","formatMap","onOk","GenericInput","TextArea","CheckBox","Select","onSelect","enumSchema","FieldSet","cbOrIndex","isTypeValue","inputCtrl","ctrlMap","multiple","testVal","multipleSelectCtrl","singleSelectCtrl","input","isNumber","o","selectedIndex","fieldset","querySelectorAll","inp","Input","componentMap","style","nextProps","shallowCompare","FrozenInput","spellCheck","formulaRegexp","errorRegexp","formulaInputMarkdown","FormulaInput","cnd","Analyse","onAnalyse","onChangeRound","roundOff","roundName","changeRound","StructRender","tagRef","parsedStruct","renderStruct","Spin","isImage","URL","webkitURL","createObjectURL","imagoVersions","isFragment","onImage","changeImage","onRecognize","ver","rec","onChangeImago","partProps","useState","canPreviewImage","setCanPreviewImage","clearFile","useCallback","metPrefix","atomClass","Tabs","changeTab","tabs","other","tabPanel","componentProps","generics","metal","halogen","acyclic","carbo","alkynyl","alkyl","alkenyl","hetero","alkoxy","cyclic","aryl","cycloalkyl","cycloalkenyl","special","mapify","tree","cur","traverse","viewSchema","GenSet","GenGroup","gen","pk","child","GenericGroups","summary","beforeSpan","main","row","rowPartition","lanthanides","actinides","Header","TypeChoise","MainRow","refer","curEvents","colSpan","OutinerRow","AtomInfo","isInfo","numberStyle","fontSize","elemStyle","fontWeight","PeriodTable","onMouseEnter","onMouseLeave","genType","firstType","pl","ElementsTable","changeType","captions","callbacks","mapSelectionToProps","Form","onUpdate","propSchema","serialize","errs","getErrorsObj","instance","self","dataError","updateState","customValid","Provider","stateStore","Label","labelPos","Field","fieldOpts","formField","classNames","SelectOneOf","selectDesc","deserialize","customFormats","inst","rewrite","serializeRewrite","deserializeRewrite","serializeMap","deserializeMap","getInvalidMessage","ButtonList","multipl","oneOrMore","EDITOR_STYLES","Attach","normTmpl","structNormalization","initTmpl","onNameEdit","getScale","placeholder","initAttach","setTmplName","normStruct","cbb","rxnPlus","VirtualList","viewRef","offsetHeight","sync","forceUpdate","equal","resize","rowHeight","overscanCount","start","visibleRowCount","onScroll","handleScroll","SaveButton","Blob","saveAs","blob","fileSaver","onSave","SelectList","splitIndexes","isSplitIndex","GREEK_SIMBOLS","Alpha","alpha","Beta","beta","Gamma","gamma","tmplName","assert","greekRe","RegExp","greekify","sym","filterLibSelector","createSelector","warn","re","escapeRegExp","flow","_filter","libRowsSelector","COLS","RenderTmpl","xlinkHref","TemplateLib","onAttach","onFilter","onChangeGroup","g","VisibleView","renderRow","changeFilter","selectTmpl","changeGroup","editTmpl","indigoInfo","indigoVersion","href","rel","Logo","buildDate","BACKGROUND_COLOR","dark","light","MIEW_TX_TYPES","no","bright","colorer","blackAndWhite","bg","createMiewOptions","theme","autoPreset","editing","inversePanning","reps","textMode","selector","showBg","TXoptions","MiewComponent","miewOpts","viewer","container","miewContainer","run","sourceType","fileType","setOptions","cmlStruct","exportCML","onExportCML","position","ElementNumber","readOnly","currentLabel","setCurrentLabel","onLabelChangeCallback","newValue","atomValid","ch","chargeValid","attachmentPointsSchema","automapSchema","checkSchema","ErrorsCheck","moleculeErrorsTypes","getOptionName","checkState","onCheck","enhancedStereoSchema","labelEditSchema","IfThenSelect","rgids","rangeConv","saveSchema","Save","isRxn","onResetForm","ind","isCleanStruct","isStructInvalid","showStructWarningMessage","onTmplSave","saveUserTmpl","prevState","Accordion","childrenWithProps","Children","isActive","groupIsActive","onActive","isValidElement","cloneElement","MeasureInput","cust","meas","calcValue","handleChange","handleMeasChange","convValue","convertValue","onBlur","measureMap","px","cm","pt","inch","measureFrom","measureTo","commonFonts","cache","SystemFonts","availableFonts","setAvailableFonts","availableFontsPromises","fontName","FontFaceObserver","checkInSystem","results","SelectCheckbox","appOpts","initState","onOpenFile","newOpts","onReset","newSettings","settingsSchema","schemes","ComboBox","suggestsHidden","blur","updateInput","textContent","suggestList","suggestListStyles","autoComplete","SelectInput","inputSelect","Recognize","Rgroup","TemplateAttach","TemplatesLib","About","setContent","response","transfromImageUri","uri","plugins","gfm","transformImageUri","AttachPoints","Automap","Check","EnhancedStereo","LabelEdit","RgroupLogic","Settings","Sgroup","formSchema","AppModal","stateProps","dispatchProps","initProps","Modal","modals","icons","logo","emptyIcon","Icon","findIconByName","shortcutAliasMap","Escape","Delete","Mod","shortcutStr","ActionButton","menuRef","currentNode","isMenuOpened","findActiveMenuItem","menuItems","activeMenuItem","ActionMenu","menu","toolMargin","onOpen","hiddenEl","currentTarget","openHandle","showMenuOrButton","isOpened","isLeaf","subMenuItems","curr","renderActiveMenuItem","iconHeight","innerWidth","marginTop","isTmpl","AtomsList","isAtom","checkServer","Toolbar","middleware","createStore","applyMiddleware","onResize","throttle","ReactDOM","plusSchema","arrowSchema","definitions","URLSearchParams","request","headers","parametrizeUrl","Accept","json","indigoCall","defaultData","parVersion","upload_id","statusFn","metadata","mol_str","aromatize","dearomatize","calculateCip","calculate","api","ui","apiServer","buildInfo","buildNumber","getSmiles","saveSmiles","structformat","getMolfile","molString","addFragment","showMolfile","bondLength","addSchema","simpleObjectSchema","validateGraphF","_a","rootElRef"],"mappings":"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hBC,EAAG,CAAC,UAAW,WACfC,GAAI,CAAC,UAAW,WAChBC,GAAI,CAAC,UAAW,WAChBC,GAAI,CAAC,UAAW,WAChBC,GAAI,CAAC,UAAW,WAChBC,GAAI,CAAC,UAAW,WAChBC,GAAI,CAAC,UAAW,WAChBC,GAAI,CAAC,UAAW,WAChBC,GAAI,CAAC,UAAW,WAChBC,GAAI,CAAC,UAAW,WAChBC,GAAI,CAAC,UAAW,WAChBC,GAAI,CAAC,UAAW,WAChBC,GAAI,CAAC,UAAW,WAChBC,GAAI,CAAC,UAAW,WAChBnU,EAAG,CAAC,UAAW,WACfoU,GAAI,CAAC,UAAW,WAChBC,GAAI,CAAC,UAAW,WAChBC,GAAI,CAAC,UAAW,WAChBC,GAAI,CAAC,UAAW,WAChBC,GAAI,CAAC,UAAW,WAChBC,GAAI,CAAC,UAAW,WAChBC,GAAI,CAAC,UAAW,WAChBC,GAAI,CAAC,UAAW,WAChBC,GAAI,CAAC,UAAW,WAChBC,GAAI,CAAC,UAAW,WAChBC,GAAI,CAAC,UAAW,WAChBC,GAAI,CAAC,UAAW,WAChBC,GAAI,CAAC,UAAW,WAChBC,GAAI,CAAC,UAAW,WAChBC,GAAI,CAAC,UAAW,WAChBC,GAAI,CAAC,UAAW,WAChBC,GAAI,CAAC,UAAW,WAChBC,GAAI,CAAC,UAAW,WAChBC,GAAI,CAAC,UAAW,WAChBC,GAAI,CAAC,UAAW,WAChBC,EAAG,CAAC,UAAW,WACfC,GAAI,CAAC,UAAW,WAChBC,GAAI,CAAC,UAAW,WAChBC,GAAI,CAAC,UAAW,WAChBC,GAAI,CAAC,UAAW,WAChBC,GAAI,CAAC,UAAW,WAChBC,GAAI,CAAC,UAAW,WAChBC,GAAI,CAAC,UAAW,WAChBC,GAAI,CAAC,UAAW,WAChBC,GAAI,CAAC,UAAW,WAChBC,GAAI,CAAC,UAAW,WAChBC,GAAI,CAAC,UAAW,WAChBC,GAAI,CAAC,UAAW,WAChBC,GAAI,CAAC,UAAW,WAChBC,GAAI,CAAC,UAAW,WAChBC,GAAI,CAAC,UAAW,WAChBC,GAAI,CAAC,UAAW,WAChBC,GAAI,CAAC,UAAW,WAChBC,EAAG,CAAC,UAAW,WACfC,GAAI,CAAC,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","file":"static/js/main.872f535b.chunk.js","sourcesContent":["import React from 'react'\n//@ts-ignore\nimport Miew from 'miew'\nimport 'miew/dist/Miew.min.css'\n//@ts-ignore\nimport { Editor } from 'ketcher-react'\nimport 'ketcher-react/dist/index.css'\n;(global as any).Miew = Miew\n\nconst App = () => {\n return (\n
\n \n
\n )\n}\n\nexport default App\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nfunction pollDeferred(process, complete, timeGap, startTimeGap) {\n return new Promise((resolve, reject) => {\n function iterate() {\n process().then(\n val => {\n try {\n if (complete(val)) resolve(val)\n else setTimeout(iterate, timeGap)\n } catch (e) {\n reject(e)\n }\n },\n err => reject(err)\n )\n }\n setTimeout(iterate, startTimeGap || 0)\n })\n}\n\nfunction parametrizeUrl(url, params) {\n return url.replace(/:(\\w+)/g, (_, val) => params[val])\n}\n\nfunction api(base, defaultOptions) {\n const baseUrl = !base || /\\/$/.test(base) ? base : base + '/'\n\n const info = request('GET', 'info')\n .then(res => ({\n indigoVersion: res['indigo_version'],\n imagoVersions: res['imago_versions']\n }))\n .catch(() => {\n //TODO: add error handler\n })\n\n function request(method, url, data, headers) {\n if (data && method === 'GET') url = parametrizeUrl(url, data)\n return fetch(baseUrl + url, {\n method,\n headers: Object.assign(\n {\n Accept: 'application/json'\n },\n headers\n ),\n body: method !== 'GET' ? data : undefined,\n credentials: 'same-origin'\n })\n .then(response =>\n response\n .json()\n .then(res => (response.ok ? res : Promise.reject(res.error)))\n )\n .catch(err => {\n throw Error(err)\n })\n }\n\n function indigoCall(method, url, defaultData) {\n return function (data, options) {\n const body = Object.assign({}, defaultData, data)\n body.options = Object.assign(body.options || {}, defaultOptions, options)\n return info.then(() =>\n request(method, url, JSON.stringify(body), {\n 'Content-Type': 'application/json'\n })\n )\n }\n }\n\n async function recognize(blob, version) {\n // eslint-disable-line no-unused-vars\n const parVersion = version ? `?version=${version}` : ''\n const { upload_id } = await request(\n 'POST',\n `imago/uploads${parVersion}`,\n blob,\n {\n 'Content-Type': blob.type || 'application/octet-stream'\n }\n )\n const statusFn = () =>\n request('GET', 'imago/uploads/:id', {\n id: upload_id\n })\n const response = await pollDeferred(\n statusFn,\n res => {\n if (res.state === 'FAILURE') throw res\n return res.state === 'SUCCESS'\n },\n 500,\n 300\n )\n\n return { struct: response.metadata.mol_str }\n }\n\n return Object.assign(info, {\n convert: indigoCall('POST', 'indigo/convert'),\n layout: indigoCall('POST', 'indigo/layout'),\n clean: indigoCall('POST', 'indigo/clean'),\n aromatize: indigoCall('POST', 'indigo/aromatize'),\n dearomatize: indigoCall('POST', 'indigo/dearomatize'),\n calculateCip: indigoCall('POST', 'indigo/calculate_cip'),\n automap: indigoCall('POST', 'indigo/automap'),\n check: indigoCall('POST', 'indigo/check'),\n calculate: indigoCall('POST', 'indigo/calculate'),\n recognize: recognize\n })\n}\n\nexport default api\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nconst element = [\n null,\n {\n label: 'H', // 1\n period: 1,\n group: 1,\n title: 'Hydrogen',\n state: 'gas',\n origin: 'primordial',\n type: 'diatomic',\n atomic_mass: 1.00794\n },\n {\n label: 'He', // 2\n period: 1,\n group: 8,\n title: 'Helium',\n state: 'gas',\n origin: 'primordial',\n type: 'noble',\n atomic_mass: 4.0026022\n },\n {\n label: 'Li', // 3\n period: 2,\n group: 1,\n title: 'Lithium',\n state: 'solid',\n origin: 'primordial',\n type: 'alkali',\n atomic_mass: 6.94\n },\n {\n label: 'Be', // 4\n period: 2,\n group: 2,\n title: 'Beryllium',\n state: 'solid',\n origin: 'primordial',\n type: 'alkaline-earth',\n atomic_mass: 9.01218315\n },\n {\n label: 'B', // 5\n period: 2,\n group: 3,\n title: 'Boron',\n state: 'solid',\n origin: 'primordial',\n type: 'metalloid',\n atomic_mass: 10.81\n },\n {\n label: 'C', // 6\n period: 2,\n group: 4,\n title: 'Carbon',\n state: 'solid',\n origin: 'primordial',\n type: 'polyatomic',\n atomic_mass: 12.011\n },\n {\n label: 'N', // 7\n period: 2,\n group: 5,\n title: 'Nitrogen',\n state: 'gas',\n origin: 'primordial',\n type: 'diatomic',\n atomic_mass: 14.007\n },\n {\n label: 'O', // 8\n period: 2,\n group: 6,\n leftH: true,\n title: 'Oxygen',\n state: 'gas',\n origin: 'primordial',\n type: 'diatomic',\n atomic_mass: 15.999\n },\n {\n label: 'F', // 9\n period: 2,\n group: 7,\n leftH: true,\n title: 'Fluorine',\n state: 'gas',\n origin: 'primordial',\n type: 'diatomic',\n atomic_mass: 18.9984031636\n },\n {\n label: 'Ne', // 10\n period: 2,\n group: 8,\n title: 'Neon',\n state: 'gas',\n origin: 'primordial',\n type: 'noble',\n atomic_mass: 20.17976\n },\n {\n label: 'Na', // 11\n period: 3,\n group: 1,\n title: 'Sodium',\n state: 'solid',\n origin: 'primordial',\n type: 'alkali',\n atomic_mass: 22.989769282\n },\n {\n label: 'Mg', // 12\n period: 3,\n group: 2,\n title: 'Magnesium',\n state: 'solid',\n origin: 'primordial',\n type: 'alkaline-earth',\n atomic_mass: 24.305\n },\n {\n label: 'Al', // 13\n period: 3,\n group: 3,\n title: 'Aluminium',\n state: 'solid',\n origin: 'primordial',\n type: 'post-transition',\n atomic_mass: 26.98153857\n },\n {\n label: 'Si', // 14\n period: 3,\n group: 4,\n title: 'Silicon',\n state: 'solid',\n origin: 'primordial',\n type: 'metalloid',\n atomic_mass: 28.085\n },\n {\n label: 'P', // 15\n period: 3,\n group: 5,\n title: 'Phosphorus',\n state: 'solid',\n origin: 'primordial',\n type: 'polyatomic',\n atomic_mass: 30.9737619985\n },\n {\n label: 'S', // 16\n period: 3,\n group: 6,\n leftH: true,\n title: 'Sulfur',\n state: 'solid',\n origin: 'primordial',\n type: 'polyatomic',\n atomic_mass: 32.06\n },\n {\n label: 'Cl', // 17\n period: 3,\n group: 7,\n leftH: true,\n title: 'Chlorine',\n state: 'gas',\n origin: 'primordial',\n type: 'diatomic',\n atomic_mass: 35.45\n },\n {\n label: 'Ar', // 18\n period: 3,\n group: 8,\n title: 'Argon',\n state: 'gas',\n origin: 'primordial',\n type: 'noble',\n atomic_mass: 39.9481\n },\n {\n label: 'K', // 19\n period: 4,\n group: 1,\n title: 'Potassium',\n state: 'solid',\n origin: 'primordial',\n type: 'alkali',\n atomic_mass: 39.09831\n },\n {\n label: 'Ca', // 20\n period: 4,\n group: 2,\n title: 'Calcium',\n state: 'solid',\n origin: 'primordial',\n type: 'alkaline-earth',\n atomic_mass: 40.0784\n },\n {\n label: 'Sc', // 21\n period: 4,\n group: 3,\n title: 'Scandium',\n state: 'solid',\n origin: 'primordial',\n type: 'transition',\n atomic_mass: 44.9559085\n },\n {\n label: 'Ti', // 22\n period: 4,\n group: 4,\n title: 'Titanium',\n state: 'solid',\n origin: 'primordial',\n type: 'transition',\n atomic_mass: 47.8671\n },\n {\n label: 'V', // 23\n period: 4,\n group: 5,\n title: 'Vanadium',\n state: 'solid',\n origin: 'primordial',\n type: 'transition',\n atomic_mass: 50.94151\n },\n {\n label: 'Cr', // 24\n period: 4,\n group: 6,\n title: 'Chromium',\n state: 'solid',\n origin: 'primordial',\n type: 'transition',\n atomic_mass: 51.99616\n },\n {\n label: 'Mn', // 25\n period: 4,\n group: 7,\n title: 'Manganese',\n state: 'solid',\n origin: 'primordial',\n type: 'transition',\n atomic_mass: 54.9380443\n },\n {\n label: 'Fe', // 26\n period: 4,\n group: 8,\n title: 'Iron',\n state: 'solid',\n origin: 'primordial',\n type: 'transition',\n atomic_mass: 55.8452\n },\n {\n label: 'Co', // 27\n period: 4,\n group: 8,\n title: 'Cobalt',\n state: 'solid',\n origin: 'primordial',\n type: 'transition',\n atomic_mass: 58.9331944\n },\n {\n label: 'Ni', // 28\n period: 4,\n group: 8,\n title: 'Nickel',\n state: 'solid',\n origin: 'primordial',\n type: 'transition',\n atomic_mass: 58.69344\n },\n {\n label: 'Cu', // 29\n period: 4,\n group: 1,\n title: 'Copper',\n state: 'solid',\n origin: 'primordial',\n type: 'transition',\n atomic_mass: 63.5463\n },\n {\n label: 'Zn', // 30\n period: 4,\n group: 2,\n title: 'Zinc',\n state: 'solid',\n origin: 'primordial',\n type: 'transition',\n atomic_mass: 65.382\n },\n {\n label: 'Ga', // 31\n period: 4,\n group: 3,\n title: 'Gallium',\n state: 'solid',\n origin: 'primordial',\n type: 'post-transition',\n atomic_mass: 69.7231\n },\n {\n label: 'Ge', // 32\n period: 4,\n group: 4,\n title: 'Germanium',\n state: 'solid',\n origin: 'primordial',\n type: 'metalloid',\n atomic_mass: 72.6308\n },\n {\n label: 'As', // 33\n period: 4,\n group: 5,\n title: 'Arsenic',\n state: 'solid',\n origin: 'primordial',\n type: 'metalloid',\n atomic_mass: 74.9215956\n },\n {\n label: 'Se', // 34\n period: 4,\n group: 6,\n leftH: true,\n title: 'Selenium',\n state: 'solid',\n origin: 'primordial',\n type: 'polyatomic',\n atomic_mass: 78.9718\n },\n {\n label: 'Br', // 35\n period: 4,\n group: 7,\n leftH: true,\n title: 'Bromine',\n state: 'liquid',\n origin: 'primordial',\n type: 'diatomic',\n atomic_mass: 79.904\n },\n {\n label: 'Kr', // 36\n period: 4,\n group: 8,\n title: 'Krypton',\n state: 'gas',\n origin: 'primordial',\n type: 'noble',\n atomic_mass: 83.7982\n },\n {\n label: 'Rb', // 37\n period: 5,\n group: 1,\n title: 'Rubidium',\n state: 'solid',\n origin: 'primordial',\n type: 'alkali',\n atomic_mass: 85.46783\n },\n {\n label: 'Sr', // 38\n period: 5,\n group: 2,\n title: 'Strontium',\n state: 'solid',\n origin: 'primordial',\n type: 'alkaline-earth',\n atomic_mass: 87.621\n },\n {\n label: 'Y', // 39\n period: 5,\n group: 3,\n title: 'Yttrium',\n state: 'solid',\n origin: 'primordial',\n type: 'transition',\n atomic_mass: 88.905842\n },\n {\n label: 'Zr', // 40\n period: 5,\n group: 4,\n title: 'Zirconium',\n state: 'solid',\n origin: 'primordial',\n type: 'transition',\n atomic_mass: 91.2242\n },\n {\n label: 'Nb', // 41\n period: 5,\n group: 5,\n title: 'Niobium',\n state: 'solid',\n origin: 'primordial',\n type: 'transition',\n atomic_mass: 92.906372\n },\n {\n label: 'Mo', // 42\n period: 5,\n group: 6,\n title: 'Molybdenum',\n state: 'solid',\n origin: 'primordial',\n type: 'transition',\n atomic_mass: 95.951\n },\n {\n label: 'Tc', // 43\n period: 5,\n group: 7,\n title: 'Technetium',\n state: 'solid',\n origin: 'decay',\n type: 'transition',\n atomic_mass: 98\n },\n {\n label: 'Ru', // 44\n period: 5,\n group: 8,\n title: 'Ruthenium',\n state: 'solid',\n origin: 'primordial',\n type: 'transition',\n atomic_mass: 101.072\n },\n {\n label: 'Rh', // 45\n period: 5,\n group: 8,\n title: 'Rhodium',\n state: 'solid',\n origin: 'primordial',\n type: 'transition',\n atomic_mass: 102.905502\n },\n {\n label: 'Pd', // 46\n period: 5,\n group: 8,\n title: 'Palladium',\n state: 'solid',\n origin: 'primordial',\n type: 'transition',\n atomic_mass: 106.421\n },\n {\n label: 'Ag', // 47\n period: 5,\n group: 1,\n title: 'Silver',\n state: 'solid',\n origin: 'primordial',\n type: 'transition',\n atomic_mass: 107.86822\n },\n {\n label: 'Cd', // 48\n period: 5,\n group: 2,\n title: 'Cadmium',\n state: 'solid',\n origin: 'primordial',\n type: 'transition',\n atomic_mass: 112.4144\n },\n {\n label: 'In', // 49\n period: 5,\n group: 3,\n title: 'Indium',\n state: 'solid',\n origin: 'primordial',\n type: 'post-transition',\n atomic_mass: 114.8181\n },\n {\n label: 'Sn', // 50\n period: 5,\n group: 4,\n title: 'Tin',\n state: 'solid',\n origin: 'primordial',\n type: 'post-transition',\n atomic_mass: 118.7107\n },\n {\n label: 'Sb', // 51\n period: 5,\n group: 5,\n title: 'Antimony',\n state: 'solid',\n origin: 'primordial',\n type: 'metalloid',\n atomic_mass: 121.7601\n },\n {\n label: 'Te', // 52\n period: 5,\n group: 6,\n title: 'Tellurium',\n state: 'solid',\n origin: 'primordial',\n type: 'metalloid',\n atomic_mass: 127.603\n },\n {\n label: 'I', // 53\n period: 5,\n group: 7,\n leftH: true,\n title: 'Iodine',\n state: 'solid',\n origin: 'primordial',\n type: 'diatomic',\n atomic_mass: 126.904473\n },\n {\n label: 'Xe', // 54\n period: 5,\n group: 8,\n title: 'Xenon',\n state: 'gas',\n origin: 'primordial',\n type: 'noble',\n atomic_mass: 131.2936\n },\n {\n label: 'Cs', // 55\n period: 6,\n group: 1,\n title: 'Caesium',\n state: 'solid',\n origin: 'primordial',\n type: 'alkali',\n atomic_mass: 132.905451966\n },\n {\n label: 'Ba', // 56\n period: 6,\n group: 2,\n title: 'Barium',\n state: 'solid',\n origin: 'primordial',\n type: 'alkaline-earth',\n atomic_mass: 137.3277\n },\n {\n label: 'La', // 57\n period: 6,\n group: 3,\n title: 'Lanthanum',\n state: 'solid',\n origin: 'primordial',\n type: 'lanthanide',\n atomic_mass: 138.905477\n },\n {\n label: 'Ce', // 58\n period: 6,\n group: 3,\n title: 'Cerium',\n state: 'solid',\n origin: 'primordial',\n type: 'lanthanide',\n atomic_mass: 140.1161\n },\n {\n label: 'Pr', // 59\n period: 6,\n group: 3,\n title: 'Praseodymium',\n state: 'solid',\n origin: 'primordial',\n type: 'lanthanide',\n atomic_mass: 140.907662\n },\n {\n label: 'Nd', // 60\n period: 6,\n group: 3,\n title: 'Neodymium',\n state: 'solid',\n origin: 'primordial',\n type: 'lanthanide',\n atomic_mass: 144.2423\n },\n {\n label: 'Pm', // 61\n period: 6,\n group: 3,\n title: 'Promethium',\n state: 'solid',\n origin: 'decay',\n type: 'lanthanide',\n atomic_mass: 145\n },\n {\n label: 'Sm', // 62\n period: 6,\n group: 3,\n title: 'Samarium',\n state: 'solid',\n origin: 'primordial',\n type: 'lanthanide',\n atomic_mass: 150.362\n },\n {\n label: 'Eu', // 63\n period: 6,\n group: 3,\n title: 'Europium',\n state: 'solid',\n origin: 'primordial',\n type: 'lanthanide',\n atomic_mass: 151.9641\n },\n {\n label: 'Gd', // 64\n period: 6,\n group: 3,\n title: 'Gadolinium',\n state: 'solid',\n origin: 'primordial',\n type: 'lanthanide',\n atomic_mass: 157.253\n },\n {\n label: 'Tb', // 65\n period: 6,\n group: 3,\n title: 'Terbium',\n state: 'solid',\n origin: 'primordial',\n type: 'lanthanide',\n atomic_mass: 158.925352\n },\n {\n label: 'Dy', // 66\n period: 6,\n group: 3,\n title: 'Dysprosium',\n state: 'solid',\n origin: 'primordial',\n type: 'lanthanide',\n atomic_mass: 162.5001\n },\n {\n label: 'Ho', // 67\n period: 6,\n group: 3,\n title: 'Holmium',\n state: 'solid',\n origin: 'primordial',\n type: 'lanthanide',\n atomic_mass: 164.930332\n },\n {\n label: 'Er', // 68\n period: 6,\n group: 3,\n title: 'Erbium',\n state: 'solid',\n origin: 'primordial',\n type: 'lanthanide',\n atomic_mass: 167.2593\n },\n {\n label: 'Tm', // 69\n period: 6,\n group: 3,\n title: 'Thulium',\n state: 'solid',\n origin: 'primordial',\n type: 'lanthanide',\n atomic_mass: 168.934222\n },\n {\n label: 'Yb', // 70\n period: 6,\n group: 3,\n title: 'Ytterbium',\n state: 'solid',\n origin: 'primordial',\n type: 'lanthanide',\n atomic_mass: 173.0451\n },\n {\n label: 'Lu', // 71\n period: 6,\n group: 3,\n title: 'Lutetium',\n state: 'solid',\n origin: 'primordial',\n type: 'lanthanide',\n atomic_mass: 174.96681\n },\n {\n label: 'Hf', // 72\n period: 6,\n group: 4,\n title: 'Hafnium',\n state: 'solid',\n origin: 'primordial',\n type: 'transition',\n atomic_mass: 178.492\n },\n {\n label: 'Ta', // 73\n period: 6,\n group: 5,\n title: 'Tantalum',\n state: 'solid',\n origin: 'primordial',\n type: 'transition',\n atomic_mass: 180.947882\n },\n {\n label: 'W', // 74\n period: 6,\n group: 6,\n title: 'Tungsten',\n state: 'solid',\n origin: 'primordial',\n type: 'transition',\n atomic_mass: 183.841\n },\n {\n label: 'Re', // 75\n period: 6,\n group: 7,\n title: 'Rhenium',\n state: 'solid',\n origin: 'primordial',\n type: 'transition',\n atomic_mass: 186.2071\n },\n {\n label: 'Os', // 76\n period: 6,\n group: 8,\n title: 'Osmium',\n state: 'solid',\n origin: 'primordial',\n type: 'transition',\n atomic_mass: 190.233\n },\n {\n label: 'Ir', // 77\n period: 6,\n group: 8,\n title: 'Iridium',\n state: 'solid',\n origin: 'primordial',\n type: 'transition',\n atomic_mass: 192.2173\n },\n {\n label: 'Pt', // 78\n period: 6,\n group: 8,\n title: 'Platinum',\n state: 'solid',\n origin: 'primordial',\n type: 'transition',\n atomic_mass: 195.0849\n },\n {\n label: 'Au', // 79\n period: 6,\n group: 1,\n title: 'Gold',\n state: 'solid',\n origin: 'primordial',\n type: 'transition',\n atomic_mass: 196.9665695\n },\n {\n label: 'Hg', // 80\n period: 6,\n group: 2,\n title: 'Mercury',\n state: 'liquid',\n origin: 'primordial',\n type: 'transition',\n atomic_mass: 200.5923\n },\n {\n label: 'Tl', // 81\n period: 6,\n group: 3,\n title: 'Thallium',\n state: 'solid',\n origin: 'primordial',\n type: 'post-transition',\n atomic_mass: 204.38\n },\n {\n label: 'Pb', // 82\n period: 6,\n group: 4,\n title: 'Lead',\n state: 'solid',\n origin: 'primordial',\n type: 'post-transition',\n atomic_mass: 207.21\n },\n {\n label: 'Bi', // 83\n period: 6,\n group: 5,\n title: 'Bismuth',\n state: 'solid',\n origin: 'primordial',\n type: 'post-transition',\n atomic_mass: 208.980401\n },\n {\n label: 'Po', // 84\n period: 6,\n group: 6,\n title: 'Polonium',\n state: 'solid',\n origin: 'decay',\n type: 'post-transition',\n atomic_mass: 209\n },\n {\n label: 'At', // 85\n period: 6,\n group: 7,\n title: 'Astatine',\n state: 'solid',\n origin: 'decay',\n type: 'metalloid',\n atomic_mass: 210\n },\n {\n label: 'Rn', // 86\n period: 6,\n group: 8,\n title: 'Radon',\n state: 'gas',\n origin: 'decay',\n type: 'noble',\n atomic_mass: 222\n },\n {\n label: 'Fr', // 87\n period: 7,\n group: 1,\n title: 'Francium',\n state: 'solid',\n origin: 'decay',\n type: 'alkali',\n atomic_mass: 223\n },\n {\n label: 'Ra', // 88\n period: 7,\n group: 2,\n title: 'Radium',\n state: 'solid',\n origin: 'decay',\n type: 'alkaline-earth',\n atomic_mass: 226\n },\n {\n label: 'Ac', // 89\n period: 7,\n group: 3,\n title: 'Actinium',\n state: 'solid',\n origin: 'decay',\n type: 'actinide',\n atomic_mass: 227\n },\n {\n label: 'Th', // 90\n period: 7,\n group: 3,\n title: 'Thorium',\n state: 'solid',\n origin: 'primordial',\n type: 'actinide',\n atomic_mass: 232.03774\n },\n {\n label: 'Pa', // 91\n period: 7,\n group: 3,\n title: 'Protactinium',\n state: 'solid',\n origin: 'decay',\n type: 'actinide',\n atomic_mass: 231.035882\n },\n {\n label: 'U', // 92\n period: 7,\n group: 3,\n title: 'Uranium',\n state: 'solid',\n origin: 'primordial',\n type: 'actinide',\n atomic_mass: 238.028913\n },\n {\n label: 'Np', // 93\n period: 7,\n group: 3,\n title: 'Neptunium',\n state: 'solid',\n origin: 'decay',\n type: 'actinide',\n atomic_mass: 237\n },\n {\n label: 'Pu', // 94\n period: 7,\n group: 3,\n title: 'Plutonium',\n state: 'solid',\n origin: 'decay',\n type: 'actinide',\n atomic_mass: 244\n },\n {\n label: 'Am', // 95\n period: 7,\n group: 3,\n title: 'Americium',\n state: 'solid',\n origin: 'synthetic',\n type: 'actinide',\n atomic_mass: 243\n },\n {\n label: 'Cm', // 96\n period: 7,\n group: 3,\n title: 'Curium',\n state: 'solid',\n origin: 'synthetic',\n type: 'actinide',\n atomic_mass: 247\n },\n {\n label: 'Bk', // 97\n period: 7,\n group: 3,\n title: 'Berkelium',\n state: 'solid',\n origin: 'synthetic',\n type: 'actinide',\n atomic_mass: 247\n },\n {\n label: 'Cf', // 98\n period: 7,\n group: 3,\n title: 'Californium',\n state: 'solid',\n origin: 'synthetic',\n type: 'actinide',\n atomic_mass: 251\n },\n {\n label: 'Es', // 99\n period: 7,\n group: 3,\n title: 'Einsteinium',\n state: 'solid',\n origin: 'synthetic',\n type: 'actinide',\n atomic_mass: 252\n },\n {\n label: 'Fm', // 100\n period: 7,\n group: 3,\n title: 'Fermium',\n origin: 'synthetic',\n type: 'actinide',\n atomic_mass: 257\n },\n {\n label: 'Md', // 101\n period: 7,\n group: 3,\n title: 'Mendelevium',\n origin: 'synthetic',\n type: 'actinide',\n atomic_mass: 258\n },\n {\n label: 'No', // 102\n period: 7,\n group: 3,\n title: 'Nobelium',\n origin: 'synthetic',\n type: 'actinide',\n atomic_mass: 259\n },\n {\n label: 'Lr', // 103\n period: 7,\n group: 3,\n title: 'Lawrencium',\n origin: 'synthetic',\n type: 'actinide',\n atomic_mass: 266\n },\n {\n label: 'Rf', // 104\n period: 7,\n group: 4,\n title: 'Rutherfordium',\n origin: 'synthetic',\n type: 'transition',\n atomic_mass: 267\n },\n {\n label: 'Db', // 105\n period: 7,\n group: 5,\n title: 'Dubnium',\n origin: 'synthetic',\n type: 'transition',\n atomic_mass: 268\n },\n {\n label: 'Sg', // 106\n period: 7,\n group: 6,\n title: 'Seaborgium',\n origin: 'synthetic',\n type: 'transition',\n atomic_mass: 269\n },\n {\n label: 'Bh', // 107\n period: 7,\n group: 7,\n title: 'Bohrium',\n origin: 'synthetic',\n type: 'transition',\n atomic_mass: 270\n },\n {\n label: 'Hs', // 108\n period: 7,\n group: 8,\n title: 'Hassium',\n origin: 'synthetic',\n type: 'transition',\n atomic_mass: 269\n },\n {\n label: 'Mt', // 109\n period: 7,\n group: 8,\n title: 'Meitnerium',\n origin: 'synthetic',\n atomic_mass: 278\n },\n {\n label: 'Ds', // 110\n period: 7,\n group: 8,\n title: 'Darmstadtium',\n origin: 'synthetic',\n atomic_mass: 281\n },\n {\n label: 'Rg', // 111\n period: 7,\n group: 1,\n title: 'Roentgenium',\n origin: 'synthetic',\n atomic_mass: 282\n },\n {\n label: 'Cn', // 112\n period: 7,\n group: 2,\n title: 'Copernicium',\n origin: 'synthetic',\n type: 'transition',\n atomic_mass: 285\n },\n {\n label: 'Nh', // 113\n period: 7,\n group: 3,\n title: 'Nihonium',\n origin: 'synthetic',\n atomic_mass: 286\n },\n {\n label: 'Fl', // 114\n period: 7,\n group: 4,\n title: 'Flerovium',\n origin: 'synthetic',\n type: 'post-transition',\n atomic_mass: 289\n },\n {\n label: 'Mc', // 115\n period: 7,\n group: 5,\n title: 'Moscovium',\n origin: 'synthetic',\n atomic_mass: 289\n },\n {\n label: 'Lv', // 116\n period: 7,\n group: 6,\n title: 'Livermorium',\n origin: 'synthetic',\n atomic_mass: 293\n },\n {\n label: 'Ts', // 117\n period: 7,\n group: 7,\n title: 'Tennessine',\n origin: 'synthetic',\n atomic_mass: 294\n },\n {\n label: 'Og', // 118\n period: 7,\n group: 8,\n title: 'Oganesson',\n origin: 'synthetic',\n atomic_mass: 294\n }\n]\n\nelement.map = element.reduce((res, el, index) => {\n if (el) res[el.label] = index\n return res\n}, {})\n\nexport default element\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nfunction Vec2(x, y, z) {\n if (arguments.length === 0) {\n this.x = 0\n this.y = 0\n this.z = 0\n } else if (arguments.length === 1) {\n this.x = parseFloat(x.x || 0)\n this.y = parseFloat(x.y || 0)\n this.z = parseFloat(x.z || 0)\n } else if (arguments.length === 2) {\n this.x = parseFloat(x || 0)\n this.y = parseFloat(y || 0)\n this.z = 0\n } else if (arguments.length === 3) {\n this.x = parseFloat(x)\n this.y = parseFloat(y)\n this.z = parseFloat(z)\n } else {\n throw new Error('Vec2(): invalid arguments')\n }\n}\n\nVec2.ZERO = new Vec2(0, 0)\nVec2.UNIT = new Vec2(1, 1)\n\nVec2.prototype.length = function () {\n return Math.sqrt(this.x * this.x + this.y * this.y)\n}\n\nVec2.prototype.equals = function (v) {\n console.assert(!!v)\n return this.x === v.x && this.y === v.y\n}\n\nVec2.prototype.add = function (v) {\n console.assert(!!v)\n return new Vec2(this.x + v.x, this.y + v.y, this.z + v.z)\n}\n\nVec2.prototype.add_ = function (v) {\n // eslint-disable-line no-underscore-dangle\n console.assert(!!v)\n this.x += v.x\n this.y += v.y\n this.z += v.z\n}\n\nVec2.prototype.get_xy0 = function () {\n return new Vec2(this.x, this.y)\n}\n\nVec2.prototype.sub = function (v) {\n console.assert(!!v)\n return new Vec2(this.x - v.x, this.y - v.y, this.z - v.z)\n}\n\nVec2.prototype.scaled = function (s) {\n console.assert(s === 0 || !!s)\n return new Vec2(this.x * s, this.y * s, this.z * s)\n}\n\nVec2.prototype.negated = function () {\n return new Vec2(-this.x, -this.y, -this.z)\n}\n\nVec2.prototype.yComplement = function (y1) {\n y1 = y1 || 0\n return new Vec2(this.x, y1 - this.y, this.z)\n}\n\nVec2.prototype.addScaled = function (v, f) {\n console.assert(!!v)\n console.assert(f === 0 || !!f)\n\n return new Vec2(this.x + v.x * f, this.y + v.y * f, this.z + v.z * f)\n}\n\nVec2.prototype.normalized = function () {\n return this.scaled(1 / this.length())\n}\n\nVec2.prototype.normalize = function () {\n const l = this.length()\n\n if (l < 0.000001) return false\n\n this.x /= l\n this.y /= l\n\n return true\n}\n\nVec2.prototype.turnLeft = function () {\n return new Vec2(-this.y, this.x, this.z)\n}\n\nVec2.prototype.coordStr = function () {\n return this.x.toString() + ' , ' + this.y.toString()\n}\n\nVec2.prototype.toString = function () {\n return '(' + this.x.toFixed(2) + ',' + this.y.toFixed(2) + ')'\n}\n\nVec2.prototype.max = function (v) {\n console.assert(!!v)\n return new Vec2.max(this, v) // eslint-disable-line new-cap\n}\n\nVec2.prototype.min = function (v) {\n console.assert(!!v)\n return new Vec2.min(this, v) // eslint-disable-line new-cap\n}\n\nVec2.prototype.ceil = function () {\n return new Vec2(Math.ceil(this.x), Math.ceil(this.y), Math.ceil(this.z))\n}\n\nVec2.prototype.floor = function () {\n return new Vec2(Math.floor(this.x), Math.floor(this.y), Math.floor(this.z))\n}\n\nVec2.prototype.rotate = function (angle) {\n console.assert(angle === 0 || !!angle)\n\n const si = Math.sin(angle)\n const co = Math.cos(angle)\n\n return this.rotateSC(si, co)\n}\n\nVec2.prototype.rotateSC = function (si, co) {\n console.assert(si === 0 || !!si)\n console.assert(co === 0 || !!co)\n\n return new Vec2(this.x * co - this.y * si, this.x * si + this.y * co, this.z)\n}\n\nVec2.prototype.oxAngle = function () {\n return Math.atan2(this.y, this.x)\n}\n\nVec2.dist = function (a, b) {\n console.assert(!!a)\n console.assert(!!b)\n return Vec2.diff(a, b).length()\n}\n\nVec2.max = function (v1, v2) {\n console.assert(!!v1)\n console.assert(!!v2)\n return new Vec2(\n Math.max(v1.x, v2.x),\n Math.max(v1.y, v2.y),\n Math.max(v1.z, v2.z)\n )\n}\n\nVec2.min = function (v1, v2) {\n console.assert(!!v1)\n console.assert(!!v2)\n return new Vec2(\n Math.min(v1.x, v2.x),\n Math.min(v1.y, v2.y),\n Math.min(v1.z, v2.z)\n )\n}\n\nVec2.sum = function (v1, v2) {\n console.assert(!!v1)\n console.assert(!!v2)\n return new Vec2(v1.x + v2.x, v1.y + v2.y, v1.z + v2.z)\n}\n\nVec2.dot = function (v1, v2) {\n console.assert(!!v1)\n console.assert(!!v2)\n\n return v1.x * v2.x + v1.y * v2.y\n}\n\nVec2.cross = function (v1, v2) {\n console.assert(!!v1)\n console.assert(!!v2)\n\n return v1.x * v2.y - v1.y * v2.x\n}\n\nVec2.angle = function (v1, v2) {\n console.assert(!!v1)\n console.assert(!!v2)\n\n return Math.atan2(Vec2.cross(v1, v2), Vec2.dot(v1, v2))\n}\n\nVec2.diff = function (v1, v2) {\n console.assert(!!v1)\n console.assert(!!v2)\n\n return new Vec2(v1.x - v2.x, v1.y - v2.y, v1.z - v2.z)\n}\n\n// assume arguments v1, f1, v2, f2, v3, f3, etc.\n// where v[i] are vectors and f[i] are corresponding coefficients\nVec2.lc = function (...args) {\n let v = new Vec2()\n for (let i = 0; i < arguments.length / 2; ++i)\n v = v.addScaled(args[2 * i], args[2 * i + 1])\n return v\n}\n\n/**\n * @param v1 { Vec2 }\n * @param f1 { number }\n * @param v2 { Vec2 }\n * @param f2 { number }\n * @return { Vec2 }\n */\nVec2.lc2 = function (v1, f1, v2, f2) {\n console.assert(!!v1)\n console.assert(!!v2)\n console.assert(f1 === 0 || !!f1)\n console.assert(f2 === 0 || !!f2)\n\n return new Vec2(\n v1.x * f1 + v2.x * f2,\n v1.y * f1 + v2.y * f2,\n v1.z * f1 + v2.z * f2\n )\n}\n\nVec2.centre = function (v1, v2) {\n return new Vec2.lc2(v1, 0.5, v2, 0.5) // eslint-disable-line new-cap\n}\n\nexport default Vec2\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nclass Pool extends Map {\n constructor(arg) {\n super(arg)\n this._nextId = 0\n }\n\n add(item) {\n const id = this._nextId++\n super.set(id, item)\n return id\n }\n\n newId() {\n return this._nextId++\n }\n\n keyOf(item) {\n for (const [key, value] of this.entries()) {\n if (value === item) return key\n }\n\n return null\n }\n\n find(predicate) {\n for (const [key, value] of this.entries()) {\n if (predicate(key, value)) return key\n }\n\n return null\n }\n\n filter(predicate) {\n return new Pool(\n Array.from(this).filter(([key, value]) => predicate(key, value))\n )\n }\n}\n\nexport default Pool\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nclass Pile extends Set {\n // TODO: it's used only in dfs.js in one place in some strange way.\n // Should be removed after dfs.js refactoring\n find(predicate) {\n for (const item of this) {\n if (predicate(item)) return item\n }\n\n return null\n }\n\n equals(setB) {\n return this.isSuperset(setB) && setB.isSuperset(this)\n }\n\n isSuperset(subset) {\n for (const item of subset) {\n if (!this.has(item)) return false\n }\n\n return true\n }\n\n filter(filterFunc) {\n return new Pile(Array.from(this).filter(filterFunc))\n }\n\n union(setB) {\n const union = new Pile(this)\n\n for (const item of setB) union.add(item)\n\n return union\n }\n}\n\nexport default Pile\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport Vec2 from './vec2'\n\nfunction Box2Abs(...args) {\n if (args.length === 1 && 'min' in args[0] && 'max' in args[0]) {\n this.p0 = args[0].min\n this.p1 = args[0].max\n }\n\n if (args.length === 2) {\n this.p0 = args[0]\n this.p1 = args[1]\n } else if (args.length === 4) {\n this.p0 = new Vec2(args[0], args[1])\n this.p1 = new Vec2(args[2], args[3])\n } else if (args.length === 0) {\n this.p0 = new Vec2()\n this.p1 = new Vec2()\n } else {\n return new Error(\n 'Box2Abs constructor only accepts 4 numbers or 2 vectors or no args!'\n )\n }\n}\n\nBox2Abs.prototype.toString = function () {\n return this.p0.toString() + ' ' + this.p1.toString()\n}\n\nBox2Abs.prototype.clone = function () {\n return new Box2Abs(this.p0, this.p1)\n}\n\n/**\n * @param lp { Vec2 }\n * @param rb [ Vec2 }\n * @returns { Box2Abs }\n */\nBox2Abs.prototype.extend = function (lp, rb) {\n console.assert(!!lp)\n rb = rb || lp\n return new Box2Abs(this.p0.sub(lp), this.p1.add(rb))\n}\n\n/**\n * @param p { Vec2 }\n * @returns { Box2Abs }\n */\nBox2Abs.prototype.include = function (p) {\n console.assert(!!p)\n return new Box2Abs(this.p0.min(p), this.p1.max(p))\n}\n\n/**\n * @param p { Vec2 }\n * @param ext { number }\n * @returns { boolean }\n */\nBox2Abs.prototype.contains = function (p, ext = 0.0) {\n console.assert(!!p)\n return (\n p.x >= this.p0.x - ext &&\n p.x <= this.p1.x + ext &&\n p.y >= this.p0.y - ext &&\n p.y <= this.p1.y + ext\n )\n}\n\n/**\n * @param d { Vec2 }\n * @returns { Box2Abs }\n */\nBox2Abs.prototype.translate = function (d) {\n console.assert(!!d)\n return new Box2Abs(this.p0.add(d), this.p1.add(d))\n}\n\n/**\n * @param f { function(Vec2, object): Vec2 }\n * @param options { object }\n * @returns { Box2Abs }\n */\nBox2Abs.prototype.transform = function (f, options) {\n console.assert(!!f)\n return new Box2Abs(f(this.p0, options), f(this.p1, options))\n}\n\nBox2Abs.prototype.sz = function () {\n return this.p1.sub(this.p0)\n}\n\nBox2Abs.prototype.centre = function () {\n return Vec2.centre(this.p0, this.p1)\n}\n\nBox2Abs.prototype.pos = function () {\n return this.p0\n}\n\nBox2Abs.fromRelBox = function (relBox) {\n console.assert(!!relBox)\n return new Box2Abs(\n relBox.x,\n relBox.y,\n relBox.x + relBox.width,\n relBox.y + relBox.height\n )\n}\n\n/**\n * @param b1 { Box2Abs }\n * @param b2 { Box2Abs }\n * @returns { Box2Abs }\n */\nBox2Abs.union = function (b1, b2) {\n console.assert(!!b1)\n console.assert(!!b2)\n return new Box2Abs(Vec2.min(b1.p0, b2.p0), Vec2.max(b1.p1, b2.p1))\n}\n\n/**\n * @param a { Vec2 }\n * @param b { Vec2 }\n * @param c { Vec2 }\n * @param d { Vec2 }\n * @returns { boolean }\n */\nBox2Abs.segmentIntersection = function (a, b, c, d) {\n const dc = (a.x - c.x) * (b.y - c.y) - (a.y - c.y) * (b.x - c.x)\n const dd = (a.x - d.x) * (b.y - d.y) - (a.y - d.y) * (b.x - d.x)\n const da = (c.x - a.x) * (d.y - a.y) - (c.y - a.y) * (d.x - a.x)\n const db = (c.x - b.x) * (d.y - b.y) - (c.y - b.y) * (d.x - b.x)\n\n return dc * dd <= 0 && da * db <= 0\n}\n\nexport default Box2Abs\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport element from '../element'\n\nfunction AtomList(params) {\n console.assert(\n params && 'notList' in params && 'ids' in params,\n \"'notList' and 'ids' must be specified!\"\n )\n\n this.notList = params.notList /* boolean*/\n this.ids = params.ids /* Array of integers*/\n}\n\nAtomList.prototype.labelList = function () {\n var labels = []\n for (var i = 0; i < this.ids.length; ++i)\n labels.push(element[this.ids[i]].label)\n return labels\n}\n\nAtomList.prototype.label = function () {\n var label = '[' + this.labelList().join(',') + ']'\n if (this.notList) label = '!' + label\n return label\n}\n\nAtomList.prototype.equals = function (x) {\n return (\n this.notList == x.notList &&\n (this.ids || []).sort().toString() === (x.ids || []).sort().toString()\n )\n}\n\nexport default AtomList\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport Vec2 from '../../util/vec2'\nimport Pile from '../../util/pile'\nimport element from '../element'\nimport AtomList from './atomlist'\n\nfunction Atom(params) {\n // eslint-disable-line max-statements\n const def = Atom.attrGetDefault\n console.assert(params || 'label' in params, 'label must be specified!')\n\n this.label = params.label\n this.fragment = 'fragment' in params ? params.fragment : -1\n this.pseudo = params.pseudo || checkPseudo(params.label)\n\n ifDef(this, params, 'alias', def('alias'))\n ifDef(this, params, 'isotope', def('isotope'))\n ifDef(this, params, 'radical', def('radical'))\n ifDef(this, params, 'charge', def('charge'))\n ifDef(this, params, 'rglabel', def('rglabel')) // r-group index mask, i-th bit stands for i-th r-site\n ifDef(this, params, 'attpnt', def('attpnt')) // attachment point\n ifDef(this, params, 'explicitValence', def('explicitValence'))\n\n this.valence = 0\n this.implicitH = 0 // implicitH is not an attribute\n this.pp = params.pp ? new Vec2(params.pp) : new Vec2()\n\n // sgs should only be set when an atom is added to an s-group by an appropriate method,\n // or else a copied atom might think it belongs to a group, but the group be unaware of the atom\n // TODO: make a consistency check on atom/s-group assignments\n this.sgs = new Pile()\n\n // query\n ifDef(this, params, 'ringBondCount', def('ringBondCount'))\n ifDef(this, params, 'substitutionCount', def('substitutionCount'))\n ifDef(this, params, 'unsaturatedAtom', def('unsaturatedAtom'))\n ifDef(this, params, 'hCount', def('hCount'))\n\n // reaction\n ifDef(this, params, 'aam', def('aam'))\n ifDef(this, params, 'invRet', def('invRet'))\n ifDef(this, params, 'exactChangeFlag', def('exactChangeFlag'))\n ifDef(this, params, 'rxnFragmentType', -1) // this isn't really an attribute\n\n // stereo\n ifDef(this, params, 'stereoLabel', def('stereoLabel'))\n ifDef(this, params, 'stereoParity', def('stereoParity')) // {string | null} \"-\"\n\n this.atomList = params.atomList ? new AtomList(params.atomList) : null\n this.neighbors = [] // set of half-bonds having this atom as their origin\n this.badConn = false\n}\n\nAtom.getAttrHash = function (atom) {\n var attrs = {}\n for (var attr in Atom.attrlist) {\n if (typeof atom[attr] !== 'undefined') attrs[attr] = atom[attr]\n }\n return attrs\n}\n\nAtom.attrGetDefault = function (attr) {\n if (attr in Atom.attrlist) return Atom.attrlist[attr]\n return console.assert(false, 'Attribute unknown')\n}\n\nAtom.PATTERN = {\n RADICAL: {\n NONE: 0,\n SINGLET: 1,\n DOUPLET: 2,\n TRIPLET: 3\n },\n STEREO_PARITY: {\n NONE: 0,\n ODD: 1,\n EVEN: 2,\n EITHER: 3\n }\n}\n\nAtom.attrlist = {\n alias: null,\n label: 'C',\n pseudo: null,\n isotope: 0,\n radical: 0,\n charge: 0,\n explicitValence: -1,\n ringBondCount: 0,\n substitutionCount: 0,\n unsaturatedAtom: 0,\n hCount: 0,\n atomList: null,\n invRet: 0,\n exactChangeFlag: 0,\n rglabel: null,\n attpnt: null,\n aam: 0,\n // enhanced stereo\n stereoLabel: null,\n stereoParity: 0\n}\n\nexport function radicalElectrons(radical) {\n radical -= 0\n if (radical === Atom.PATTERN.RADICAL.NONE) return 0\n else if (radical === Atom.PATTERN.RADICAL.DOUPLET) return 1\n else if (\n radical === Atom.PATTERN.RADICAL.SINGLET ||\n radical === Atom.PATTERN.RADICAL.TRIPLET\n )\n return 2\n return console.assert(false, 'Unknown radical value')\n}\n\n/**\n * @param fidMap { Map }\n * @returns { Atom }\n */\nAtom.prototype.clone = function (fidMap) {\n const ret = new Atom(this)\n if (fidMap && fidMap.has(this.fragment))\n ret.fragment = fidMap.get(this.fragment)\n return ret\n}\n\nAtom.prototype.isQuery = function () {\n return (\n this.atomList !== null || this.label === 'A' || this.attpnt || this.hCount\n )\n}\n\nAtom.prototype.pureHydrogen = function () {\n return this.label === 'H' && this.isotope === 0\n}\n\nAtom.prototype.isPlainCarbon = function () {\n return (\n this.label === 'C' &&\n this.isotope === 0 &&\n this.radical === 0 &&\n this.charge === 0 &&\n this.explicitValence < 0 &&\n this.ringBondCount === 0 &&\n this.substitutionCount === 0 &&\n this.unsaturatedAtom === 0 &&\n this.hCount === 0 &&\n !this.atomList\n )\n}\n\nAtom.prototype.isPseudo = function () {\n // TODO: handle reaxys generics separately\n return !this.atomList && !this.rglabel && !element.map[this.label]\n}\n\nAtom.prototype.hasRxnProps = function () {\n return !!(\n this.invRet ||\n this.exactChangeFlag ||\n this.attpnt !== null ||\n this.aam\n )\n}\n\nAtom.prototype.calcValence = function (conn) {\n // eslint-disable-line max-statements\n var atom = this\n var charge = atom.charge\n var label = atom.label\n if (atom.isQuery()) {\n this.implicitH = 0\n return true\n }\n var elem = element.map[label]\n if (elem === undefined) {\n this.implicitH = 0\n return true\n }\n\n var groupno = element[elem].group\n var rad = radicalElectrons(atom.radical)\n\n var valence = conn\n var hyd = 0\n var absCharge = Math.abs(charge)\n\n if (groupno === 1) {\n if (\n label === 'H' ||\n label === 'Li' ||\n label === 'Na' ||\n label === 'K' ||\n label === 'Rb' ||\n label === 'Cs' ||\n label === 'Fr'\n ) {\n valence = 1\n hyd = 1 - rad - conn - absCharge\n }\n } else if (groupno === 2) {\n if (conn + rad + absCharge === 2 || conn + rad + absCharge === 0)\n valence = 2\n else hyd = -1\n } else if (groupno === 3) {\n if (label === 'B' || label === 'Al' || label === 'Ga' || label === 'In') {\n if (charge === -1) {\n valence = 4\n hyd = 4 - rad - conn\n } else {\n valence = 3\n hyd = 3 - rad - conn - absCharge\n }\n } else if (label === 'Tl') {\n if (charge === -1) {\n if (rad + conn <= 2) {\n valence = 2\n hyd = 2 - rad - conn\n } else {\n valence = 4\n hyd = 4 - rad - conn\n }\n } else if (charge === -2) {\n if (rad + conn <= 3) {\n valence = 3\n hyd = 3 - rad - conn\n } else {\n valence = 5\n hyd = 5 - rad - conn\n }\n } else if (rad + conn + absCharge <= 1) {\n valence = 1\n hyd = 1 - rad - conn - absCharge\n } else {\n valence = 3\n hyd = 3 - rad - conn - absCharge\n }\n }\n } else if (groupno === 4) {\n if (label === 'C' || label === 'Si' || label === 'Ge') {\n valence = 4\n hyd = 4 - rad - conn - absCharge\n } else if (label === 'Sn' || label === 'Pb') {\n if (conn + rad + absCharge <= 2) {\n valence = 2\n hyd = 2 - rad - conn - absCharge\n } else {\n valence = 4\n hyd = 4 - rad - conn - absCharge\n }\n }\n } else if (groupno === 5) {\n if (label === 'N' || label === 'P') {\n if (charge === 1) {\n valence = 4\n hyd = 4 - rad - conn\n } else if (charge === 2) {\n valence = 3\n hyd = 3 - rad - conn\n } else if (label === 'N' || rad + conn + absCharge <= 3) {\n valence = 3\n hyd = 3 - rad - conn - absCharge\n } else {\n // ELEM_P && rad + conn + absCharge > 3\n valence = 5\n hyd = 5 - rad - conn - absCharge\n }\n } else if (label === 'Bi' || label === 'Sb' || label === 'As') {\n if (charge === 1) {\n if (rad + conn <= 2 && label !== 'As') {\n valence = 2\n hyd = 2 - rad - conn\n } else {\n valence = 4\n hyd = 4 - rad - conn\n }\n } else if (charge === 2) {\n valence = 3\n hyd = 3 - rad - conn\n } else if (rad + conn <= 3) {\n valence = 3\n hyd = 3 - rad - conn - absCharge\n } else {\n valence = 5\n hyd = 5 - rad - conn - absCharge\n }\n }\n } else if (groupno === 6) {\n if (label === 'O') {\n if (charge >= 1) {\n valence = 3\n hyd = 3 - rad - conn\n } else {\n valence = 2\n hyd = 2 - rad - conn - absCharge\n }\n } else if (label === 'S' || label === 'Se' || label === 'Po') {\n if (charge === 1) {\n if (conn <= 3) {\n valence = 3\n hyd = 3 - rad - conn\n } else {\n valence = 5\n hyd = 5 - rad - conn\n }\n } else if (conn + rad + absCharge <= 2) {\n valence = 2\n hyd = 2 - rad - conn - absCharge\n } else if (conn + rad + absCharge <= 4) {\n // See examples in PubChem\n // [S] : CID 16684216\n // [Se]: CID 5242252\n // [Po]: no example, just following ISIS/Draw logic here\n valence = 4\n hyd = 4 - rad - conn - absCharge\n } else {\n // See examples in PubChem\n // [S] : CID 46937044\n // [Se]: CID 59786\n // [Po]: no example, just following ISIS/Draw logic here\n valence = 6\n hyd = 6 - rad - conn - absCharge\n }\n } else if (label === 'Te') {\n if (charge === -1) {\n if (conn <= 2) {\n valence = 2\n hyd = 2 - rad - conn - absCharge\n }\n } else if (charge === 0 || charge === 2) {\n if (conn <= 2) {\n valence = 2\n hyd = 2 - rad - conn - absCharge\n } else if (conn <= 4) {\n valence = 4\n hyd = 4 - rad - conn - absCharge\n } else if (charge === 0 && conn <= 6) {\n valence = 6\n hyd = 6 - rad - conn - absCharge\n } else {\n hyd = -1\n }\n }\n }\n } else if (groupno === 7) {\n if (label === 'F') {\n valence = 1\n hyd = 1 - rad - conn - absCharge\n } else if (\n label === 'Cl' ||\n label === 'Br' ||\n label === 'I' ||\n label === 'At'\n ) {\n if (charge === 1) {\n if (conn <= 2) {\n valence = 2\n hyd = 2 - rad - conn\n } else if (conn === 3 || conn === 5 || conn >= 7) {\n hyd = -1\n }\n } else if (charge === 0) {\n if (conn <= 1) {\n valence = 1\n hyd = 1 - rad - conn\n // While the halogens can have valence 3, they can not have\n // hydrogens in that case.\n } else if (conn === 2 || conn === 4 || conn === 6) {\n if (rad === 1) {\n valence = conn\n hyd = 0\n } else {\n hyd = -1 // will throw an error in the end\n }\n } else if (conn > 7) {\n hyd = -1 // will throw an error in the end\n }\n }\n }\n } else if (groupno === 8) {\n if (conn + rad + absCharge === 0) valence = 1\n else hyd = -1\n }\n\n this.valence = valence\n this.implicitH = hyd\n if (this.implicitH < 0) {\n this.valence = conn\n this.implicitH = 0\n this.badConn = true\n return false\n }\n return true\n}\n\nAtom.prototype.calcValenceMinusHyd = function (conn) {\n // eslint-disable-line max-statements\n var atom = this\n var charge = atom.charge\n var label = atom.label\n var elem = element.map[label]\n if (elem === null) console.assert('Element ' + label + ' unknown')\n if (elem < 0) {\n // query atom, skip\n this.implicitH = 0\n return null\n }\n\n var groupno = element[elem].group\n var rad = radicalElectrons(atom.radical)\n\n if (groupno === 3) {\n if (label === 'B' || label === 'Al' || label === 'Ga' || label === 'In') {\n if (charge === -1) {\n if (rad + conn <= 4) return rad + conn\n }\n }\n } else if (groupno === 5) {\n if (label === 'N' || label === 'P') {\n if (charge === 1) return rad + conn\n if (charge === 2) return rad + conn\n } else if (label === 'Sb' || label === 'Bi' || label === 'As') {\n if (charge === 1) return rad + conn\n else if (charge === 2) return rad + conn\n }\n } else if (groupno === 6) {\n if (label === 'O') {\n if (charge >= 1) return rad + conn\n } else if (label === 'S' || label === 'Se' || label === 'Po') {\n if (charge === 1) return rad + conn\n }\n } else if (groupno === 7) {\n if (label === 'Cl' || label === 'Br' || label === 'I' || label === 'At') {\n if (charge === 1) return rad + conn\n }\n }\n\n return rad + conn + Math.abs(charge)\n}\n\nfunction ifDef(dst, src, prop, def) {\n dst[prop] = !(typeof src[prop] === 'undefined') ? src[prop] : def\n}\n\nfunction checkPseudo(label) {\n return !element.map[label] &&\n label !== 'L' &&\n label !== 'L#' &&\n label !== 'R#'\n ? label\n : null\n}\n\nexport default Atom\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport Vec2 from '../../util/vec2'\n\nfunction Bond(params) {\n // eslint-disable-line max-statements\n console.assert(\n params && 'begin' in params && 'end' in params && 'type' in params,\n \"'begin', 'end' and 'type' properties must be specified!\"\n )\n\n this.begin = params.begin\n this.end = params.end\n this.type = params.type\n this.xxx = params.xxx || ''\n this.stereo = Bond.PATTERN.STEREO.NONE\n this.topology = Bond.PATTERN.TOPOLOGY.EITHER\n this.reactingCenterStatus = 0\n this.hb1 = null // half-bonds\n this.hb2 = null\n this.len = 0\n this.sb = 0\n this.sa = 0\n this.angle = 0\n\n if (params.stereo) this.stereo = params.stereo\n if (params.topology) this.topology = params.topology\n if (params.reactingCenterStatus)\n this.reactingCenterStatus = params.reactingCenterStatus\n\n this.center = new Vec2()\n}\n\nBond.PATTERN = {\n TYPE: {\n SINGLE: 1,\n DOUBLE: 2,\n TRIPLE: 3,\n AROMATIC: 4,\n SINGLE_OR_DOUBLE: 5,\n SINGLE_OR_AROMATIC: 6,\n DOUBLE_OR_AROMATIC: 7,\n ANY: 8\n },\n\n STEREO: {\n NONE: 0,\n UP: 1,\n EITHER: 4,\n DOWN: 6,\n CIS_TRANS: 3\n },\n\n // STEREO:\n // {\n // \tNONE: 0,\n // \tUP: 1,\n // \tEITHER: 2,\n // \tDOWN: 3\n // },\n\n TOPOLOGY: {\n EITHER: 0,\n RING: 1,\n CHAIN: 2\n },\n\n REACTING_CENTER: {\n NOT_CENTER: -1,\n UNMARKED: 0,\n CENTER: 1,\n UNCHANGED: 2,\n MADE_OR_BROKEN: 4,\n ORDER_CHANGED: 8,\n MADE_OR_BROKEN_AND_CHANGED: 12\n }\n}\n\nBond.attrlist = {\n type: Bond.PATTERN.TYPE.SINGLE,\n stereo: Bond.PATTERN.STEREO.NONE,\n topology: Bond.PATTERN.TOPOLOGY.EITHER,\n reactingCenterStatus: Bond.PATTERN.REACTING_CENTER.UNMARKED\n}\n\nBond.getAttrHash = function (bond) {\n var attrs = {}\n for (var attr in Bond.attrlist) {\n if (typeof bond[attr] !== 'undefined') attrs[attr] = bond[attr]\n }\n return attrs\n}\n\nBond.attrGetDefault = function (attr) {\n if (attr in Bond.attrlist) return Bond.attrlist[attr]\n return console.error('Attribute unknown')\n}\n\nBond.prototype.hasRxnProps = function () {\n return !!this.reactingCenterStatus\n}\n\nBond.prototype.getCenter = function (struct) {\n var p1 = struct.atoms.get(this.begin).pp\n var p2 = struct.atoms.get(this.end).pp\n return Vec2.lc2(p1, 0.5, p2, 0.5)\n}\n\nBond.prototype.getDir = function (struct) {\n var p1 = struct.atoms.get(this.begin).pp\n var p2 = struct.atoms.get(this.end).pp\n return p2.sub(p1).normalized()\n}\n\n/**\n * @param aidMap { Map }\n * @returns {Bond}\n */\nBond.prototype.clone = function (aidMap) {\n const cp = new Bond(this)\n if (aidMap) {\n cp.begin = aidMap.get(cp.begin)\n cp.end = aidMap.get(cp.end)\n }\n return cp\n}\n\nexport default Bond\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nfunction Fragment(flag = null) {\n this.stereoAtoms = []\n\n this.enhancedStereoFlag = flag\n}\nFragment.prototype = Object.create(null)\n\nFragment.prototype.clone = function (aidMap) {\n const fr = new Fragment(this.enhancedStereoFlag)\n fr.stereoAtoms = this.stereoAtoms.map(aid => aidMap.get(aid))\n return fr\n}\n\nFragment.STEREO_FLAG = {\n Mixed: 'Mixed',\n abs: 'ABS (Chiral)',\n and: 'AND Enantiomer',\n or: 'OR Enantiomer',\n null: null\n // todo: custom in the future\n}\n\n/**\n * @param { Struct } struct\n * @param { Array } stereoAids\n * @return { string | null } stereoFlag\n */\nfunction calcStereoFlag(struct, stereoAids) {\n if (!stereoAids || stereoAids.length === 0) return null\n const stereoLabel = struct.atoms.get(stereoAids[0]).stereoLabel // {string | null} \"-\"\n\n const hasAnotherLabel = stereoAids\n .map(aid => struct.atoms.get(aid))\n .some(atom => atom.stereoLabel !== stereoLabel)\n\n return hasAnotherLabel ? 'Mixed' : stereoLabel?.split('-')[0]\n}\n\nFragment.prototype.updateStereoFlag = function (struct, flag = false) {\n this.enhancedStereoFlag =\n flag !== false ? flag : calcStereoFlag(struct, this.stereoAtoms)\n return this.enhancedStereoFlag\n}\n\nFragment.prototype.updateStereoAtom = function (struct, aid, isAdd) {\n if (isAdd && !this.stereoAtoms.includes(aid)) this.stereoAtoms.push(aid)\n if (!isAdd) this.stereoAtoms = this.stereoAtoms.filter(item => item !== aid)\n\n this.enhancedStereoFlag = calcStereoFlag(struct, this.stereoAtoms)\n}\n\nexport default Fragment\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport Box2Abs from '../../util/box2abs'\nimport Vec2 from '../../util/vec2'\nimport Pile from '../../util/pile'\n\nimport Atom from './atom'\nimport Bond from './bond'\n\nfunction SGroup(type) {\n // eslint-disable-line max-statements\n console.assert(\n type && type in SGroup.TYPES,\n 'Invalid or unsupported s-group type'\n )\n\n this.type = type\n this.id = -1\n this.label = -1\n this.bracketBox = null\n this.bracketDir = new Vec2(1, 0)\n this.areas = []\n\n this.highlight = false\n this.highlighting = null\n this.selected = false\n this.selectionPlate = null\n\n this.atoms = []\n this.patoms = []\n this.bonds = []\n this.xBonds = []\n this.neiAtoms = []\n this.pp = null\n this.data = {\n mul: 1, // multiplication count for MUL group\n connectivity: 'ht', // head-to-head, head-to-tail or either-unknown\n name: '',\n subscript: 'n',\n\n // data s-group fields\n attached: false,\n absolute: true,\n showUnits: false,\n nCharsToDisplay: -1,\n tagChar: '',\n daspPos: 1,\n fieldType: 'F',\n fieldName: '',\n fieldValue: '',\n units: '',\n query: '',\n queryOp: ''\n }\n}\n\nSGroup.TYPES = {\n MUL: 1,\n SRU: 2,\n SUP: 3,\n DAT: 4,\n GEN: 5\n}\n\n// TODO: these methods should be overridden\n// and should only accept valid attributes for each S-group type.\n// The attributes should be accessed via these methods only and not directly through this.data.\n// stub\nSGroup.prototype.getAttr = function (attr) {\n return this.data[attr]\n}\n\n// TODO: should be group-specific\nSGroup.prototype.getAttrs = function () {\n var attrs = {}\n Object.keys(this.data).forEach(attr => {\n attrs[attr] = this.data[attr]\n })\n return attrs\n}\n\n// stub\nSGroup.prototype.setAttr = function (attr, value) {\n var oldValue = this.data[attr]\n this.data[attr] = value\n return oldValue\n}\n\n// stub\nSGroup.prototype.checkAttr = function (attr, value) {\n return this.data[attr] == value\n}\n\n// SGroup.numberArrayToString = function (numbers, map) {\n// \tvar str = util.stringPadded(numbers.length, 3);\n// \tfor (var i = 0; i < numbers.length; ++i) {\n// \t\tstr += ' ' + util.stringPadded(map[numbers[i]], 3);\n// \t}\n// \treturn str;\n// };\n\nSGroup.filterAtoms = function (atoms, map) {\n var newAtoms = []\n for (var i = 0; i < atoms.length; ++i) {\n var aid = atoms[i]\n if (typeof map[aid] !== 'number') newAtoms.push(aid)\n else if (map[aid] >= 0) newAtoms.push(map[aid])\n else newAtoms.push(-1)\n }\n return newAtoms\n}\n\nSGroup.removeNegative = function (atoms) {\n var newAtoms = []\n for (var j = 0; j < atoms.length; ++j) {\n if (atoms[j] >= 0) newAtoms.push(atoms[j])\n }\n return newAtoms\n}\n\nSGroup.filter = function (mol, sg, atomMap) {\n sg.atoms = SGroup.removeNegative(SGroup.filterAtoms(sg.atoms, atomMap))\n}\n\n/**\n * @param sgroup\n * @param aidMap < Map }\n * @returns { SGroup }\n */\nSGroup.clone = function (sgroup, aidMap) {\n const cp = new SGroup(sgroup.type)\n\n Object.keys(sgroup.data).forEach(field => {\n cp.data[field] = sgroup.data[field]\n })\n\n cp.atoms = sgroup.atoms.map(elem => aidMap.get(elem))\n cp.pp = sgroup.pp\n cp.bracketBox = sgroup.bracketBox\n cp.patoms = null\n cp.bonds = null\n cp.allAtoms = sgroup.allAtoms\n return cp\n}\n\nSGroup.addAtom = function (sgroup, aid) {\n sgroup.atoms.push(aid)\n}\n\nSGroup.removeAtom = function (sgroup, aid) {\n for (var i = 0; i < sgroup.atoms.length; ++i) {\n if (sgroup.atoms[i] === aid) {\n sgroup.atoms.splice(i, 1)\n return\n }\n }\n console.error('The atom is not found in the given s-group')\n}\n\n/**\n * @param inBonds\n * @param xBonds\n * @param mol\n * @param parentAtomSet { Pile }\n */\nSGroup.getCrossBonds = function (inBonds, xBonds, mol, parentAtomSet) {\n mol.bonds.forEach((bond, bid) => {\n if (parentAtomSet.has(bond.begin) && parentAtomSet.has(bond.end)) {\n if (inBonds !== null) inBonds.push(bid)\n } else if (parentAtomSet.has(bond.begin) || parentAtomSet.has(bond.end)) {\n if (xBonds !== null) xBonds.push(bid)\n }\n })\n}\n\nSGroup.bracketPos = function (sg, mol, xbonds) {\n // eslint-disable-line max-statements\n var atoms = sg.atoms\n if (!xbonds || xbonds.length !== 2) {\n sg.bracketDir = new Vec2(1, 0)\n } else {\n var p1 = mol.bonds.get(xbonds[0]).getCenter(mol)\n var p2 = mol.bonds.get(xbonds[1]).getCenter(mol)\n sg.bracketDir = Vec2.diff(p2, p1).normalized()\n }\n var d = sg.bracketDir\n\n var bb = null\n var contentBoxes = []\n atoms.forEach(aid => {\n var atom = mol.atoms.get(aid)\n var pos = new Vec2(atom.pp)\n var ext = new Vec2(0.05 * 3, 0.05 * 3)\n var bba = new Box2Abs(pos, pos).extend(ext, ext)\n contentBoxes.push(bba)\n })\n contentBoxes.forEach(bba => {\n var bbb = null\n ;[bba.p0.x, bba.p1.x].forEach(x => {\n ;[bba.p0.y, bba.p1.y].forEach(y => {\n var v = new Vec2(x, y)\n var p = new Vec2(Vec2.dot(v, d), Vec2.dot(v, d.rotateSC(1, 0)))\n bbb = bbb === null ? new Box2Abs(p, p) : bbb.include(p)\n })\n })\n bb = bb === null ? bbb : Box2Abs.union(bb, bbb)\n })\n var vext = new Vec2(0.2, 0.4)\n if (bb !== null) bb = bb.extend(vext, vext)\n sg.bracketBox = bb\n}\n\n/**\n * @param mol\n * @param xbonds\n * @param atomSet { Pile }\n * @param bb\n * @param d\n * @param n\n * @returns { Array }\n */\nSGroup.getBracketParameters = function (mol, xbonds, atomSet, bb, d, n) {\n // eslint-disable-line max-params\n function BracketParams(c, d, w, h) {\n this.c = c\n this.d = d\n this.n = d.rotateSC(1, 0)\n this.w = w\n this.h = h\n }\n var brackets = []\n if (xbonds.length < 2) {\n ;(function () {\n d = d || new Vec2(1, 0)\n n = n || d.rotateSC(1, 0)\n var bracketWidth = Math.min(0.25, bb.sz().x * 0.3)\n var cl = Vec2.lc2(d, bb.p0.x, n, 0.5 * (bb.p0.y + bb.p1.y))\n var cr = Vec2.lc2(d, bb.p1.x, n, 0.5 * (bb.p0.y + bb.p1.y))\n var bracketHeight = bb.sz().y\n\n brackets.push(\n new BracketParams(cl, d.negated(), bracketWidth, bracketHeight),\n new BracketParams(cr, d, bracketWidth, bracketHeight)\n )\n })()\n } else if (xbonds.length === 2) {\n ;(function () {\n // eslint-disable-line max-statements\n var b1 = mol.bonds.get(xbonds[0])\n var b2 = mol.bonds.get(xbonds[1])\n var cl0 = b1.getCenter(mol)\n var cr0 = b2.getCenter(mol)\n var dr = Vec2.diff(cr0, cl0).normalized()\n var dl = dr.negated()\n\n var bracketWidth = 0.25\n var bracketHeight = 1.5\n brackets.push(\n new BracketParams(\n cl0.addScaled(dl, 0),\n dl,\n bracketWidth,\n bracketHeight\n ),\n new BracketParams(cr0.addScaled(dr, 0), dr, bracketWidth, bracketHeight)\n )\n })()\n } else {\n ;(function () {\n for (var i = 0; i < xbonds.length; ++i) {\n var b = mol.bonds.get(xbonds[i])\n var c = b.getCenter(mol)\n var d = atomSet.has(b.begin) ? b.getDir(mol) : b.getDir(mol).negated()\n brackets.push(new BracketParams(c, d, 0.2, 1.0))\n }\n })()\n }\n return brackets\n}\n\nSGroup.getObjBBox = function (atoms, mol) {\n console.assert(atoms.length != 0, 'Atom list is empty')\n\n var a0 = mol.atoms.get(atoms[0]).pp\n var bb = new Box2Abs(a0, a0)\n for (var i = 1; i < atoms.length; ++i) {\n var aid = atoms[i]\n var atom = mol.atoms.get(aid)\n var p = atom.pp\n bb = bb.include(p)\n }\n return bb\n}\n\nSGroup.getAtoms = function (mol, sg) {\n /* shoud we use prototype? */\n if (!sg.allAtoms) return sg.atoms\n var atoms = []\n mol.atoms.forEach((atom, aid) => {\n atoms.push(aid)\n })\n return atoms\n}\n\nSGroup.getBonds = function (mol, sg) {\n var atoms = SGroup.getAtoms(mol, sg)\n var bonds = []\n mol.bonds.forEach((bond, bid) => {\n if (atoms.indexOf(bond.begin) >= 0 && atoms.indexOf(bond.end) >= 0)\n bonds.push(bid)\n })\n return bonds\n}\n\nSGroup.prepareMulForSaving = function (sgroup, mol) {\n // eslint-disable-line max-statements\n sgroup.atoms.sort((a, b) => a - b)\n sgroup.atomSet = new Pile(sgroup.atoms)\n sgroup.parentAtomSet = new Pile(sgroup.atomSet)\n var inBonds = []\n var xBonds = []\n\n mol.bonds.forEach((bond, bid) => {\n if (\n sgroup.parentAtomSet.has(bond.begin) &&\n sgroup.parentAtomSet.has(bond.end)\n )\n inBonds.push(bid)\n else if (\n sgroup.parentAtomSet.has(bond.begin) ||\n sgroup.parentAtomSet.has(bond.end)\n )\n xBonds.push(bid)\n })\n\n if (xBonds.length !== 0 && xBonds.length !== 2)\n throw Error('Unsupported cross-bonds number')\n\n var xAtom1 = -1\n var xAtom2 = -1\n var crossBond = null\n if (xBonds.length === 2) {\n var bond1 = mol.bonds.get(xBonds[0])\n xAtom1 = sgroup.parentAtomSet.has(bond1.begin) ? bond1.begin : bond1.end\n\n var bond2 = mol.bonds.get(xBonds[1])\n xAtom2 = sgroup.parentAtomSet.has(bond2.begin) ? bond2.begin : bond2.end\n crossBond = bond2\n }\n\n var amap = null\n var tailAtom = xAtom2\n\n var newAtoms = []\n for (var j = 0; j < sgroup.data.mul - 1; j++) {\n amap = {}\n sgroup.atoms.forEach(aid => {\n var atom = mol.atoms.get(aid)\n var aid2 = mol.atoms.add(new Atom(atom))\n newAtoms.push(aid2)\n sgroup.atomSet.add(aid2)\n amap[aid] = aid2\n })\n inBonds.forEach(bid => {\n var bond = mol.bonds.get(bid)\n var newBond = new Bond(bond)\n newBond.begin = amap[newBond.begin]\n newBond.end = amap[newBond.end]\n mol.bonds.add(newBond)\n })\n if (crossBond !== null) {\n var newCrossBond = new Bond(crossBond)\n newCrossBond.begin = tailAtom\n newCrossBond.end = amap[xAtom1]\n mol.bonds.add(newCrossBond)\n tailAtom = amap[xAtom2]\n }\n }\n if (tailAtom >= 0) {\n var xBond2 = mol.bonds.get(xBonds[1])\n if (xBond2.begin === xAtom2) xBond2.begin = tailAtom\n else xBond2.end = tailAtom\n }\n sgroup.bonds = xBonds\n\n newAtoms.forEach(aid => {\n mol.sGroupForest\n .getPathToRoot(sgroup.id)\n .reverse()\n .forEach(sgid => {\n mol.atomAddToSGroup(sgid, aid)\n })\n })\n}\n\nSGroup.getMassCentre = function (mol, atoms) {\n var c = new Vec2() // mass centre\n for (var i = 0; i < atoms.length; ++i)\n c = c.addScaled(mol.atoms.get(atoms[i]).pp, 1.0 / atoms.length)\n return c\n}\n\nexport default SGroup\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport Pile from '../../util/pile'\n\nfunction RGroup(logic) {\n logic = logic || {}\n this.frags = new Pile()\n this.resth = logic.resth || false\n this.range = logic.range || ''\n this.ifthen = logic.ifthen || 0\n}\n\nRGroup.prototype.getAttrs = function () {\n return {\n resth: this.resth,\n range: this.range,\n ifthen: this.ifthen\n }\n}\n\n/**\n * @param rgroups { Pool }\n * @param frid { number }\n */\nRGroup.findRGroupByFragment = function (rgroups, frid) {\n return rgroups.find((rgid, rgroup) => rgroup.frags.has(frid))\n}\n\n/**\n * @param fidMap { Map }\n * @returns { RGroup }\n */\nRGroup.prototype.clone = function (fidMap) {\n const ret = new RGroup(this)\n this.frags.forEach(fid => {\n ret.frags.add(fidMap ? fidMap.get(fid) : fid)\n })\n return ret\n}\n\nexport default RGroup\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport Pile from '../../util/pile'\nimport SGroup from './sgroup'\n\nfunction SGroupForest() {\n this.parent = new Map() // child id -> parent id\n this.children = new Map() // parent id -> list of child ids\n this.children.set(-1, []) // extra root node\n this.atomSets = new Map()\n}\n\n// returns an array or s-group ids in the order of breadth-first search\nSGroupForest.prototype.getSGroupsBFS = function () {\n const order = []\n let id = -1\n let queue = Array.from(this.children.get(-1))\n while (queue.length > 0) {\n id = queue.shift()\n queue = queue.concat(this.children.get(id))\n order.push(id)\n }\n return order\n}\n\nexport function checkOverlapping(struct, atoms) {\n const sgroups = atoms.reduce((res, aid) => {\n const atom = struct.atoms.get(aid)\n return res.union(atom.sgs)\n }, new Pile())\n\n return Array.from(sgroups).some(sid => {\n const sg = struct.sgroups.get(sid)\n if (sg.type === 'DAT') return false\n const sgAtoms = SGroup.getAtoms(struct, sg)\n\n return sgAtoms.length < atoms.length\n ? sgAtoms.findIndex(aid => atoms.indexOf(aid) === -1) >= 0\n : atoms.findIndex(aid => sgAtoms.indexOf(aid) === -1) >= 0\n })\n}\n\nSGroupForest.prototype.getAtomSetRelations = function (newId, atoms) {\n // find the lowest superset in the hierarchy\n const isStrictSuperset = new Map()\n const isSubset = new Map()\n\n this.atomSets.delete(newId)\n\n this.atomSets.forEach((atomSet, id) => {\n isSubset.set(id, atomSet.isSuperset(atoms))\n isStrictSuperset.set(\n id,\n atoms.isSuperset(atomSet) && !atomSet.equals(atoms)\n )\n })\n\n const parents = Array.from(this.atomSets.keys()).filter(sgid => {\n if (!isSubset.get(sgid)) return false\n return (\n this.children.get(sgid).findIndex(childId => isSubset.get(childId)) < 0\n )\n })\n\n const children = Array.from(this.atomSets.keys()).filter(\n id => isStrictSuperset.get(id) && !isStrictSuperset.get(this.parent.get(id))\n )\n\n return {\n children,\n parent: parents.length === 0 ? -1 : parents[0]\n }\n}\n\nSGroupForest.prototype.getPathToRoot = function (sgid) {\n const path = []\n for (let id = sgid; id >= 0; id = this.parent.get(id)) {\n console.assert(path.indexOf(id) < 0, 'SGroupForest: loop detected')\n path.push(id)\n }\n return path\n}\n\nSGroupForest.prototype.insert = function (\n { id, atoms },\n parent /* int, optional */,\n children /* [int], optional */\n) {\n console.assert(!this.parent.has(id), 'sgid already present in the forest')\n console.assert(!this.children.has(id), 'sgid already present in the forest')\n\n if (!parent || !children) {\n // if these are not provided, deduce automatically\n const guess = this.getAtomSetRelations(id, new Pile(atoms))\n parent = guess.parent\n children = guess.children\n }\n\n // TODO: make children Map instead of Map?\n children.forEach(childId => {\n // reset parent links\n var childs = this.children.get(this.parent.get(childId))\n var i = childs.indexOf(childId)\n console.assert(\n i >= 0 && childs.indexOf(childId, i + 1) < 0,\n 'Assertion failed'\n ) // one element\n childs.splice(i, 1)\n this.parent.set(childId, id)\n })\n this.children.set(id, children)\n this.parent.set(id, parent)\n this.children.get(parent).push(id)\n this.atomSets.set(id, new Pile(atoms))\n\n return { parent, children }\n}\n\nSGroupForest.prototype.remove = function (id) {\n console.assert(this.parent.has(id), 'sgid is not in the forest')\n console.assert(this.children.has(id), 'sgid is not in the forest')\n\n const parentId = this.parent.get(id)\n this.children.get(id).forEach(childId => {\n // reset parent links\n this.parent.set(childId, parentId)\n this.children.get(parentId).push(childId)\n })\n\n const childs = this.children.get(parentId)\n const i = childs.indexOf(id)\n console.assert(i >= 0 && childs.indexOf(id, i + 1) < 0, 'Assertion failed') // one element\n childs.splice(i, 1)\n\n this.children.delete(id)\n this.parent.delete(id)\n this.atomSets.delete(id)\n}\n\nexport default SGroupForest\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport Pool from '../../util/pool'\nimport Pile from '../../util/pile'\nimport Vec2 from '../../util/vec2'\nimport Box2Abs from '../../util/box2abs'\n\nimport element from '../element'\n\nimport Atom, { radicalElectrons } from './atom'\nimport AtomList from './atomlist'\nimport Bond from './bond'\nimport Fragment from './fragment'\nimport SGroup from './sgroup'\nimport RGroup from './rgroup'\nimport SGroupForest from './sgforest'\n\nfunction Struct() {\n this.atoms = new Pool()\n this.bonds = new Pool()\n this.sgroups = new Pool()\n this.halfBonds = new Pool()\n this.loops = new Pool()\n this.isReaction = false\n this.rxnArrows = new Pool()\n this.rxnPluses = new Pool()\n this.frags = new Pool()\n this.rgroups = new Pool()\n this.name = ''\n this.sGroupForest = new SGroupForest()\n this.simpleObjects = new Pool()\n}\n\nStruct.prototype.hasRxnProps = function () {\n return (\n this.atoms.find((aid, atom) => atom.hasRxnProps()) ||\n this.bonds.find((bid, bond) => bond.hasRxnProps())\n )\n}\n\nStruct.prototype.hasRxnArrow = function () {\n return this.rxnArrows.size > 0\n}\n\nStruct.prototype.isBlank = function () {\n return (\n this.atoms.size === 0 &&\n this.rxnArrows.size === 0 &&\n this.rxnPluses.size === 0 &&\n this.simpleObjects.size === 0\n )\n}\n\n/**\n * @param atomSet { Pile? }\n * @param bondSet { Pile? }\n * @param dropRxnSymbols { boolean? }\n * @param aidMap { Map? }\n * @param simpleObjectsSet { Pile? }\n * @returns { Struct }\n */\nStruct.prototype.clone = function (\n atomSet,\n bondSet,\n dropRxnSymbols,\n aidMap,\n simpleObjectsSet\n) {\n return this.mergeInto(\n new Struct(),\n atomSet,\n bondSet,\n dropRxnSymbols,\n false,\n aidMap,\n simpleObjectsSet\n )\n}\n\nStruct.prototype.getScaffold = function () {\n const atomSet = new Pile()\n this.atoms.forEach((atom, aid) => {\n atomSet.add(aid)\n })\n\n this.rgroups.forEach(rg => {\n rg.frags.forEach((fnum, fid) => {\n this.atoms.forEach((atom, aid) => {\n if (atom.fragment === fid) atomSet.delete(aid)\n })\n })\n })\n\n return this.clone(atomSet)\n}\n\nStruct.prototype.getFragmentIds = function (fid) {\n const atomSet = new Pile()\n\n this.atoms.forEach((atom, aid) => {\n if (atom.fragment === fid) atomSet.add(aid)\n })\n\n return atomSet\n}\n\nStruct.prototype.getFragment = function (fid) {\n return this.clone(this.getFragmentIds(fid))\n}\n\n/**\n * @param cp { Struct } - container for merging\n * @param atomSet { Pile? }\n * @param bondSet { Pile? }\n * @param dropRxnSymbols { boolean? }\n * @param keepAllRGroups { boolean? }\n * @param aidMap { Map? }\n * @param simpleObjectsSet { Pile? }\n * @returns { Struct }\n */\nStruct.prototype.mergeInto = function (\n cp,\n atomSet,\n bondSet,\n dropRxnSymbols,\n keepAllRGroups,\n aidMap,\n simpleObjectsSet\n) {\n // eslint-disable-line max-params, max-statements\n atomSet = atomSet || new Pile(this.atoms.keys())\n bondSet = bondSet || new Pile(this.bonds.keys())\n simpleObjectsSet = simpleObjectsSet || new Pile(this.simpleObjects.keys())\n aidMap = aidMap || new Map()\n\n bondSet = bondSet.filter(bid => {\n const bond = this.bonds.get(bid)\n return atomSet.has(bond.begin) && atomSet.has(bond.end)\n })\n\n const fidMask = new Pile()\n this.atoms.forEach((atom, aid) => {\n if (atomSet.has(aid)) fidMask.add(atom.fragment)\n })\n\n const fidMap = new Map()\n this.frags.forEach((frag, fid) => {\n if (fidMask.has(fid)) fidMap.set(fid, cp.frags.add(null))\n })\n\n const rgroupsIds = []\n this.rgroups.forEach((rgroup, rgid) => {\n let keepGroup = keepAllRGroups\n if (!keepGroup) {\n rgroup.frags.forEach((fnum, fid) => {\n rgroupsIds.push(fid)\n if (fidMask.has(fid)) keepGroup = true\n })\n\n if (!keepGroup) return\n }\n\n const rg = cp.rgroups.get(rgid)\n if (rg) {\n rgroup.frags.forEach((fnum, fid) => {\n rgroupsIds.push(fid)\n if (fidMask.has(fid)) rg.frags.add(fidMap.get(fid))\n })\n } else {\n cp.rgroups.set(rgid, rgroup.clone(fidMap))\n }\n })\n\n // atoms in not RGroup\n this.atoms.forEach((atom, aid) => {\n if (atomSet.has(aid) && rgroupsIds.indexOf(atom.fragment) === -1)\n aidMap.set(aid, cp.atoms.add(atom.clone(fidMap)))\n })\n // atoms in RGroup\n this.atoms.forEach((atom, aid) => {\n if (atomSet.has(aid) && rgroupsIds.indexOf(atom.fragment) !== -1)\n aidMap.set(aid, cp.atoms.add(atom.clone(fidMap)))\n })\n\n fidMap.forEach((newfid, oldfid) => {\n const frags = JSON.parse(JSON.stringify(this.frags.get(oldfid)))\n\n if (frags && Object.keys(frags).length !== 0) {\n cp.frags.set(newfid, this.frags.get(oldfid).clone(aidMap)) // clone Fragments\n }\n })\n\n const bidMap = new Map()\n this.bonds.forEach((bond, bid) => {\n if (bondSet.has(bid)) bidMap.set(bid, cp.bonds.add(bond.clone(aidMap)))\n })\n\n this.sgroups.forEach(sg => {\n if (sg.atoms.some(aid => !atomSet.has(aid))) return\n\n sg = SGroup.clone(sg, aidMap)\n const id = cp.sgroups.add(sg)\n sg.id = id\n\n sg.atoms.forEach(aid => {\n cp.atoms.get(aid).sgs.add(id)\n })\n\n if (sg.type === 'DAT') cp.sGroupForest.insert(sg, -1, [])\n else cp.sGroupForest.insert(sg)\n })\n\n simpleObjectsSet.forEach(soid => {\n cp.simpleObjects.add(this.simpleObjects.get(soid).clone())\n })\n\n if (!dropRxnSymbols) {\n cp.isReaction = this.isReaction\n this.rxnArrows.forEach(item => {\n cp.rxnArrows.add(item.clone())\n })\n this.rxnPluses.forEach(item => {\n cp.rxnPluses.add(item.clone())\n })\n }\n\n return cp\n}\n\n/**\n * @param begin { number }\n * @param end { number }\n * @return { number|null }\n */\nStruct.prototype.findBondId = function (begin, end) {\n return this.bonds.find(\n (bid, bond) =>\n (bond.begin === begin && bond.end === end) ||\n (bond.begin === end && bond.end === begin)\n )\n}\n\n/**\n * @param begin [ number }\n * @param end { number }\n * @param bid { number }\n * @constructor\n */\nfunction HalfBond(begin, end, bid) {\n console.assert(arguments.length === 3, 'Invalid parameter number!')\n\n this.begin = begin\n this.end = end\n this.bid = bid\n\n // rendering properties\n this.dir = new Vec2() // direction\n this.norm = new Vec2() // left normal\n this.ang = 0 // angle to (1,0), used for sorting the bonds\n this.p = new Vec2() // corrected origin position\n this.loop = -1 // left loop id if the half-bond is in a loop, otherwise -1\n this.contra = -1 // the half bond contrary to this one\n this.next = -1 // the half-bond next ot this one in CCW order\n this.leftSin = 0\n this.leftCos = 0\n this.leftNeighbor = 0\n this.rightSin = 0\n this.rightCos = 0\n this.rightNeighbor = 0\n}\n\nStruct.prototype.initNeighbors = function () {\n this.atoms.forEach(atom => {\n atom.neighbors = []\n })\n\n this.bonds.forEach(bond => {\n const a1 = this.atoms.get(bond.begin)\n const a2 = this.atoms.get(bond.end)\n a1.neighbors.push(bond.hb1)\n a2.neighbors.push(bond.hb2)\n })\n}\n\nStruct.prototype.bondInitHalfBonds = function (bid, bond) {\n bond = bond || this.bonds.get(bid)\n bond.hb1 = 2 * bid\n bond.hb2 = 2 * bid + 1 // eslint-disable-line no-mixed-operators\n this.halfBonds.set(bond.hb1, new HalfBond(bond.begin, bond.end, bid))\n this.halfBonds.set(bond.hb2, new HalfBond(bond.end, bond.begin, bid))\n const hb1 = this.halfBonds.get(bond.hb1)\n const hb2 = this.halfBonds.get(bond.hb2)\n hb1.contra = bond.hb2\n hb2.contra = bond.hb1\n}\n\nStruct.prototype.halfBondUpdate = function (hbid) {\n const hb = this.halfBonds.get(hbid)\n const p1 = this.atoms.get(hb.begin).pp\n const p2 = this.atoms.get(hb.end).pp\n const d = Vec2.diff(p2, p1).normalized()\n hb.dir = Vec2.dist(p2, p1) > 1e-4 ? d : new Vec2(1, 0)\n hb.norm = hb.dir.turnLeft()\n hb.ang = hb.dir.oxAngle()\n if (hb.loop < 0) hb.loop = -1\n}\n\nStruct.prototype.initHalfBonds = function () {\n this.halfBonds.clear()\n this.bonds.forEach((bond, bid) => {\n this.bondInitHalfBonds(bid, bond)\n })\n}\n\nStruct.prototype.setHbNext = function (hbid, next) {\n this.halfBonds.get(this.halfBonds.get(hbid).contra).next = next\n}\n\nStruct.prototype.halfBondSetAngle = function (hbid, left) {\n const hb = this.halfBonds.get(hbid)\n const hbl = this.halfBonds.get(left)\n\n hbl.rightCos = Vec2.dot(hbl.dir, hb.dir)\n hb.leftCos = Vec2.dot(hbl.dir, hb.dir)\n\n hbl.rightSin = Vec2.cross(hbl.dir, hb.dir)\n hb.leftSin = Vec2.cross(hbl.dir, hb.dir)\n\n hb.leftNeighbor = left\n hbl.rightNeighbor = hbid\n}\n\nStruct.prototype.atomAddNeighbor = function (hbid) {\n const hb = this.halfBonds.get(hbid)\n const atom = this.atoms.get(hb.begin)\n\n for (var i = 0; i < atom.neighbors.length; ++i) {\n if (this.halfBonds.get(atom.neighbors[i]).ang > hb.ang) break\n }\n atom.neighbors.splice(i, 0, hbid)\n var ir = atom.neighbors[(i + 1) % atom.neighbors.length]\n var il =\n atom.neighbors[(i + atom.neighbors.length - 1) % atom.neighbors.length]\n this.setHbNext(il, hbid)\n this.setHbNext(hbid, ir)\n this.halfBondSetAngle(hbid, il)\n this.halfBondSetAngle(ir, hbid)\n}\n\nStruct.prototype.atomSortNeighbors = function (aid) {\n const atom = this.atoms.get(aid)\n const halfBonds = this.halfBonds\n\n atom.neighbors\n .sort((nei, nei2) => halfBonds.get(nei).ang - halfBonds.get(nei2).ang)\n .forEach((nei, i) => {\n const nextNei = atom.neighbors[(i + 1) % atom.neighbors.length]\n this.halfBonds.get(this.halfBonds.get(nei).contra).next = nextNei\n this.halfBondSetAngle(nextNei, nei)\n })\n}\n\nStruct.prototype.sortNeighbors = function (list) {\n if (!list) {\n this.atoms.forEach((atom, aid) => {\n this.atomSortNeighbors(aid)\n })\n } else {\n list.forEach(aid => {\n this.atomSortNeighbors(aid)\n })\n }\n}\n\nStruct.prototype.atomUpdateHalfBonds = function (aid) {\n this.atoms.get(aid).neighbors.forEach(hbid => {\n this.halfBondUpdate(hbid)\n this.halfBondUpdate(this.halfBonds.get(hbid).contra)\n })\n}\n\nStruct.prototype.updateHalfBonds = function (list) {\n if (!list) {\n this.atoms.forEach((atom, aid) => {\n this.atomUpdateHalfBonds(aid)\n })\n } else {\n list.forEach(aid => {\n this.atomUpdateHalfBonds(aid)\n })\n }\n}\n\nStruct.prototype.sGroupsRecalcCrossBonds = function () {\n this.sgroups.forEach(sg => {\n sg.xBonds = []\n sg.neiAtoms = []\n })\n\n this.bonds.forEach((bond, bid) => {\n const a1 = this.atoms.get(bond.begin)\n const a2 = this.atoms.get(bond.end)\n\n a1.sgs.forEach(sgid => {\n if (!a2.sgs.has(sgid)) {\n const sg = this.sgroups.get(sgid)\n sg.xBonds.push(bid)\n arrayAddIfMissing(sg.neiAtoms, bond.end)\n }\n })\n\n a2.sgs.forEach(sgid => {\n if (!a1.sgs.has(sgid)) {\n const sg = this.sgroups.get(sgid)\n sg.xBonds.push(bid)\n arrayAddIfMissing(sg.neiAtoms, bond.begin)\n }\n })\n })\n}\n\nStruct.prototype.sGroupDelete = function (sgid) {\n this.sgroups.get(sgid).atoms.forEach(atom => {\n this.atoms.get(atom).sgs.delete(sgid)\n })\n\n this.sGroupForest.remove(sgid)\n this.sgroups.delete(sgid)\n}\n\nStruct.prototype.atomSetPos = function (id, pp) {\n const item = this.atoms.get(id)\n item.pp = pp\n}\n\nStruct.prototype.rxnPlusSetPos = function (id, pp) {\n const item = this.rxnPluses.get(id)\n item.pp = pp\n}\n\nStruct.prototype.rxnArrowSetPos = function (id, pp) {\n const item = this.rxnArrows.get(id)\n item.pp = pp\n}\n\nStruct.prototype.simpleObjectSetPos = function (id, pos) {\n const item = this.simpleObjects.get(id)\n item.pos = pos\n}\n\n/**\n * @param atomSet { Pile }\n * @returns {*}\n */\nStruct.prototype.getCoordBoundingBox = function (atomSet) {\n var bb = null\n function extend(pp) {\n if (!bb) {\n bb = {\n min: pp,\n max: pp\n }\n } else {\n bb.min = Vec2.min(bb.min, pp)\n bb.max = Vec2.max(bb.max, pp)\n }\n }\n\n var global = !atomSet || atomSet.size === 0\n\n this.atoms.forEach((atom, aid) => {\n if (global || atomSet.has(aid)) extend(atom.pp)\n })\n if (global) {\n this.rxnPluses.forEach(item => {\n extend(item.pp)\n })\n this.rxnArrows.forEach(item => {\n extend(item.pp)\n })\n }\n if (!bb && global) {\n bb = {\n min: new Vec2(0, 0),\n max: new Vec2(1, 1)\n }\n }\n return bb\n}\n\nStruct.prototype.getCoordBoundingBoxObj = function () {\n var bb = null\n function extend(pp) {\n if (!bb) {\n bb = {\n min: new Vec2(pp),\n max: new Vec2(pp)\n }\n } else {\n bb.min = Vec2.min(bb.min, pp)\n bb.max = Vec2.max(bb.max, pp)\n }\n }\n\n this.atoms.forEach(atom => {\n extend(atom.pp)\n })\n return bb\n}\n\nStruct.prototype.getBondLengthData = function () {\n let totalLength = 0\n let cnt = 0\n this.bonds.forEach(bond => {\n totalLength += Vec2.dist(\n this.atoms.get(bond.begin).pp,\n this.atoms.get(bond.end).pp\n )\n cnt++\n })\n return { cnt, totalLength }\n}\n\nStruct.prototype.getAvgBondLength = function () {\n const bld = this.getBondLengthData()\n return bld.cnt > 0 ? bld.totalLength / bld.cnt : -1\n}\n\nStruct.prototype.getAvgClosestAtomDistance = function () {\n var totalDist = 0\n var minDist\n var dist = 0\n var keys = this.atoms.keys()\n var k\n var j\n for (k = 0; k < keys.length; ++k) {\n minDist = -1\n for (j = 0; j < keys.length; ++j) {\n if (j == k) continue // eslint-disable-line no-continue\n dist = Vec2.dist(this.atoms.get(keys[j]).pp, this.atoms.get(keys[k]).pp)\n if (minDist < 0 || minDist > dist) minDist = dist\n }\n totalDist += minDist\n }\n\n return keys.length > 0 ? totalDist / keys.length : -1\n}\n\nStruct.prototype.checkBondExists = function (begin, end) {\n const key = this.bonds.find(\n (bid, bond) =>\n (bond.begin === begin && bond.end === end) ||\n (bond.end === begin && bond.begin === end)\n )\n\n return key !== undefined\n}\n\n/**\n * @param hbs { Array }\n * @param struct < Struct }\n * @param isConvex { boolean }\n * @constructor\n */\nfunction Loop(hbs, struct, isConvex) {\n this.hbs = hbs // set of half-bonds involved\n this.dblBonds = 0 // number of double bonds in the loop\n this.aromatic = true\n this.convex = isConvex || false\n\n hbs.forEach(hb => {\n const bond = struct.bonds.get(struct.halfBonds.get(hb).bid)\n if (bond.type !== Bond.PATTERN.TYPE.AROMATIC) this.aromatic = false\n if (bond.type === Bond.PATTERN.TYPE.DOUBLE) this.dblBonds++\n })\n}\n\n/**\n * @param firstaid { number }\n * @returns { Pile }\n */\nStruct.prototype.findConnectedComponent = function (firstaid) {\n const list = [firstaid]\n const ids = new Pile()\n while (list.length > 0) {\n const aid = list.pop()\n ids.add(aid)\n const atom = this.atoms.get(aid)\n atom.neighbors.forEach(nei => {\n const neiId = this.halfBonds.get(nei).end\n if (!ids.has(neiId)) list.push(neiId)\n })\n }\n\n return ids\n}\n\nStruct.prototype.findConnectedComponents = function (discardExistingFragments) {\n // NB: this is a hack\n // TODO: need to maintain half-bond and neighbor structure permanently\n if (!this.halfBonds.size) {\n this.initHalfBonds()\n this.initNeighbors()\n this.updateHalfBonds(Array.from(this.atoms.keys()))\n this.sortNeighbors(Array.from(this.atoms.keys()))\n }\n\n let addedAtoms = new Pile()\n\n const components = []\n this.atoms.forEach((atom, aid) => {\n if (\n (discardExistingFragments || atom.fragment < 0) &&\n !addedAtoms.has(aid)\n ) {\n const component = this.findConnectedComponent(aid)\n components.push(component)\n addedAtoms = addedAtoms.union(component)\n }\n })\n\n return components\n}\n\n/**\n * @param idSet { Pile }\n */\nStruct.prototype.markFragment = function (idSet) {\n const frag = new Fragment()\n const fid = this.frags.add(frag)\n\n idSet.forEach(aid => {\n const atom = this.atoms.get(aid)\n if (atom.stereoLabel) frag.updateStereoAtom(this, aid, true)\n atom.fragment = fid\n })\n}\n\nStruct.prototype.markFragments = function () {\n const components = this.findConnectedComponents()\n components.forEach(comp => {\n this.markFragment(comp)\n })\n}\n\nStruct.prototype.scale = function (scale) {\n if (scale === 1) return\n\n this.atoms.forEach(atom => {\n atom.pp = atom.pp.scaled(scale)\n })\n\n this.rxnPluses.forEach(item => {\n item.pp = item.pp.scaled(scale)\n })\n\n this.rxnArrows.forEach(item => {\n item.pp = item.pp.scaled(scale)\n })\n\n this.sgroups.forEach(item => {\n item.pp = item.pp ? item.pp.scaled(scale) : null\n })\n}\n\nStruct.prototype.rescale = function () {\n let avg = this.getAvgBondLength()\n if (avg < 0 && !this.isReaction)\n // TODO [MK] this doesn't work well for reactions as the distances between\n // the atoms in different components are generally larger than those between atoms of a single component\n // (KETCHER-341)\n avg = this.getAvgClosestAtomDistance()\n if (avg < 1e-3) avg = 1\n\n const scale = 1 / avg\n this.scale(scale)\n}\n\nStruct.prototype.loopHasSelfIntersections = function (hbs) {\n for (let i = 0; i < hbs.length; ++i) {\n const hbi = this.halfBonds.get(hbs[i])\n const ai = this.atoms.get(hbi.begin).pp\n const bi = this.atoms.get(hbi.end).pp\n const set = new Pile([hbi.begin, hbi.end])\n\n for (let j = i + 2; j < hbs.length; ++j) {\n const hbj = this.halfBonds.get(hbs[j])\n if (set.has(hbj.begin) || set.has(hbj.end)) continue // skip edges sharing an atom\n\n const aj = this.atoms.get(hbj.begin).pp\n const bj = this.atoms.get(hbj.end).pp\n\n if (Box2Abs.segmentIntersection(ai, bi, aj, bj)) return true\n }\n }\n\n return false\n}\n\n// partition a cycle into simple cycles\n// TODO: [MK] rewrite the detection algorithm to only find simple ones right away?\nStruct.prototype.partitionLoop = function (loop) {\n // eslint-disable-line max-statements\n const subloops = []\n let continueFlag = true\n while (continueFlag) {\n const atomToHalfBond = {} // map from every atom in the loop to the index of the first half-bond starting from that atom in the uniqHb array\n continueFlag = false\n\n for (let l = 0; l < loop.length; ++l) {\n const hbid = loop[l]\n const aid1 = this.halfBonds.get(hbid).begin\n const aid2 = this.halfBonds.get(hbid).end\n if (aid2 in atomToHalfBond) {\n // subloop found\n const s = atomToHalfBond[aid2] // where the subloop begins\n const subloop = loop.slice(s, l + 1)\n subloops.push(subloop)\n if (l < loop.length)\n // remove half-bonds corresponding to the subloop\n loop.splice(s, l - s + 1)\n continueFlag = true\n break\n }\n atomToHalfBond[aid1] = l\n }\n if (!continueFlag) subloops.push(loop) // we're done, no more subloops found\n }\n return subloops\n}\n\nStruct.prototype.halfBondAngle = function (hbid1, hbid2) {\n const hba = this.halfBonds.get(hbid1)\n const hbb = this.halfBonds.get(hbid2)\n return Math.atan2(Vec2.cross(hba.dir, hbb.dir), Vec2.dot(hba.dir, hbb.dir))\n}\n\nStruct.prototype.loopIsConvex = function (loop) {\n return loop.every((item, k, loopArr) => {\n const angle = this.halfBondAngle(item, loopArr[(k + 1) % loopArr.length])\n return angle <= 0\n })\n}\n\n// check whether a loop is on the inner or outer side of the polygon\n// by measuring the total angle between bonds\nStruct.prototype.loopIsInner = function (loop) {\n let totalAngle = 2 * Math.PI\n loop.forEach((hbida, k, loopArr) => {\n const hbidb = loopArr[(k + 1) % loopArr.length]\n const hbb = this.halfBonds.get(hbidb)\n const angle = this.halfBondAngle(hbida, hbidb)\n totalAngle += hbb.contra === hbida ? Math.PI : angle // back and forth along the same edge\n })\n return Math.abs(totalAngle) < Math.PI\n}\n\n/**\n * @returns { {\n * \t\tnewLoops: Array ,\n * \t\tbondsToMark: Array\n * } }\n */\nStruct.prototype.findLoops = function () {\n const newLoops = []\n const bondsToMark = new Pile()\n\n /*\n Starting from each half-bond not known to be in a loop yet,\n follow the 'next' links until the initial half-bond is reached or\n the length of the sequence exceeds the number of half-bonds available.\n In a planar graph, as long as every bond is a part of some \"loop\" -\n either an outer or an inner one - every iteration either yields a loop\n or doesn't start at all. Thus this has linear complexity in the number\n of bonds for planar graphs.\n */\n\n let hbIdNext, c, loop, loopId\n this.halfBonds.forEach((hb, hbId) => {\n if (hb.loop !== -1) return\n\n for (\n hbIdNext = hbId, c = 0, loop = [];\n c <= this.halfBonds.size;\n hbIdNext = this.halfBonds.get(hbIdNext).next, ++c\n ) {\n if (!(c > 0 && hbIdNext === hbId)) {\n loop.push(hbIdNext)\n continue // eslint-disable-line no-continue\n }\n\n // loop found\n const subloops = this.partitionLoop(loop)\n subloops.forEach(loop => {\n if (this.loopIsInner(loop) && !this.loopHasSelfIntersections(loop)) {\n /*\n loop is internal\n use lowest half-bond id in the loop as the loop id\n this ensures that the loop gets the same id if it is discarded and then recreated,\n which in turn is required to enable redrawing while dragging, as actions store item id's\n */\n loopId = Math.min(...loop)\n this.loops.set(loopId, new Loop(loop, this, this.loopIsConvex(loop)))\n } else {\n loopId = -2\n }\n\n loop.forEach(hbid => {\n this.halfBonds.get(hbid).loop = loopId\n bondsToMark.add(this.halfBonds.get(hbid).bid)\n })\n\n if (loopId >= 0) newLoops.push(loopId)\n })\n break\n }\n })\n\n return {\n newLoops,\n bondsToMark: Array.from(bondsToMark)\n }\n}\n\n// NB: this updates the structure without modifying the corresponding ReStruct.\n// To be applied to standalone structures only.\nStruct.prototype.prepareLoopStructure = function () {\n this.initHalfBonds()\n this.initNeighbors()\n this.updateHalfBonds(Array.from(this.atoms.keys()))\n this.sortNeighbors(Array.from(this.atoms.keys()))\n this.findLoops()\n}\n\n/**\n * @param sgid { number }\n * @param aid { number }\n */\nStruct.prototype.atomAddToSGroup = function (sgid, aid) {\n // TODO: [MK] make sure the addition does not break the hierarchy?\n SGroup.addAtom(this.sgroups.get(sgid), aid)\n this.atoms.get(aid).sgs.add(sgid)\n}\n\nStruct.prototype.calcConn = function (atom) {\n let conn = 0\n for (let i = 0; i < atom.neighbors.length; ++i) {\n const hb = this.halfBonds.get(atom.neighbors[i])\n const bond = this.bonds.get(hb.bid)\n switch (bond.type) {\n case Bond.PATTERN.TYPE.SINGLE:\n conn += 1\n break\n case Bond.PATTERN.TYPE.DOUBLE:\n conn += 2\n break\n case Bond.PATTERN.TYPE.TRIPLE:\n conn += 3\n break\n case Bond.PATTERN.TYPE.AROMATIC:\n if (atom.neighbors.length === 1) return [-1, true]\n return [atom.neighbors.length, true]\n default:\n return [-1, false]\n }\n }\n return [conn, false]\n}\n\nStruct.prototype.calcImplicitHydrogen = function (aid) {\n const atom = this.atoms.get(aid)\n const [conn, isAromatic] = this.calcConn(atom)\n let correctConn = conn\n atom.badConn = false\n\n if (isAromatic) {\n if (atom.label === 'C' && atom.charge === 0) {\n if (conn === 3) {\n atom.implicitH = -radicalElectrons(atom.radical)\n return\n }\n if (conn === 2) {\n atom.implicitH = 1 - radicalElectrons(atom.radical)\n return\n }\n } else if (\n (atom.label === 'O' && atom.charge === 0) ||\n (atom.label === 'N' && atom.charge === 0 && conn === 3) ||\n (atom.label === 'N' && atom.charge === 1 && conn === 3) ||\n (atom.label === 'S' && atom.charge === 0 && conn === 3)\n ) {\n atom.implicitH = 0\n return\n } else if (!atom.hasImplicitH) {\n correctConn++\n }\n }\n\n if (correctConn < 0 || atom.isQuery()) {\n atom.implicitH = 0\n return\n }\n\n if (atom.explicitValence >= 0) {\n const elem = element.map[atom.label]\n atom.implicitH =\n elem !== null\n ? atom.explicitValence - atom.calcValenceMinusHyd(correctConn)\n : 0\n if (atom.implicitH < 0) {\n atom.implicitH = 0\n atom.badConn = true\n }\n } else {\n atom.calcValence(correctConn)\n }\n}\n\nStruct.prototype.setImplicitHydrogen = function (list) {\n this.sgroups.forEach(item => {\n if (item.data.fieldName === 'MRV_IMPLICIT_H')\n this.atoms.get(item.atoms[0]).hasImplicitH = true\n })\n\n if (!list) {\n this.atoms.forEach((atom, aid) => {\n this.calcImplicitHydrogen(aid)\n })\n } else {\n list.forEach(aid => {\n this.calcImplicitHydrogen(aid)\n })\n }\n}\n\n/**\n * @return {{reactants: Array>, products: Array>}}\n */\nStruct.prototype.getComponents = function () {\n // eslint-disable-line max-statements\n /* saver */\n const connectedComponents = this.findConnectedComponents(true)\n const barriers = []\n let arrowPos = null\n\n this.rxnArrows.forEach(item => {\n // there's just one arrow\n arrowPos = item.pp.x\n })\n\n this.rxnPluses.forEach(item => {\n barriers.push(item.pp.x)\n })\n\n if (arrowPos !== null) barriers.push(arrowPos)\n\n barriers.sort((a, b) => a - b)\n\n const components = []\n\n connectedComponents.forEach(component => {\n const bb = this.getCoordBoundingBox(component)\n const c = Vec2.lc2(bb.min, 0.5, bb.max, 0.5)\n let j = 0\n\n while (c.x > barriers[j]) ++j\n\n components[j] = components[j] || new Pile()\n components[j] = components[j].union(component)\n })\n\n const submolTexts = []\n const reactants = []\n const products = []\n\n components.forEach(component => {\n if (!component) {\n submolTexts.push('')\n return\n }\n\n const rxnFragmentType = this.defineRxnFragmentTypeForAtomset(\n component,\n arrowPos\n )\n\n if (rxnFragmentType === 1) reactants.push(component)\n else products.push(component)\n })\n\n return {\n reactants,\n products\n }\n}\n\n/**\n * @param atomset { Pile }\n * @param arrowpos { number }\n * @returns { number }\n */\nStruct.prototype.defineRxnFragmentTypeForAtomset = function (\n atomset,\n arrowpos\n) {\n const bb = this.getCoordBoundingBox(atomset)\n const c = Vec2.lc2(bb.min, 0.5, bb.max, 0.5)\n return c.x < arrowpos ? 1 : 2\n}\n\n/**\n * @param bid { number }\n * @returns { number }\n */\nStruct.prototype.getBondFragment = function (bid) {\n const aid = this.bonds.get(bid).begin\n return this.atoms.get(aid).fragment\n}\n\n// Other struct objects\n\nfunction RxnPlus(params) {\n params = params || {}\n this.pp = params.pp ? new Vec2(params.pp) : new Vec2()\n}\n\nRxnPlus.prototype.clone = function () {\n return new RxnPlus(this)\n}\n\nfunction SimpleObject(params) {\n params = params || {}\n this.pos = []\n\n if (params.pos)\n for (let i = 0; i < params.pos.length; i++)\n this.pos[i] = params.pos[i] ? new Vec2(params.pos[i]) : new Vec2()\n\n this.mode = params.mode\n}\n\nSimpleObject.prototype.clone = function () {\n return new SimpleObject(this)\n}\n\nSimpleObject.prototype.center = function () {\n switch (this.mode) {\n case 'rectangle': {\n return Vec2.centre(this.pos[0], this.pos[1])\n }\n default:\n return this.pos[0]\n }\n}\n\nfunction RxnArrow(params) {\n params = params || {}\n this.pp = params.pp ? new Vec2(params.pp) : new Vec2()\n}\n\nRxnArrow.prototype.clone = function () {\n return new RxnArrow(this)\n}\n\nfunction arrayAddIfMissing(array, item) {\n for (var i = 0; i < array.length; ++i) {\n if (array[i] === item) return false\n }\n array.push(item)\n return true\n}\n\nexport default Struct\nexport {\n Atom,\n AtomList,\n Bond,\n Fragment,\n SGroup,\n SGroupForest,\n RGroup,\n RxnPlus,\n RxnArrow,\n SimpleObject\n}\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport Vec2 from '../../util/vec2'\nimport Struct, { Bond, RxnArrow, RxnPlus } from './../struct/index'\n\nfunction paddedNum(number, width, precision) {\n number = parseFloat(number)\n\n var numStr = number.toFixed(precision || 0).replace(',', '.') // Really need to replace?\n if (numStr.length > width) throw new Error('number does not fit')\n\n return numStr.padStart(width)\n}\n\nfunction parseDecimalInt(str) {\n /* reader */\n var val = parseInt(str, 10)\n\n return isNaN(val) ? 0 : val // eslint-disable-line\n}\n\nfunction partitionLine(\n /* string*/ str,\n /* array of int*/ parts,\n /* bool*/ withspace\n) {\n /* reader */\n var res = []\n for (var i = 0, shift = 0; i < parts.length; ++i) {\n res.push(str.slice(shift, shift + parts[i]))\n if (withspace) shift++\n shift += parts[i]\n }\n return res\n}\n\nfunction partitionLineFixed(\n /* string*/ str,\n /* int*/ itemLength,\n /* bool*/ withspace\n) {\n /* reader */\n var res = []\n for (var shift = 0; shift < str.length; shift += itemLength) {\n res.push(str.slice(shift, shift + itemLength))\n if (withspace) shift++\n }\n return res\n}\n\nvar fmtInfo = {\n bondTypeMap: {\n 1: Bond.PATTERN.TYPE.SINGLE,\n 2: Bond.PATTERN.TYPE.DOUBLE,\n 3: Bond.PATTERN.TYPE.TRIPLE,\n 4: Bond.PATTERN.TYPE.AROMATIC,\n 5: Bond.PATTERN.TYPE.SINGLE_OR_DOUBLE,\n 6: Bond.PATTERN.TYPE.SINGLE_OR_AROMATIC,\n 7: Bond.PATTERN.TYPE.DOUBLE_OR_AROMATIC,\n 8: Bond.PATTERN.TYPE.ANY\n },\n bondStereoMap: {\n 0: Bond.PATTERN.STEREO.NONE,\n 1: Bond.PATTERN.STEREO.UP,\n 4: Bond.PATTERN.STEREO.EITHER,\n 6: Bond.PATTERN.STEREO.DOWN,\n 3: Bond.PATTERN.STEREO.CIS_TRANS\n },\n v30bondStereoMap: {\n 0: Bond.PATTERN.STEREO.NONE,\n 1: Bond.PATTERN.STEREO.UP,\n 2: Bond.PATTERN.STEREO.EITHER,\n 3: Bond.PATTERN.STEREO.DOWN\n },\n bondTopologyMap: {\n 0: Bond.PATTERN.TOPOLOGY.EITHER,\n 1: Bond.PATTERN.TOPOLOGY.RING,\n 2: Bond.PATTERN.TOPOLOGY.CHAIN\n },\n countsLinePartition: [3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 6],\n atomLinePartition: [10, 10, 10, 1, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3],\n bondLinePartition: [3, 3, 3, 3, 3, 3, 3],\n atomListHeaderPartition: [3, 1, 1, 4, 1, 1],\n atomListHeaderLength: 11, // = atomListHeaderPartition.reduce(function(a,b) { return a + b; }, 0)\n atomListHeaderItemLength: 4,\n chargeMap: [0, +3, +2, +1, 0, -1, -2, -3],\n valenceMap: [undefined, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 0],\n implicitHydrogenMap: [undefined, 0, 1, 2, 3, 4],\n v30atomPropMap: {\n CHG: 'charge',\n RAD: 'radical',\n MASS: 'isotope',\n VAL: 'explicitValence',\n HCOUNT: 'hCount',\n INVRET: 'invRet',\n SUBST: 'substitutionCount',\n UNSAT: 'unsaturatedAtom',\n RBCNT: 'ringBondCount'\n },\n rxnItemsPartition: [3, 3, 3]\n}\n\nvar FRAGMENT = {\n NONE: 0,\n REACTANT: 1,\n PRODUCT: 2,\n AGENT: 3\n}\n\nvar SHOULD_RESCALE_MOLECULES = true\n\nfunction rxnMerge(\n mols,\n nReactants,\n nProducts,\n nAgents,\n shouldReactionRelayout\n) /* Struct */ {\n // eslint-disable-line max-statements\n /* reader */\n var ret = new Struct()\n var bbReact = [],\n bbAgent = [],\n bbProd = []\n var molReact = [],\n molAgent = [],\n molProd = []\n var j\n var bondLengthData = { cnt: 0, totalLength: 0 }\n for (j = 0; j < mols.length; ++j) {\n var mol = mols[j]\n var bondLengthDataMol = mol.getBondLengthData()\n bondLengthData.cnt += bondLengthDataMol.cnt\n bondLengthData.totalLength += bondLengthDataMol.totalLength\n }\n if (SHOULD_RESCALE_MOLECULES) {\n var avgBondLength =\n 1 /\n (bondLengthData.cnt == 0\n ? 1\n : bondLengthData.totalLength / bondLengthData.cnt)\n for (j = 0; j < mols.length; ++j) {\n mol = mols[j]\n mol.scale(avgBondLength)\n }\n }\n\n for (j = 0; j < mols.length; ++j) {\n mol = mols[j]\n var bb = mol.getCoordBoundingBoxObj()\n if (!bb) continue // eslint-disable-line no-continue\n\n var fragmentType =\n j < nReactants\n ? FRAGMENT.REACTANT // eslint-disable-line no-nested-ternary\n : j < nReactants + nProducts\n ? FRAGMENT.PRODUCT\n : FRAGMENT.AGENT\n if (fragmentType == FRAGMENT.REACTANT) {\n bbReact.push(bb)\n molReact.push(mol)\n } else if (fragmentType == FRAGMENT.AGENT) {\n bbAgent.push(bb)\n molAgent.push(mol)\n } else if (fragmentType == FRAGMENT.PRODUCT) {\n bbProd.push(bb)\n molProd.push(mol)\n }\n\n mol.atoms.forEach(atom => {\n atom.rxnFragmentType = fragmentType\n })\n }\n\n function shiftMol(ret, mol, bb, xorig, over) {\n // eslint-disable-line max-params\n var d = new Vec2(\n xorig - bb.min.x,\n over ? 1 - bb.min.y : -(bb.min.y + bb.max.y) / 2\n )\n mol.atoms.forEach(atom => {\n atom.pp.add_(d) // eslint-disable-line no-underscore-dangle\n })\n\n mol.sgroups.forEach(item => {\n if (item.pp) item.pp.add_(d) // eslint-disable-line no-underscore-dangle\n })\n bb.min.add_(d) // eslint-disable-line no-underscore-dangle\n bb.max.add_(d) // eslint-disable-line no-underscore-dangle\n mol.mergeInto(ret)\n return bb.max.x - bb.min.x\n }\n\n if (shouldReactionRelayout) {\n // reaction fragment layout\n var xorig = 0\n for (j = 0; j < molReact.length; ++j)\n xorig += shiftMol(ret, molReact[j], bbReact[j], xorig, false) + 2.0\n xorig += 2.0\n for (j = 0; j < molAgent.length; ++j)\n xorig += shiftMol(ret, molAgent[j], bbAgent[j], xorig, true) + 2.0\n xorig += 2.0\n\n for (j = 0; j < molProd.length; ++j)\n xorig += shiftMol(ret, molProd[j], bbProd[j], xorig, false) + 2.0\n } else {\n for (j = 0; j < molReact.length; ++j) molReact[j].mergeInto(ret)\n for (j = 0; j < molAgent.length; ++j) molAgent[j].mergeInto(ret)\n for (j = 0; j < molProd.length; ++j) molProd[j].mergeInto(ret)\n }\n\n var bb1\n var bb2\n var x\n var y\n var bbReactAll = null\n var bbProdAll = null\n for (j = 0; j < bbReact.length - 1; ++j) {\n bb1 = bbReact[j]\n bb2 = bbReact[j + 1]\n\n x = (bb1.max.x + bb2.min.x) / 2\n y = (bb1.max.y + bb1.min.y + bb2.max.y + bb2.min.y) / 4\n\n ret.rxnPluses.add(new RxnPlus({ pp: new Vec2(x, y) }))\n }\n for (j = 0; j < bbReact.length; ++j) {\n if (j == 0) {\n bbReactAll = {}\n bbReactAll.max = new Vec2(bbReact[j].max)\n bbReactAll.min = new Vec2(bbReact[j].min)\n } else {\n bbReactAll.max = Vec2.max(bbReactAll.max, bbReact[j].max)\n bbReactAll.min = Vec2.min(bbReactAll.min, bbReact[j].min)\n }\n }\n for (j = 0; j < bbProd.length - 1; ++j) {\n bb1 = bbProd[j]\n bb2 = bbProd[j + 1]\n\n x = (bb1.max.x + bb2.min.x) / 2\n y = (bb1.max.y + bb1.min.y + bb2.max.y + bb2.min.y) / 4\n\n ret.rxnPluses.add(new RxnPlus({ pp: new Vec2(x, y) }))\n }\n for (j = 0; j < bbProd.length; ++j) {\n if (j == 0) {\n bbProdAll = {}\n bbProdAll.max = new Vec2(bbProd[j].max)\n bbProdAll.min = new Vec2(bbProd[j].min)\n } else {\n bbProdAll.max = Vec2.max(bbProdAll.max, bbProd[j].max)\n bbProdAll.min = Vec2.min(bbProdAll.min, bbProd[j].min)\n }\n }\n bb1 = bbReactAll\n bb2 = bbProdAll\n if (!bb1 && !bb2) {\n ret.rxnArrows.add(new RxnArrow({ pp: new Vec2(0, 0) }))\n } else {\n var v1 = bb1 ? new Vec2(bb1.max.x, (bb1.max.y + bb1.min.y) / 2) : null\n var v2 = bb2 ? new Vec2(bb2.min.x, (bb2.max.y + bb2.min.y) / 2) : null\n var defaultOffset = 3\n if (!v1) v1 = new Vec2(v2.x - defaultOffset, v2.y)\n if (!v2) v2 = new Vec2(v1.x + defaultOffset, v1.y)\n ret.rxnArrows.add(new RxnArrow({ pp: Vec2.lc2(v1, 0.5, v2, 0.5) }))\n }\n ret.isReaction = true\n return ret\n}\n\nexport default {\n fmtInfo,\n paddedNum,\n parseDecimalInt,\n partitionLine,\n partitionLineFixed,\n rxnMerge\n}\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\n/* eslint-disable guard-for-in */ // todo\n\nimport Vec2 from '../../util/vec2'\nimport Pool from '../../util/pool'\nimport { SGroup } from './../struct/index'\nimport utils from './utils'\n\n/**\n * @param str { string }\n * @param valueString { boolean }\n * @returns { Pool }\n */\nfunction readKeyValuePairs(str, valueString) {\n const ret = new Pool()\n const partition = utils.partitionLineFixed(str, 3, true)\n const count = utils.parseDecimalInt(partition[0])\n\n for (let i = 0; i < count; ++i) {\n const key = utils.parseDecimalInt(partition[2 * i + 1]) - 1\n const value = valueString\n ? partition[2 * i + 2].trim()\n : utils.parseDecimalInt(partition[2 * i + 2])\n\n ret.set(key, value)\n }\n\n return ret\n}\n\n/**\n * @param str { string }\n * @param valueString { boolean }\n * @returns { Array }\n */\nfunction readKeyMultiValuePairs(str, valueString) {\n /* reader */\n var ret = []\n var partition = utils.partitionLineFixed(str, 3, true)\n var count = utils.parseDecimalInt(partition[0])\n for (var i = 0; i < count; ++i) {\n ret.push([\n /* eslint-disable no-mixed-operators*/\n utils.parseDecimalInt(partition[2 * i + 1]) - 1,\n valueString\n ? partition[2 * i + 2].trim()\n : utils.parseDecimalInt(partition[2 * i + 2])\n /* eslint-enable no-mixed-operators*/\n ])\n }\n return ret\n}\n\nfunction postLoadMul(sgroup, mol, atomMap) {\n // eslint-disable-line max-statements\n sgroup.data.mul = sgroup.data.subscript - 0\n var atomReductionMap = {}\n\n sgroup.atoms = SGroup.filterAtoms(sgroup.atoms, atomMap)\n sgroup.patoms = SGroup.filterAtoms(sgroup.patoms, atomMap)\n\n // mark repetitions for removal\n for (var k = 1; k < sgroup.data.mul; ++k) {\n for (var m = 0; m < sgroup.patoms.length; ++m) {\n var raid = sgroup.atoms[k * sgroup.patoms.length + m] // eslint-disable-line no-mixed-operators\n if (raid < 0) continue // eslint-disable-line no-continue\n if (sgroup.patoms[m] < 0) throw new Error('parent atom missing')\n atomReductionMap[raid] = sgroup.patoms[m] // \"merge\" atom in parent\n }\n }\n sgroup.patoms = SGroup.removeNegative(sgroup.patoms)\n\n var patomsMap = identityMap(sgroup.patoms)\n\n var bondsToRemove = []\n mol.bonds.forEach((bond, bid) => {\n var beginIn = bond.begin in atomReductionMap\n var endIn = bond.end in atomReductionMap\n // if both adjacent atoms of a bond are to be merged, remove it\n /* eslint-disable no-mixed-operators*/\n if (\n (beginIn && endIn) ||\n (beginIn && bond.end in patomsMap) ||\n (endIn && bond.begin in patomsMap)\n )\n bondsToRemove.push(bid)\n /* eslint-enable no-mixed-operators*/\n // if just one atom is merged, modify the bond accordingly\n else if (beginIn) bond.begin = atomReductionMap[bond.begin]\n else if (endIn) bond.end = atomReductionMap[bond.end]\n }, sgroup)\n\n // apply removal lists\n for (var b = 0; b < bondsToRemove.length; ++b)\n mol.bonds.delete(bondsToRemove[b])\n for (var a in atomReductionMap) {\n mol.atoms.delete(+a)\n atomMap[a] = -1\n }\n sgroup.atoms = sgroup.patoms\n sgroup.patoms = null\n}\n\nfunction postLoadSru(sgroup) {\n sgroup.data.connectivity = (sgroup.data.connectivity || 'EU')\n .trim()\n .toLowerCase()\n}\n\nfunction postLoadSup(sgroup) {\n sgroup.data.name = (sgroup.data.subscript || '').trim()\n sgroup.data.subscript = ''\n}\n\nfunction postLoadGen(sgroup, mol, atomMap) {\n // eslint-disable-line no-unused-vars\n}\n\nfunction postLoadDat(sgroup, mol) {\n if (!sgroup.data.absolute)\n sgroup.pp = sgroup.pp.add(SGroup.getMassCentre(mol, sgroup.atoms))\n}\n\nfunction loadSGroup(mol, sg, atomMap) {\n var postLoadMap = {\n MUL: postLoadMul,\n SRU: postLoadSru,\n SUP: postLoadSup,\n DAT: postLoadDat,\n GEN: postLoadGen\n }\n\n // add the group to the molecule\n sg.id = mol.sgroups.add(sg)\n\n // apply type-specific post-processing\n postLoadMap[sg.type](sg, mol, atomMap)\n // mark atoms in the group as belonging to it\n for (let s = 0; s < sg.atoms.length; ++s) {\n if (mol.atoms.has(sg.atoms[s])) mol.atoms.get(sg.atoms[s]).sgs.add(sg.id)\n }\n\n if (sg.type === 'DAT') mol.sGroupForest.insert(sg, -1, [])\n else mol.sGroupForest.insert(sg)\n\n return sg.id\n}\n\nfunction initSGroup(sGroups, propData) {\n /* reader */\n const kv = readKeyValuePairs(propData, true)\n for (const [key, type] of kv) {\n if (!(type in SGroup.TYPES)) throw new Error('Unsupported S-group type')\n\n const sg = new SGroup(type)\n sg.number = key\n sGroups[key] = sg\n }\n}\n\nfunction applySGroupProp(sGroups, propName, propData, numeric, core) {\n // eslint-disable-line max-params\n const kv = readKeyValuePairs(propData, !numeric)\n // \"core\" properties are stored directly in an sgroup, not in sgroup.data\n for (const key of kv.keys())\n (core ? sGroups[key] : sGroups[key].data)[propName] = kv.get(key)\n}\n\nfunction applySGroupArrayProp(sGroups, propName, propData, shift) {\n /* reader */\n const sid = utils.parseDecimalInt(propData.slice(1, 4)) - 1\n const num = utils.parseDecimalInt(propData.slice(4, 8))\n let part = toIntArray(utils.partitionLineFixed(propData.slice(8), 3, true))\n\n if (part.length !== num) throw new Error('File format invalid')\n if (shift) part = part.map(v => v + shift)\n\n sGroups[sid][propName] = sGroups[sid][propName].concat(part)\n}\n\nfunction applyDataSGroupName(sg, name) {\n /* reader */\n sg.data.fieldName = name\n}\n\nfunction applyDataSGroupQuery(sg, query) {\n /* reader */\n sg.data.query = query\n}\n\nfunction applyDataSGroupQueryOp(sg, queryOp) {\n /* reader */\n sg.data.queryOp = queryOp\n}\n\nfunction applyDataSGroupDesc(sGroups, propData) {\n /* reader */\n var split = utils.partitionLine(propData, [4, 31, 2, 20, 2, 3], false)\n var id = utils.parseDecimalInt(split[0]) - 1\n var fieldName = split[1].trim()\n var fieldType = split[2].trim()\n var units = split[3].trim()\n var query = split[4].trim()\n var queryOp = split[5].trim()\n var sGroup = sGroups[id]\n sGroup.data.fieldType = fieldType\n sGroup.data.fieldName = fieldName\n sGroup.data.units = units\n sGroup.data.query = query\n sGroup.data.queryOp = queryOp\n}\n\nfunction applyDataSGroupInfo(sg, propData) {\n // eslint-disable-line max-statements\n /* reader */\n var split = utils.partitionLine(\n propData,\n [\n 10 /* x.x*/,\n 10 /* y.y*/,\n 4 /* eee*/,\n 1 /* f*/,\n 1 /* g*/,\n 1 /* h*/,\n 3 /* i */,\n 3 /* jjj*/,\n 3 /* kkk*/,\n 3 /* ll*/,\n 2 /* m*/,\n 3 /* n*/,\n 2 /* oo*/\n ],\n false\n )\n\n var x = parseFloat(split[0])\n var y = parseFloat(split[1])\n var attached = split[3].trim() == 'A'\n var absolute = split[4].trim() == 'A'\n var showUnits = split[5].trim() == 'U'\n var nCharsToDisplay = split[7].trim()\n nCharsToDisplay =\n nCharsToDisplay == 'ALL' ? -1 : utils.parseDecimalInt(nCharsToDisplay)\n var tagChar = split[10].trim()\n var daspPos = utils.parseDecimalInt(split[11].trim())\n\n sg.pp = new Vec2(x, -y)\n sg.data.attached = attached\n sg.data.absolute = absolute\n sg.data.showUnits = showUnits\n sg.data.nCharsToDisplay = nCharsToDisplay\n sg.data.tagChar = tagChar\n sg.data.daspPos = daspPos\n}\n\nfunction applyDataSGroupInfoLine(sGroups, propData) {\n /* reader */\n var id = utils.parseDecimalInt(propData.substr(0, 4)) - 1\n var sg = sGroups[id]\n applyDataSGroupInfo(sg, propData.substr(5))\n}\n\nfunction applyDataSGroupData(sg, data, finalize) {\n /* reader */\n sg.data.fieldValue = (sg.data.fieldValue || '') + data\n if (finalize) {\n sg.data.fieldValue = trimRight(sg.data.fieldValue)\n if (sg.data.fieldValue.startsWith('\"') && sg.data.fieldValue.endsWith('\"'))\n sg.data.fieldValue = sg.data.fieldValue.substr(\n 1,\n sg.data.fieldValue.length - 2\n )\n }\n}\n\nfunction applyDataSGroupDataLine(sGroups, propData, finalize) {\n /* reader */\n var id = utils.parseDecimalInt(propData.substr(0, 5)) - 1\n var data = propData.substr(5)\n var sg = sGroups[id]\n applyDataSGroupData(sg, data, finalize)\n}\n\n// Utilities functions\nfunction toIntArray(strArray) {\n /* reader */\n var ret = []\n for (var j = 0; j < strArray.length; ++j)\n ret[j] = utils.parseDecimalInt(strArray[j])\n return ret\n}\n\nfunction trimRight(str) {\n return str.replace(/\\s+$/, '')\n}\n\nfunction identityMap(array) {\n var map = {}\n for (var i = 0; i < array.length; ++i) map[array[i]] = array[i]\n return map\n}\n\nexport default {\n readKeyValuePairs,\n readKeyMultiValuePairs,\n loadSGroup,\n initSGroup,\n applySGroupProp,\n applySGroupArrayProp,\n applyDataSGroupName,\n applyDataSGroupQuery,\n applyDataSGroupQueryOp,\n applyDataSGroupDesc,\n applyDataSGroupInfo,\n applyDataSGroupData,\n applyDataSGroupInfoLine,\n applyDataSGroupDataLine\n}\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\n/* eslint-disable guard-for-in */ // todo\n\nimport Vec2 from '../../util/vec2'\nimport Pool from '../../util/pool'\nimport element from './../element'\nimport Struct, { Atom, AtomList, Bond, RGroup, SGroup } from './../struct/index'\n\nimport sGroup from './parseSGroup'\nimport utils from './utils'\n\nconst loadRGroupFragments = true // TODO: set to load the fragments\n\nfunction parseAtomLine(atomLine) {\n /* reader */\n var atomSplit = utils.partitionLine(atomLine, utils.fmtInfo.atomLinePartition)\n var params = {\n // generic\n pp: new Vec2(\n parseFloat(atomSplit[0]),\n -parseFloat(atomSplit[1]),\n parseFloat(atomSplit[2])\n ),\n label: atomSplit[4].trim(),\n explicitValence:\n utils.fmtInfo.valenceMap[utils.parseDecimalInt(atomSplit[10])],\n\n // obsolete\n massDifference: utils.parseDecimalInt(atomSplit[5]),\n charge: utils.fmtInfo.chargeMap[utils.parseDecimalInt(atomSplit[6])],\n\n // query\n hCount: utils.parseDecimalInt(utils.parseDecimalInt(atomSplit[8])),\n stereoCare: utils.parseDecimalInt(atomSplit[9]) != 0,\n\n // reaction\n aam: utils.parseDecimalInt(atomSplit[14]),\n invRet: utils.parseDecimalInt(atomSplit[15]),\n\n // reaction query\n exactChangeFlag: utils.parseDecimalInt(atomSplit[16]) != 0\n }\n return new Atom(params)\n}\n\nfunction parseBondLine(bondLine) {\n /* reader */\n var bondSplit = utils.partitionLine(bondLine, utils.fmtInfo.bondLinePartition)\n var params = {\n begin: utils.parseDecimalInt(bondSplit[0]) - 1,\n end: utils.parseDecimalInt(bondSplit[1]) - 1,\n type: utils.fmtInfo.bondTypeMap[utils.parseDecimalInt(bondSplit[2])],\n stereo: utils.fmtInfo.bondStereoMap[utils.parseDecimalInt(bondSplit[3])],\n xxx: bondSplit[4],\n topology:\n utils.fmtInfo.bondTopologyMap[utils.parseDecimalInt(bondSplit[5])],\n reactingCenterStatus: utils.parseDecimalInt(bondSplit[6])\n }\n\n return new Bond(params)\n}\n\nfunction parseAtomListLine(/* string */ atomListLine) {\n /* reader */\n var split = utils.partitionLine(\n atomListLine,\n utils.fmtInfo.atomListHeaderPartition\n )\n\n var number = utils.parseDecimalInt(split[0]) - 1\n var notList = split[2].trim() == 'T'\n var count = utils.parseDecimalInt(split[4].trim())\n\n var ids = atomListLine.slice(utils.fmtInfo.atomListHeaderLength)\n var list = []\n var itemLength = utils.fmtInfo.atomListHeaderItemLength\n for (var i = 0; i < count; ++i)\n list[i] = utils.parseDecimalInt(\n ids.slice(i * itemLength, (i + 1) * itemLength - 1)\n )\n\n return {\n aid: number,\n atomList: new AtomList({\n notList,\n ids: list\n })\n }\n}\n\n/**\n * @param ctab\n * @param ctabLines\n * @param shift\n * @param end\n * @param sGroups\n * @param rLogic\n * @returns { Pool }\n */\nfunction parsePropertyLines(ctab, ctabLines, shift, end, sGroups, rLogic) {\n // eslint-disable-line max-statements, max-params\n /* reader */\n const props = new Pool()\n\n while (shift < end) {\n var line = ctabLines[shift]\n if (line.charAt(0) == 'A') {\n var propValue = ctabLines[++shift]\n var isPseudo = /'.+'/.test(propValue)\n if (isPseudo && !props.get('pseudo')) props.set('pseudo', new Pool())\n if (!isPseudo && !props.get('alias')) props.set('alias', new Pool())\n if (isPseudo) propValue = propValue.replace(/'/g, '')\n props\n .get(isPseudo ? 'pseudo' : 'alias')\n .set(utils.parseDecimalInt(line.slice(3, 6)) - 1, propValue)\n } else if (line.charAt(0) == 'M') {\n var type = line.slice(3, 6)\n var propertyData = line.slice(6)\n if (type == 'END') {\n break\n } else if (type == 'CHG') {\n if (!props.get('charge'))\n props.set('charge', sGroup.readKeyValuePairs(propertyData))\n } else if (type == 'RAD') {\n if (!props.get('radical'))\n props.set('radical', sGroup.readKeyValuePairs(propertyData))\n } else if (type == 'ISO') {\n if (!props.get('isotope'))\n props.set('isotope', sGroup.readKeyValuePairs(propertyData))\n } else if (type == 'RBC') {\n if (!props.get('ringBondCount'))\n props.set('ringBondCount', sGroup.readKeyValuePairs(propertyData))\n } else if (type == 'SUB') {\n if (!props.get('substitutionCount'))\n props.set('substitutionCount', sGroup.readKeyValuePairs(propertyData))\n } else if (type == 'UNS') {\n if (!props.get('unsaturatedAtom'))\n props.set('unsaturatedAtom', sGroup.readKeyValuePairs(propertyData))\n // else if (type == \"LIN\") // link atom\n } else if (type == 'RGP') {\n // rgroup atom\n if (!props.get('rglabel')) props.set('rglabel', new Pool())\n var rglabels = props.get('rglabel')\n var a2rs = sGroup.readKeyMultiValuePairs(propertyData)\n for (var a2ri = 0; a2ri < a2rs.length; a2ri++) {\n var a2r = a2rs[a2ri]\n rglabels.set(\n a2r[0],\n (rglabels.get(a2r[0]) || 0) | (1 << (a2r[1] - 1))\n )\n }\n } else if (type == 'LOG') {\n // rgroup atom\n propertyData = propertyData.slice(4)\n var rgid = utils.parseDecimalInt(propertyData.slice(0, 3).trim())\n var iii = utils.parseDecimalInt(propertyData.slice(4, 7).trim())\n var hhh = utils.parseDecimalInt(propertyData.slice(8, 11).trim())\n var ooo = propertyData.slice(12).trim()\n var logic = {}\n if (iii > 0) logic.ifthen = iii\n logic.resth = hhh == 1\n logic.range = ooo\n rLogic[rgid] = logic\n } else if (type == 'APO') {\n if (!props.get('attpnt'))\n props.set('attpnt', sGroup.readKeyValuePairs(propertyData))\n } else if (type == 'ALS') {\n // atom list\n const pool = parsePropertyLineAtomList(\n utils.partitionLine(propertyData, [1, 3, 3, 1, 1, 1]),\n utils.partitionLineFixed(propertyData.slice(10), 4, false)\n )\n\n if (!props.get('atomList')) props.set('atomList', new Pool())\n if (!props.get('label')) props.set('label', new Pool())\n\n pool.forEach((atomList, aid) => {\n props.get('label').set(aid, 'L#')\n props.get('atomList').set(aid, atomList)\n })\n } else if (type == 'STY') {\n // introduce s-group\n sGroup.initSGroup(sGroups, propertyData)\n } else if (type == 'SST') {\n sGroup.applySGroupProp(sGroups, 'subtype', propertyData)\n } else if (type == 'SLB') {\n sGroup.applySGroupProp(sGroups, 'label', propertyData, true)\n } else if (type == 'SPL') {\n sGroup.applySGroupProp(sGroups, 'parent', propertyData, true, true)\n } else if (type == 'SCN') {\n sGroup.applySGroupProp(sGroups, 'connectivity', propertyData)\n } else if (type == 'SAL') {\n sGroup.applySGroupArrayProp(sGroups, 'atoms', propertyData, -1)\n } else if (type == 'SBL') {\n sGroup.applySGroupArrayProp(sGroups, 'bonds', propertyData, -1)\n } else if (type == 'SPA') {\n sGroup.applySGroupArrayProp(sGroups, 'patoms', propertyData, -1)\n } else if (type == 'SMT') {\n var sid = utils.parseDecimalInt(propertyData.slice(0, 4)) - 1\n sGroups[sid].data.subscript = propertyData.slice(4).trim()\n } else if (type == 'SDT') {\n sGroup.applyDataSGroupDesc(sGroups, propertyData)\n } else if (type == 'SDD') {\n sGroup.applyDataSGroupInfoLine(sGroups, propertyData)\n } else if (type == 'SCD') {\n sGroup.applyDataSGroupDataLine(sGroups, propertyData, false)\n } else if (type == 'SED') {\n sGroup.applyDataSGroupDataLine(sGroups, propertyData, true)\n }\n }\n ++shift\n }\n return props\n}\n\n/**\n * @param atoms { Pool }\n * @param values { Pool }\n * @param propId { string }\n */\nfunction applyAtomProp(atoms, values, propId) {\n /* reader */\n values.forEach((propVal, aid) => {\n atoms.get(aid)[propId] = propVal\n })\n}\n\nfunction parseCTabV2000(ctabLines, countsSplit) {\n // eslint-disable-line max-statements\n /* reader */\n const ctab = new Struct()\n let i\n const atomCount = utils.parseDecimalInt(countsSplit[0])\n const bondCount = utils.parseDecimalInt(countsSplit[1])\n const atomListCount = utils.parseDecimalInt(countsSplit[2])\n const isAbs = utils.parseDecimalInt(countsSplit[4]) === 1\n const stextLinesCount = utils.parseDecimalInt(countsSplit[5])\n const propertyLinesCount = utils.parseDecimalInt(countsSplit[10])\n\n let shift = 0\n const atomLines = ctabLines.slice(shift, shift + atomCount)\n shift += atomCount\n const bondLines = ctabLines.slice(shift, shift + bondCount)\n shift += bondCount\n const atomListLines = ctabLines.slice(shift, shift + atomListCount)\n shift += atomListCount + stextLinesCount\n\n const atoms = atomLines.map(parseAtomLine)\n atoms.forEach(atom => ctab.atoms.add(atom))\n\n const bonds = bondLines.map(parseBondLine)\n bonds.forEach(bond => {\n if (bond.stereo && isAbs) ctab.atoms.get(bond.begin).stereoLabel = 'abs'\n ctab.bonds.add(bond)\n })\n\n const atomLists = atomListLines.map(parseAtomListLine)\n atomLists.forEach(pair => {\n ctab.atoms.get(pair.aid).atomList = pair.atomList\n ctab.atoms.get(pair.aid).label = 'L#'\n })\n\n const sGroups = {}\n const rLogic = {}\n const props = parsePropertyLines(\n ctab,\n ctabLines,\n shift,\n Math.min(ctabLines.length, shift + propertyLinesCount),\n sGroups,\n rLogic\n )\n props.forEach((values, propId) => {\n applyAtomProp(ctab.atoms, values, propId)\n })\n\n const atomMap = {}\n let sid\n for (sid in sGroups) {\n const sg = sGroups[sid]\n if (sg.type === 'DAT' && sg.atoms.length === 0) {\n const parent = sGroups[sid].parent\n if (parent >= 0) {\n const psg = sGroups[parent - 1]\n if (psg.type === 'GEN') sg.atoms = [].slice.call(psg.atoms)\n }\n }\n }\n for (sid in sGroups) sGroup.loadSGroup(ctab, sGroups[sid], atomMap)\n const emptyGroups = []\n for (sid in sGroups) {\n // TODO: why do we need that?\n SGroup.filter(ctab, sGroups[sid], atomMap)\n if (sGroups[sid].atoms.length === 0 && !sGroups[sid].allAtoms)\n emptyGroups.push(+sid)\n }\n for (i = 0; i < emptyGroups.length; ++i) {\n ctab.sGroupForest.remove(emptyGroups[i])\n ctab.sgroups.delete(emptyGroups[i])\n }\n for (const id in rLogic) {\n const rgid = parseInt(id, 10)\n ctab.rgroups.set(rgid, new RGroup(rLogic[rgid]))\n }\n\n return ctab\n}\n\nfunction parseRg2000(/* string[] */ ctabLines) /* Struct */ {\n // eslint-disable-line max-statements\n ctabLines = ctabLines.slice(7)\n if (ctabLines[0].trim() !== '$CTAB') throw new Error('RGFile format invalid')\n var i = 1\n while (ctabLines[i].charAt(0) !== '$') i++\n if (ctabLines[i].trim() !== '$END CTAB')\n throw new Error('RGFile format invalid')\n var coreLines = ctabLines.slice(1, i)\n ctabLines = ctabLines.slice(i + 1)\n var fragmentLines = {}\n while (true) {\n // eslint-disable-line no-constant-condition\n if (ctabLines.length === 0) throw new Error('Unexpected end of file')\n var line = ctabLines[0].trim()\n if (line === '$END MOL') {\n ctabLines = ctabLines.slice(1)\n break\n }\n if (line !== '$RGP') throw new Error('RGFile format invalid')\n\n const rgid = parseInt(ctabLines[1].trim(), 10)\n fragmentLines[rgid] = []\n ctabLines = ctabLines.slice(2)\n while (true) {\n // eslint-disable-line no-constant-condition\n if (ctabLines.length === 0) throw new Error('Unexpected end of file')\n line = ctabLines[0].trim()\n if (line === '$END RGP') {\n ctabLines = ctabLines.slice(1)\n break\n }\n if (line !== '$CTAB') throw new Error('RGFile format invalid')\n i = 1\n while (ctabLines[i].charAt(0) !== '$') i++\n if (ctabLines[i].trim() !== '$END CTAB')\n throw new Error('RGFile format invalid')\n fragmentLines[rgid].push(ctabLines.slice(1, i))\n ctabLines = ctabLines.slice(i + 1)\n }\n }\n\n var core = parseCTab(coreLines)\n var frag = {}\n if (loadRGroupFragments) {\n for (var strId in fragmentLines) {\n const id = parseInt(strId, 10)\n frag[id] = []\n for (var j = 0; j < fragmentLines[id].length; ++j)\n frag[id].push(parseCTab(fragmentLines[id][j]))\n }\n }\n return rgMerge(core, frag)\n}\n\nfunction parseRxn2000(\n /* string[] */ ctabLines,\n shouldReactionRelayout\n) /* Struct */ {\n // eslint-disable-line max-statements\n /* reader */\n ctabLines = ctabLines.slice(4)\n var countsSplit = utils.partitionLine(\n ctabLines[0],\n utils.fmtInfo.rxnItemsPartition\n )\n var nReactants = countsSplit[0] - 0,\n nProducts = countsSplit[1] - 0,\n nAgents = countsSplit[2] - 0\n ctabLines = ctabLines.slice(1) // consume counts line\n\n var mols = []\n while (ctabLines.length > 0 && ctabLines[0].substr(0, 4) == '$MOL') {\n ctabLines = ctabLines.slice(1)\n var n = 0\n while (n < ctabLines.length && ctabLines[n].substr(0, 4) != '$MOL') n++\n\n var lines = ctabLines.slice(0, n)\n var struct\n if (lines[0].search('\\\\$MDL') == 0) {\n struct = parseRg2000(lines)\n } else {\n struct = parseCTab(lines.slice(3))\n struct.name = lines[0].trim()\n }\n mols.push(struct)\n ctabLines = ctabLines.slice(n)\n }\n\n return utils.rxnMerge(\n mols,\n nReactants,\n nProducts,\n nAgents,\n shouldReactionRelayout\n )\n}\n\nfunction parseCTab(/* string */ ctabLines) /* Struct */ {\n /* reader */\n var countsSplit = utils.partitionLine(\n ctabLines[0],\n utils.fmtInfo.countsLinePartition\n )\n ctabLines = ctabLines.slice(1)\n return parseCTabV2000(ctabLines, countsSplit)\n}\n\nfunction rgMerge(scaffold, rgroups) /* Struct */ {\n /* reader */\n const ret = new Struct()\n\n scaffold.mergeInto(ret, null, null, false, true)\n\n Object.keys(rgroups).forEach(id => {\n const rgid = parseInt(id, 10)\n\n for (let j = 0; j < rgroups[rgid].length; ++j) {\n const ctab = rgroups[rgid][j]\n ctab.rgroups.set(rgid, new RGroup())\n const frag = {}\n const frid = ctab.frags.add(frag)\n ctab.rgroups.get(rgid).frags.add(frid)\n ctab.atoms.forEach(atom => {\n atom.fragment = frid\n })\n ctab.mergeInto(ret)\n }\n })\n\n return ret\n}\n\nfunction labelsListToIds(labels) {\n /* reader */\n var ids = []\n for (var i = 0; i < labels.length; ++i)\n ids.push(element.map[labels[i].trim()])\n return ids\n}\n\n/**\n * @param hdr\n * @param lst\n * @returns { Pool }\n */\nfunction parsePropertyLineAtomList(hdr, lst) {\n /* reader */\n var aid = utils.parseDecimalInt(hdr[1]) - 1\n var count = utils.parseDecimalInt(hdr[2])\n var notList = hdr[4].trim() == 'T'\n var ids = labelsListToIds(lst.slice(0, count))\n var ret = new Pool()\n ret.set(\n aid,\n new AtomList({\n notList,\n ids\n })\n )\n return ret\n}\n\nexport default {\n parseCTabV2000,\n parseRg2000,\n parseRxn2000\n}\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport Vec2 from '../../util/vec2'\n\nimport element from './../element'\nimport Struct, { Atom, AtomList, Bond, RGroup, SGroup } from './../struct/index'\n\nimport sGroup from './parseSGroup'\nimport utils from './utils'\n\nfunction parseAtomLineV3000(line) {\n // eslint-disable-line max-statements\n /* reader */\n var split, subsplit, key, value, i\n split = spaceparsplit(line)\n var params = {\n pp: new Vec2(\n parseFloat(split[2]),\n -parseFloat(split[3]),\n parseFloat(split[4])\n ),\n aam: split[5].trim()\n }\n var label = split[1].trim()\n if (label.charAt(0) == '\"' && label.charAt(label.length - 1) == '\"')\n label = label.substr(1, label.length - 2) // strip qutation marks\n if (label.charAt(label.length - 1) == ']') {\n // assume atom list\n label = label.substr(0, label.length - 1) // remove ']'\n var atomListParams = {}\n atomListParams.notList = false\n if (label.substr(0, 5) == 'NOT [') {\n atomListParams.notList = true\n label = label.substr(5) // remove 'NOT ['\n } else if (label.charAt(0) != '[') {\n throw new Error(\"Error: atom list expected, found '\" + label + \"'\")\n } else {\n label = label.substr(1) // remove '['\n }\n atomListParams.ids = labelsListToIds(label.split(','))\n params['atomList'] = new AtomList(atomListParams)\n params['label'] = 'L#'\n } else {\n params['label'] = label\n }\n split.splice(0, 6)\n for (i = 0; i < split.length; ++i) {\n subsplit = splitonce(split[i], '=')\n key = subsplit[0]\n value = subsplit[1]\n if (key in utils.fmtInfo.v30atomPropMap) {\n var ival = utils.parseDecimalInt(value)\n if (key == 'VAL') {\n if (ival == 0) continue // eslint-disable-line no-continue\n if (ival == -1) ival = 0\n }\n params[utils.fmtInfo.v30atomPropMap[key]] = ival\n } else if (key == 'RGROUPS') {\n value = value.trim().substr(1, value.length - 2)\n var rgrsplit = value.split(' ').slice(1)\n params.rglabel = 0\n for (var j = 0; j < rgrsplit.length; ++j)\n params.rglabel |= 1 << (rgrsplit[j] - 1)\n } else if (key == 'ATTCHPT') {\n params.attpnt = value.trim() - 0\n }\n }\n\n return new Atom(params)\n}\n\nfunction parseBondLineV3000(line) {\n /* reader */\n var split, subsplit, key, value, i\n split = spaceparsplit(line)\n var params = {\n begin: utils.parseDecimalInt(split[2]) - 1,\n end: utils.parseDecimalInt(split[3]) - 1,\n type: utils.fmtInfo.bondTypeMap[utils.parseDecimalInt(split[1])]\n }\n split.splice(0, 4)\n for (i = 0; i < split.length; ++i) {\n subsplit = splitonce(split[i], '=')\n key = subsplit[0]\n value = subsplit[1]\n if (key == 'CFG') {\n params.stereo =\n utils.fmtInfo.v30bondStereoMap[utils.parseDecimalInt(value)]\n if (\n params.type == Bond.PATTERN.TYPE.DOUBLE &&\n params.stereo == Bond.PATTERN.STEREO.EITHER\n )\n params.stereo = Bond.PATTERN.STEREO.CIS_TRANS\n } else if (key == 'TOPO') {\n params.topology =\n utils.fmtInfo.bondTopologyMap[utils.parseDecimalInt(value)]\n } else if (key == 'RXCTR') {\n params.reactingCenterStatus = utils.parseDecimalInt(value)\n } else if (key == 'STBOX') {\n params.stereoCare = utils.parseDecimalInt(value)\n }\n }\n return new Bond(params)\n}\n\nfunction v3000parseCollection(ctab, ctabLines, shift) {\n /* reader */\n shift++\n while (ctabLines[shift].trim() != 'M V30 END COLLECTION') shift++\n shift++\n return shift\n}\n\nfunction v3000parseSGroup(ctab, ctabLines, sgroups, atomMap, shift) {\n // eslint-disable-line max-params, max-statements\n /* reader */\n var line = ''\n shift++\n while (shift < ctabLines.length) {\n line = stripV30(ctabLines[shift++]).trim()\n if (line.trim() == 'END SGROUP') return shift\n while (line.charAt(line.length - 1) == '-')\n line = (\n line.substr(0, line.length - 1) + stripV30(ctabLines[shift++])\n ).trim()\n var split = splitSGroupDef(line)\n var type = split[1]\n var sg = new SGroup(type)\n sg.number = split[0] - 0\n sg.type = type\n sg.label = split[2] - 0\n sgroups[sg.number] = sg\n var props = {}\n for (var i = 3; i < split.length; ++i) {\n var subsplit = splitonce(split[i], '=')\n if (subsplit.length != 2)\n throw new Error(\n \"A record of form AAA=BBB or AAA=(...) expected, got '\" +\n split[i] +\n \"'\"\n )\n var name = subsplit[0]\n if (!(name in props)) props[name] = []\n props[name].push(subsplit[1])\n }\n sg.atoms = parseBracedNumberList(props['ATOMS'][0], -1)\n if (props['PATOMS'])\n sg.patoms = parseBracedNumberList(props['PATOMS'][0], -1)\n sg.bonds = props['BONDS']\n ? parseBracedNumberList(props['BONDS'][0], -1)\n : []\n var brkxyzStrs = props['BRKXYZ']\n sg.brkxyz = []\n if (brkxyzStrs) {\n for (var j = 0; j < brkxyzStrs.length; ++j)\n sg.brkxyz.push(parseBracedNumberList(brkxyzStrs[j]))\n }\n if (props['MULT']) sg.data.subscript = props['MULT'][0] - 0\n if (props['LABEL']) sg.data.subscript = props['LABEL'][0].trim()\n if (props['CONNECT'])\n sg.data.connectivity = props['CONNECT'][0].toLowerCase()\n if (props['FIELDDISP'])\n sGroup.applyDataSGroupInfo(sg, stripQuotes(props['FIELDDISP'][0]))\n if (props['FIELDDATA'])\n sGroup.applyDataSGroupData(sg, props['FIELDDATA'][0], true)\n if (props['FIELDNAME'])\n sGroup.applyDataSGroupName(sg, props['FIELDNAME'][0])\n if (props['QUERYTYPE'])\n sGroup.applyDataSGroupQuery(sg, props['QUERYTYPE'][0])\n if (props['QUERYOP']) sGroup.applyDataSGroupQueryOp(sg, props['QUERYOP'][0])\n sGroup.loadSGroup(ctab, sg, atomMap)\n }\n throw new Error('S-group declaration incomplete.')\n}\n\nfunction parseCTabV3000(ctabLines, norgroups) {\n // eslint-disable-line max-statements\n /* reader */\n var ctab = new Struct()\n\n var shift = 0\n if (ctabLines[shift++].trim() != 'M V30 BEGIN CTAB')\n throw Error('CTAB V3000 invalid')\n if (ctabLines[shift].slice(0, 13) != 'M V30 COUNTS')\n throw Error('CTAB V3000 invalid')\n var vals = ctabLines[shift].slice(14).split(' ')\n const isAbs = utils.parseDecimalInt(vals[4]) === 1\n shift++\n\n if (ctabLines[shift].trim() == 'M V30 BEGIN ATOM') {\n shift++\n var line\n while (shift < ctabLines.length) {\n line = stripV30(ctabLines[shift++]).trim()\n if (line == 'END ATOM') break\n while (line.charAt(line.length - 1) == '-')\n line = (\n line.substring(0, line.length - 1) + stripV30(ctabLines[shift++])\n ).trim()\n ctab.atoms.add(parseAtomLineV3000(line))\n }\n\n if (ctabLines[shift].trim() == 'M V30 BEGIN BOND') {\n shift++\n while (shift < ctabLines.length) {\n line = stripV30(ctabLines[shift++]).trim()\n if (line == 'END BOND') break\n while (line.charAt(line.length - 1) == '-')\n line = (\n line.substring(0, line.length - 1) + stripV30(ctabLines[shift++])\n ).trim()\n const bond = parseBondLineV3000(line)\n if (bond.stereo && isAbs) ctab.atoms.get(bond.begin).stereoLabel = 'abs'\n ctab.bonds.add(bond)\n }\n }\n\n // TODO: let sections follow in arbitrary order\n var sgroups = {}\n var atomMap = {}\n\n while (ctabLines[shift].trim() != 'M V30 END CTAB') {\n if (ctabLines[shift].trim() == 'M V30 BEGIN COLLECTION')\n // TODO: read collection information\n shift = v3000parseCollection(ctab, ctabLines, shift)\n else if (ctabLines[shift].trim() == 'M V30 BEGIN SGROUP')\n shift = v3000parseSGroup(ctab, ctabLines, sgroups, atomMap, shift)\n else throw Error('CTAB V3000 invalid')\n }\n }\n if (ctabLines[shift++].trim() != 'M V30 END CTAB')\n throw Error('CTAB V3000 invalid')\n\n if (!norgroups) readRGroups3000(ctab, ctabLines.slice(shift))\n\n return ctab\n}\n\nfunction readRGroups3000(ctab, /* string */ ctabLines) /* Struct */ {\n // eslint-disable-line max-statements\n /* reader */\n var rfrags = {}\n var rLogic = {}\n var shift = 0\n while (\n shift < ctabLines.length &&\n ctabLines[shift].search('M V30 BEGIN RGROUP') == 0\n ) {\n var id = ctabLines[shift++].split(' ').pop()\n rfrags[id] = []\n rLogic[id] = {}\n while (true) {\n // eslint-disable-line no-constant-condition\n var line = ctabLines[shift].trim()\n if (line.search('M V30 RLOGIC') == 0) {\n line = line.slice(13)\n var rlsplit = line.trim().split(/\\s+/g)\n var iii = utils.parseDecimalInt(rlsplit[0])\n var hhh = utils.parseDecimalInt(rlsplit[1])\n var ooo = rlsplit.slice(2).join(' ')\n var logic = {}\n if (iii > 0) logic.ifthen = iii\n logic.resth = hhh == 1\n logic.range = ooo\n rLogic[id] = logic\n shift++\n continue // eslint-disable-line no-continue\n }\n if (line != 'M V30 BEGIN CTAB') throw Error('CTAB V3000 invalid')\n for (var i = 0; i < ctabLines.length; ++i) {\n if (ctabLines[shift + i].trim() == 'M V30 END CTAB') break\n }\n var lines = ctabLines.slice(shift, shift + i + 1)\n var rfrag = parseCTabV3000(lines, true)\n rfrags[id].push(rfrag)\n shift = shift + i + 1\n if (ctabLines[shift].trim() == 'M V30 END RGROUP') {\n shift++\n break\n }\n }\n }\n\n Object.keys(rfrags).forEach(rgid => {\n rfrags[rgid].forEach(rg => {\n rg.rgroups.set(rgid, new RGroup(rLogic[rgid]))\n const frid = rg.frags.add({})\n rg.rgroups.get(rgid).frags.add(frid)\n rg.atoms.forEach(atom => {\n atom.fragment = frid\n })\n rg.mergeInto(ctab)\n })\n })\n}\n\nfunction parseRxn3000(\n /* string[] */ ctabLines,\n shouldReactionRelayout\n) /* Struct */ {\n // eslint-disable-line max-statements\n /* reader */\n ctabLines = ctabLines.slice(4)\n var countsSplit = ctabLines[0].split(/\\s+/g).slice(3)\n var nReactants = countsSplit[0] - 0,\n nProducts = countsSplit[1] - 0,\n nAgents = countsSplit.length > 2 ? countsSplit[2] - 0 : 0\n\n function findCtabEnd(i) {\n for (var j = i; j < ctabLines.length; ++j) {\n if (ctabLines[j].trim() == 'M V30 END CTAB') return j\n }\n\n return console.error('CTab format invalid')\n }\n\n function findRGroupEnd(i) {\n for (var j = i; j < ctabLines.length; ++j) {\n if (ctabLines[j].trim() == 'M V30 END RGROUP') return j\n }\n return console.error('CTab format invalid')\n }\n\n var molLinesReactants = []\n var molLinesProducts = []\n var current = null\n var rGroups = []\n for (var i = 0; i < ctabLines.length; ++i) {\n var line = ctabLines[i].trim()\n var j\n\n if (line.startsWith('M V30 COUNTS')) {\n // do nothing\n } else if (line == 'M END') {\n break // stop reading\n } else if (line == 'M V30 BEGIN PRODUCT') {\n console.assert(current == null, 'CTab format invalid')\n current = molLinesProducts\n } else if (line == 'M V30 END PRODUCT') {\n console.assert(current === molLinesProducts, 'CTab format invalid')\n current = null\n } else if (line == 'M V30 BEGIN REACTANT') {\n console.assert(current == null, 'CTab format invalid')\n current = molLinesReactants\n } else if (line == 'M V30 END REACTANT') {\n console.assert(current === molLinesReactants, 'CTab format invalid')\n current = null\n } else if (line.startsWith('M V30 BEGIN RGROUP')) {\n console.assert(current == null, 'CTab format invalid')\n j = findRGroupEnd(i)\n rGroups.push(ctabLines.slice(i, j + 1))\n i = j\n } else if (line == 'M V30 BEGIN CTAB') {\n j = findCtabEnd(i)\n current.push(ctabLines.slice(i, j + 1))\n i = j\n } else {\n throw new Error('line unrecognized: ' + line)\n }\n }\n var mols = []\n var molLines = molLinesReactants.concat(molLinesProducts)\n for (j = 0; j < molLines.length; ++j) {\n var mol = parseCTabV3000(molLines[j], countsSplit)\n mols.push(mol)\n }\n var ctab = utils.rxnMerge(\n mols,\n nReactants,\n nProducts,\n nAgents,\n shouldReactionRelayout\n )\n\n readRGroups3000(\n ctab,\n (function (array) {\n var res = []\n for (var k = 0; k < array.length; ++k) res = res.concat(array[k])\n return res\n })(rGroups)\n )\n\n return ctab\n}\n\n// split a line by spaces outside parentheses\nfunction spaceparsplit(line) {\n // eslint-disable-line max-statements\n /* reader */\n var split = []\n var pc = 0\n var c\n var i\n var i0 = -1\n var quoted = false\n\n for (i = 0; i < line.length; ++i) {\n c = line[i]\n if (c == '(') pc++\n else if (c == ')') pc--\n if (c == '\"') quoted = !quoted\n if (!quoted && line[i] == ' ' && pc == 0) {\n if (i > i0 + 1) split.push(line.slice(i0 + 1, i))\n i0 = i\n }\n }\n if (i > i0 + 1) split.push(line.slice(i0 + 1, i))\n return split\n}\n\n// utils\nfunction stripQuotes(str) {\n if (str[0] === '\"' && str[str.length - 1] === '\"')\n return str.substr(1, str.length - 2)\n return str\n}\n\nfunction splitonce(line, delim) {\n /* reader */\n var p = line.indexOf(delim)\n return [line.slice(0, p), line.slice(p + 1)]\n}\n\nfunction splitSGroupDef(line) {\n // eslint-disable-line max-statements\n /* reader */\n var split = []\n var braceBalance = 0\n var quoted = false\n for (var i = 0; i < line.length; ++i) {\n var c = line.charAt(i)\n if (c == '\"') {\n quoted = !quoted\n } else if (!quoted) {\n if (c == '(') {\n braceBalance++\n } else if (c == ')') {\n braceBalance--\n } else if (c == ' ' && braceBalance == 0) {\n split.push(line.slice(0, i))\n line = line.slice(i + 1).trim()\n i = 0\n }\n }\n }\n if (braceBalance != 0)\n throw new Error('Brace balance broken. S-group properies invalid!')\n if (line.length > 0) split.push(line.trim())\n return split\n}\n\nfunction parseBracedNumberList(line, shift) {\n /* reader */\n if (!line) return null\n var list = []\n line = line.trim()\n line = line.substr(1, line.length - 2)\n var split = line.split(' ')\n shift = shift || 0\n\n for (var i = 1; i < split.length; ++i) {\n var value = parseInt(split[i])\n if (!isNaN(value))\n // eslint-disable-line\n list.push(value + shift)\n }\n\n return list\n}\n\nfunction stripV30(line) {\n /* reader */\n if (line.slice(0, 7) != 'M V30 ') throw new Error('Prefix invalid')\n return line.slice(7)\n}\n\nfunction labelsListToIds(labels) {\n /* reader */\n var ids = []\n for (var i = 0; i < labels.length; ++i)\n ids.push(element.map[labels[i].trim()])\n return ids\n}\n\nexport default {\n parseCTabV3000,\n readRGroups3000,\n parseRxn3000\n}\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport v2000 from './v2000'\nimport v3000 from './v3000'\n\nimport Pile from '../../util/pile'\n\nimport { SGroup } from './../struct/index'\nimport utils from './utils'\n\nconst loadRGroupFragments = true // TODO: set to load the fragments\n\n/* Parse Mol */\nfunction parseMol(/* string */ ctabLines) /* Struct */ {\n /* reader */\n if (ctabLines[0].search('\\\\$MDL') === 0) {\n const struct = v2000.parseRg2000(ctabLines)\n struct.name = ctabLines[3].trim()\n return struct\n }\n const struct = parseCTab(ctabLines.slice(3))\n struct.name = ctabLines[0].trim()\n return struct\n}\n\nfunction parseCTab(/* string */ ctabLines) /* Struct */ {\n /* reader */\n const countsSplit = partitionLine(\n ctabLines[0],\n utils.fmtInfo.countsLinePartition\n )\n const version = countsSplit[11].trim()\n ctabLines = ctabLines.slice(1)\n if (version === 'V2000') return v2000.parseCTabV2000(ctabLines, countsSplit)\n else if (version === 'V3000')\n return v3000.parseCTabV3000(ctabLines, !loadRGroupFragments)\n else throw new Error('Molfile version unknown: ' + version) // eslint-disable-line no-else-return\n}\n\n/* Parse Rxn */\nfunction parseRxn(\n /* string[] */ ctabLines,\n shouldReactionRelayout\n) /* Struct */ {\n /* reader */\n const split = ctabLines[0].trim().split(' ')\n if (split.length > 1 && split[1] === 'V3000')\n return v3000.parseRxn3000(ctabLines, shouldReactionRelayout)\n\n const struct = v2000.parseRxn2000(ctabLines, shouldReactionRelayout)\n struct.name = ctabLines[1].trim()\n return struct\n}\n\n/* Prepare For Saving */\nconst prepareForSaving = {\n MUL: SGroup.prepareMulForSaving,\n SRU: prepareSruForSaving,\n SUP: prepareSupForSaving,\n DAT: prepareDatForSaving,\n GEN: prepareGenForSaving\n}\n\nfunction prepareSruForSaving(sgroup, mol) {\n const xBonds = []\n mol.bonds.forEach((bond, bid) => {\n const a1 = mol.atoms.get(bond.begin)\n const a2 = mol.atoms.get(bond.end)\n /* eslint-disable no-mixed-operators*/\n if (\n (a1.sgs.has(sgroup.id) && !a2.sgs.has(sgroup.id)) ||\n (a2.sgs.has(sgroup.id) && !a1.sgs.has(sgroup.id))\n )\n /* eslint-enable no-mixed-operators*/\n xBonds.push(bid)\n }, sgroup)\n if (xBonds.length !== 0 && xBonds.length !== 2) {\n throw {\n // eslint-disable-line no-throw-literal\n id: sgroup.id,\n 'error-type': 'cross-bond-number',\n message: 'Unsupported cross-bonds number'\n }\n }\n sgroup.bonds = xBonds\n}\n\nfunction prepareSupForSaving(sgroup, mol) {\n // This code is also used for GroupSru and should be moved into a separate common method\n // It seems that such code should be used for any sgroup by this this should be checked\n const xBonds = []\n mol.bonds.forEach((bond, bid) => {\n const a1 = mol.atoms.get(bond.begin)\n const a2 = mol.atoms.get(bond.end)\n /* eslint-disable no-mixed-operators*/\n if (\n (a1.sgs.has(sgroup.id) && !a2.sgs.has(sgroup.id)) ||\n (a2.sgs.has(sgroup.id) && !a1.sgs.has(sgroup.id))\n )\n /* eslint-enable no-mixed-operators*/\n xBonds.push(bid)\n }, sgroup)\n sgroup.bonds = xBonds\n}\n\nfunction prepareGenForSaving(sgroup, mol) {\n // eslint-disable-line no-unused-vars\n}\n\nfunction prepareDatForSaving(sgroup, mol) {\n sgroup.atoms = SGroup.getAtoms(mol, sgroup)\n}\n\n/* Save To Molfile */\nconst saveToMolfile = {\n MUL: saveMulToMolfile,\n SRU: saveSruToMolfile,\n SUP: saveSupToMolfile,\n DAT: saveDatToMolfile,\n GEN: saveGenToMolfile\n}\n\nfunction saveMulToMolfile(sgroup, mol, sgMap, atomMap, bondMap) {\n // eslint-disable-line max-params\n const idstr = (sgMap[sgroup.id] + '').padStart(3)\n\n let lines = []\n lines = lines.concat(\n makeAtomBondLines(\n 'SAL',\n idstr,\n Array.from(sgroup.atomSet.values()),\n atomMap\n )\n ) // TODO: check atomSet\n lines = lines.concat(\n makeAtomBondLines(\n 'SPA',\n idstr,\n Array.from(sgroup.parentAtomSet.values()),\n atomMap\n )\n )\n lines = lines.concat(makeAtomBondLines('SBL', idstr, sgroup.bonds, bondMap))\n const smtLine = 'M SMT ' + idstr + ' ' + sgroup.data.mul\n lines.push(smtLine)\n lines = lines.concat(bracketsToMolfile(mol, sgroup, idstr))\n return lines.join('\\n')\n}\n\nfunction saveSruToMolfile(sgroup, mol, sgMap, atomMap, bondMap) {\n // eslint-disable-line max-params\n const idstr = (sgMap[sgroup.id] + '').padStart(3)\n\n let lines = []\n lines = lines.concat(makeAtomBondLines('SAL', idstr, sgroup.atoms, atomMap))\n lines = lines.concat(makeAtomBondLines('SBL', idstr, sgroup.bonds, bondMap))\n lines = lines.concat(bracketsToMolfile(mol, sgroup, idstr))\n return lines.join('\\n')\n}\n\nfunction saveSupToMolfile(sgroup, mol, sgMap, atomMap, bondMap) {\n // eslint-disable-line max-params\n const idstr = (sgMap[sgroup.id] + '').padStart(3)\n\n let lines = []\n lines = lines.concat(makeAtomBondLines('SAL', idstr, sgroup.atoms, atomMap))\n lines = lines.concat(makeAtomBondLines('SBL', idstr, sgroup.bonds, bondMap))\n if (sgroup.data.name && sgroup.data.name !== '')\n lines.push('M SMT ' + idstr + ' ' + sgroup.data.name)\n return lines.join('\\n')\n}\n\nfunction saveDatToMolfile(sgroup, mol, sgMap, atomMap) {\n const idstr = (sgMap[sgroup.id] + '').padStart(3)\n\n const data = sgroup.data\n let pp = sgroup.pp\n if (!data.absolute) pp = pp.sub(SGroup.getMassCentre(mol, sgroup.atoms))\n let lines = []\n lines = lines.concat(makeAtomBondLines('SAL', idstr, sgroup.atoms, atomMap))\n let sdtLine =\n 'M SDT ' +\n idstr +\n ' ' +\n (data.fieldName || '').padEnd(30) +\n (data.fieldType || '').padStart(2) +\n (data.units || '').padEnd(20) +\n (data.query || '').padStart(2)\n\n if (data.queryOp)\n // see gitlab #184\n sdtLine += data.queryOp.padEnd(80 - 65)\n\n lines.push(sdtLine)\n const sddLine =\n 'M SDD ' +\n idstr +\n ' ' +\n utils.paddedNum(pp.x, 10, 4) +\n utils.paddedNum(-pp.y, 10, 4) +\n ' ' + // ' eee'\n (data.attached ? 'A' : 'D') + // f\n (data.absolute ? 'A' : 'R') + // g\n (data.showUnits ? 'U' : ' ') + // h\n ' ' + // i\n (data.nCharnCharsToDisplay >= 0\n ? utils.paddedNum(data.nCharnCharsToDisplay, 3)\n : 'ALL') + // jjj\n ' 1 ' + // 'kkk ll '\n (data.tagChar || ' ') + // m\n ' ' +\n utils.paddedNum(data.daspPos, 1) + // n\n ' ' // oo\n lines.push(sddLine)\n const val = normalizeNewlines(data.fieldValue).replace(/\\n*$/, '')\n const charsPerLine = 69\n val.split('\\n').forEach(chars => {\n while (chars.length > charsPerLine) {\n lines.push('M SCD ' + idstr + ' ' + chars.slice(0, charsPerLine))\n chars = chars.slice(charsPerLine)\n }\n lines.push('M SED ' + idstr + ' ' + chars)\n })\n return lines.join('\\n')\n}\n\nfunction saveGenToMolfile(sgroup, mol, sgMap, atomMap, bondMap) {\n // eslint-disable-line max-params\n const idstr = (sgMap[sgroup.id] + '').padStart(3)\n\n let lines = []\n lines = lines.concat(makeAtomBondLines('SAL', idstr, sgroup.atoms, atomMap))\n lines = lines.concat(makeAtomBondLines('SBL', idstr, sgroup.bonds, bondMap))\n lines = lines.concat(bracketsToMolfile(mol, sgroup, idstr))\n return lines.join('\\n')\n}\n\nfunction makeAtomBondLines(prefix, idstr, ids, map) {\n if (!ids) return []\n const lines = []\n for (let i = 0; i < Math.floor((ids.length + 14) / 15); ++i) {\n const rem = Math.min(ids.length - 15 * i, 15) // eslint-disable-line no-mixed-operators\n let salLine = 'M ' + prefix + ' ' + idstr + ' ' + utils.paddedNum(rem, 2)\n for (let j = 0; j < rem; ++j)\n salLine += ' ' + utils.paddedNum(map[ids[i * 15 + j]], 3) // eslint-disable-line no-mixed-operators\n lines.push(salLine)\n }\n return lines\n}\n\nfunction bracketsToMolfile(mol, sg, idstr) {\n // eslint-disable-line max-statements\n const inBonds = []\n const xBonds = []\n const atomSet = new Pile(sg.atoms)\n SGroup.getCrossBonds(inBonds, xBonds, mol, atomSet)\n SGroup.bracketPos(sg, mol, xBonds)\n const bb = sg.bracketBox\n const d = sg.bracketDir\n const n = d.rotateSC(1, 0)\n const brackets = SGroup.getBracketParameters(mol, xBonds, atomSet, bb, d, n)\n const lines = []\n for (let i = 0; i < brackets.length; ++i) {\n const bracket = brackets[i]\n const a0 = bracket.c.addScaled(bracket.n, -0.5 * bracket.h).yComplement()\n const a1 = bracket.c.addScaled(bracket.n, 0.5 * bracket.h).yComplement()\n let line = 'M SDI ' + idstr + utils.paddedNum(4, 3)\n const coord = [a0.x, a0.y, a1.x, a1.y]\n for (let j = 0; j < coord.length; ++j)\n line += utils.paddedNum(coord[j], 10, 4)\n lines.push(line)\n }\n return lines\n}\n\n// According Unicode Consortium sould be\n// nlRe = /\\r\\n|[\\n\\v\\f\\r\\x85\\u2028\\u2029]/g;\n// http://www.unicode.org/reports/tr18/#Line_Boundaries\nconst nlRe = /\\r\\n|[\\n\\r]/g\nfunction normalizeNewlines(str) {\n return str.replace(nlRe, '\\n')\n}\n\nfunction partitionLine(\n /* string*/ str,\n /* array of int*/ parts,\n /* bool*/ withspace\n) {\n /* reader */\n const res = []\n for (let i = 0, shift = 0; i < parts.length; ++i) {\n res.push(str.slice(shift, shift + parts[i]))\n if (withspace) shift++\n shift += parts[i]\n }\n return res\n}\n\nexport default {\n parseCTab,\n parseMol,\n parseRxn,\n prepareForSaving,\n saveToMolfile\n}\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport element from './../element'\n\nimport common from './common'\nimport utils from './utils'\n\nfunction Molfile(v3000) {\n /* reader */\n /* saver */\n this.molecule = null\n this.molfile = null\n this.v3000 = v3000 || false\n}\n\nMolfile.prototype.parseCTFile = function (\n molfileLines,\n shouldReactionRelayout\n) {\n let ret = null\n if (molfileLines[0].search('\\\\$RXN') === 0)\n ret = common.parseRxn(molfileLines, shouldReactionRelayout)\n else ret = common.parseMol(molfileLines)\n ret.initHalfBonds()\n ret.initNeighbors()\n ret.markFragments()\n return ret\n}\n\nMolfile.prototype.prepareSGroups = function (skipErrors, preserveIndigoDesc) {\n var mol = this.molecule\n var toRemove = []\n var errors = 0\n\n this.molecule.sGroupForest\n .getSGroupsBFS()\n .reverse()\n .forEach(id => {\n var sgroup = mol.sgroups.get(id)\n var errorIgnore = false\n\n try {\n common.prepareForSaving[sgroup.type](sgroup, mol)\n } catch (ex) {\n if (!skipErrors || typeof ex.id != 'number')\n throw new Error(`Error: ${ex.message}`)\n errorIgnore = true\n }\n /* eslint-disable no-mixed-operators*/\n if (\n errorIgnore ||\n (!preserveIndigoDesc && /^INDIGO_.+_DESC$/i.test(sgroup.data.fieldName))\n ) {\n /* eslint-enable no-mixed-operators*/\n errors += errorIgnore\n toRemove.push(sgroup.id)\n }\n }, this)\n if (errors)\n throw new Error(\n 'Warning: ' +\n errors +\n ' invalid S-groups were detected. They will be omitted.'\n )\n\n for (var i = 0; i < toRemove.length; ++i) mol.sGroupDelete(toRemove[i])\n return mol\n}\n\nMolfile.prototype.getCTab = function (molecule, rgroups) {\n /* saver */\n this.molecule = molecule.clone()\n this.prepareSGroups(false, false)\n this.molfile = ''\n this.writeCTab2000(rgroups)\n return this.molfile\n}\n\nMolfile.prototype.saveMolecule = function (\n molecule,\n skipSGroupErrors,\n norgroups,\n preserveIndigoDesc\n) {\n // eslint-disable-line max-statements\n /* saver */\n this.reaction = molecule.rxnArrows.size > 0\n if (molecule.rxnArrows.size > 1)\n throw new Error('Reaction may not contain more than one arrow')\n this.molfile = '' + molecule.name\n if (this.reaction) {\n if (molecule.rgroups.size > 0)\n throw new Error('Reactions with r-groups are not supported at the moment')\n var components = molecule.getComponents()\n\n var reactants = components.reactants\n var products = components.products\n var all = reactants.concat(products)\n this.molfile =\n '$RXN\\n' +\n molecule.name +\n '\\n\\n\\n' +\n utils.paddedNum(reactants.length, 3) +\n utils.paddedNum(products.length, 3) +\n utils.paddedNum(0, 3) +\n '\\n'\n for (var i = 0; i < all.length; ++i) {\n var saver = new Molfile(false)\n var submol = molecule.clone(all[i], null, true)\n var molfile = saver.saveMolecule(submol, false, true)\n this.molfile += '$MOL\\n' + molfile\n }\n return this.molfile\n }\n\n if (molecule.rgroups.size > 0) {\n if (norgroups) {\n molecule = molecule.getScaffold()\n } else {\n var scaffold = new Molfile(false).getCTab(\n molecule.getScaffold(),\n molecule.rgroups\n )\n this.molfile =\n '$MDL REV 1\\n$MOL\\n$HDR\\n' + molecule.name + '\\n\\n\\n$END HDR\\n'\n this.molfile += '$CTAB\\n' + scaffold + '$END CTAB\\n'\n\n molecule.rgroups.forEach((rg, rgid) => {\n this.molfile += '$RGP\\n'\n this.writePaddedNumber(rgid, 3)\n this.molfile += '\\n'\n rg.frags.forEach(fid => {\n const group = new Molfile(false).getCTab(molecule.getFragment(fid))\n this.molfile += '$CTAB\\n' + group + '$END CTAB\\n'\n })\n this.molfile += '$END RGP\\n'\n })\n this.molfile += '$END MOL\\n'\n\n return this.molfile\n }\n }\n\n this.molecule = molecule.clone()\n\n this.prepareSGroups(skipSGroupErrors, preserveIndigoDesc)\n\n this.writeHeader()\n\n // TODO: saving to V3000\n this.writeCTab2000()\n\n return this.molfile\n}\n\nMolfile.prototype.writeHeader = function () {\n /* saver */\n\n var date = new Date()\n\n this.writeCR() // TODO: write structure name\n this.writeWhiteSpace(2)\n this.write('Ketcher')\n this.writeWhiteSpace()\n this.writeCR(\n (date.getMonth() + 1 + '').padStart(2) +\n (date.getDate() + '').padStart(2) +\n ((date.getFullYear() % 100) + '').padStart(2) +\n (date.getHours() + '').padStart(2) +\n (date.getMinutes() + '').padStart(2) +\n '2D 1 1.00000 0.00000 0'\n )\n this.writeCR()\n}\n\nMolfile.prototype.write = function (str) {\n /* saver */\n this.molfile += str\n}\n\nMolfile.prototype.writeCR = function (str) {\n /* saver */\n if (arguments.length == 0) str = ''\n\n this.molfile += str + '\\n'\n}\n\nMolfile.prototype.writeWhiteSpace = function (length) {\n /* saver */\n\n if (arguments.length == 0) length = 1\n\n this.write(' '.repeat(Math.max(length, 0)))\n}\n\nMolfile.prototype.writePadded = function (str, width) {\n /* saver */\n this.write(str)\n this.writeWhiteSpace(width - str.length)\n}\n\nMolfile.prototype.writePaddedNumber = function (number, width) {\n /* saver */\n\n var str = (number - 0).toString()\n\n this.writeWhiteSpace(width - str.length)\n this.write(str)\n}\n\nMolfile.prototype.writePaddedFloat = function (number, width, precision) {\n /* saver */\n\n this.write(utils.paddedNum(number, width, precision))\n}\n\nMolfile.prototype.writeCTab2000Header = function () {\n /* saver */\n\n this.writePaddedNumber(this.molecule.atoms.size, 3)\n this.writePaddedNumber(this.molecule.bonds.size, 3)\n\n this.writePaddedNumber(0, 3)\n this.writeWhiteSpace(3)\n const isAbsFlag = Array.from(this.molecule.frags.values()).some(fr =>\n fr ? fr.enhancedStereoFlag === 'abs' : false\n )\n this.writePaddedNumber(isAbsFlag ? 1 : 0, 3)\n this.writePaddedNumber(0, 3)\n this.writeWhiteSpace(12)\n this.writePaddedNumber(999, 3)\n this.writeCR(' V2000')\n}\n\nMolfile.prototype.writeCTab2000 = function (rgroups) {\n // eslint-disable-line max-statements\n /* saver */\n this.writeCTab2000Header()\n\n this.mapping = {}\n var i = 1\n\n /* eslint-disable camelcase*/\n var atomList_list = []\n var atomProps_list = []\n /* eslint-enable camelcase*/\n this.molecule.atoms.forEach((atom, id) => {\n this.writePaddedFloat(atom.pp.x, 10, 4)\n this.writePaddedFloat(-atom.pp.y, 10, 4)\n this.writePaddedFloat(atom.pp.z, 10, 4)\n this.writeWhiteSpace()\n\n var label = atom.label\n if (atom.atomList != null) {\n label = 'L'\n atomList_list.push(id)\n } else if (atom['pseudo']) {\n if (atom['pseudo'].length > 3) {\n label = 'A'\n atomProps_list.push({ id, value: \"'\" + atom['pseudo'] + \"'\" })\n }\n } else if (atom['alias']) {\n atomProps_list.push({ id, value: atom['alias'] })\n } else if (\n !element.map[label] &&\n ['A', 'Q', 'X', '*', 'R#'].indexOf(label) == -1\n ) {\n // search in generics?\n label = 'C'\n atomProps_list.push({ id, value: atom.label })\n }\n this.writePadded(label, 3)\n this.writePaddedNumber(0, 2)\n this.writePaddedNumber(0, 3)\n this.writePaddedNumber(0, 3)\n\n if (typeof atom.hCount === 'undefined') atom.hCount = 0\n this.writePaddedNumber(atom.hCount, 3)\n\n if (typeof atom.stereoCare === 'undefined') atom.stereoCare = 0\n this.writePaddedNumber(atom.stereoCare, 3)\n\n this.writePaddedNumber(\n atom.explicitValence < 0\n ? 0\n : atom.explicitValence == 0\n ? 15\n : atom.explicitValence,\n 3\n ) // eslint-disable-line no-nested-ternary\n\n this.writePaddedNumber(0, 3)\n this.writePaddedNumber(0, 3)\n this.writePaddedNumber(0, 3)\n\n if (typeof atom.aam === 'undefined') atom.aam = 0\n this.writePaddedNumber(atom.aam, 3)\n\n if (typeof atom.invRet === 'undefined') atom.invRet = 0\n this.writePaddedNumber(atom.invRet, 3)\n\n if (typeof atom.exactChangeFlag === 'undefined') atom.exactChangeFlag = 0\n this.writePaddedNumber(atom.exactChangeFlag, 3)\n\n this.writeCR()\n\n this.mapping[id] = i\n i++\n }, this)\n\n this.bondMapping = {}\n i = 1\n this.molecule.bonds.forEach((bond, id) => {\n this.bondMapping[id] = i++\n this.writePaddedNumber(this.mapping[bond.begin], 3)\n this.writePaddedNumber(this.mapping[bond.end], 3)\n this.writePaddedNumber(bond.type, 3)\n\n if (typeof bond.stereo === 'undefined') bond.stereo = 0\n this.writePaddedNumber(bond.stereo, 3)\n\n this.writePadded(bond.xxx, 3)\n\n if (typeof bond.topology === 'undefined') bond.topology = 0\n this.writePaddedNumber(bond.topology, 3)\n\n if (typeof bond.reactingCenterStatus === 'undefined')\n bond.reactingCenterStatus = 0\n this.writePaddedNumber(bond.reactingCenterStatus, 3)\n\n this.writeCR()\n })\n\n while (atomProps_list.length > 0) {\n this.write('A ')\n this.writePaddedNumber(atomProps_list[0].id + 1, 3)\n this.writeCR()\n this.writeCR(atomProps_list[0].value)\n atomProps_list.splice(0, 1)\n }\n\n var chargeList = []\n var isotopeList = []\n var radicalList = []\n var rglabelList = []\n var rglogicList = []\n var aplabelList = []\n var rbcountList = []\n var unsaturatedList = []\n var substcountList = []\n\n this.molecule.atoms.forEach((atom, id) => {\n if (atom.charge != 0) chargeList.push([id, atom.charge])\n if (atom.isotope != 0) isotopeList.push([id, atom.isotope])\n if (atom.radical != 0) radicalList.push([id, atom.radical])\n if (atom.rglabel != null && atom.label == 'R#') {\n // TODO need to force rglabel=null when label is not 'R#'\n for (var rgi = 0; rgi < 32; rgi++)\n if (atom.rglabel & (1 << rgi)) rglabelList.push([id, rgi + 1])\n }\n if (atom.attpnt != null) aplabelList.push([id, atom.attpnt])\n if (atom.ringBondCount != 0) rbcountList.push([id, atom.ringBondCount])\n if (atom.substitutionCount != 0)\n substcountList.push([id, atom.substitutionCount])\n if (atom.unsaturatedAtom != 0)\n unsaturatedList.push([id, atom.unsaturatedAtom])\n })\n\n if (rgroups) {\n rgroups.forEach((rg, rgid) => {\n if (rg.resth || rg.ifthen > 0 || rg.range.length > 0) {\n var line =\n ' 1 ' +\n utils.paddedNum(rgid, 3) +\n ' ' +\n utils.paddedNum(rg.ifthen, 3) +\n ' ' +\n utils.paddedNum(rg.resth ? 1 : 0, 3) +\n ' ' +\n rg.range\n rglogicList.push(line)\n }\n })\n }\n\n function writeAtomPropList(propId, values) {\n while (values.length > 0) {\n var part = []\n\n while (values.length > 0 && part.length < 8) {\n part.push(values[0])\n values.splice(0, 1)\n }\n\n this.write(propId)\n this.writePaddedNumber(part.length, 3)\n\n part.forEach(value => {\n this.writeWhiteSpace()\n this.writePaddedNumber(this.mapping[value[0]], 3)\n this.writeWhiteSpace()\n this.writePaddedNumber(value[1], 3)\n })\n\n this.writeCR()\n }\n }\n\n writeAtomPropList.call(this, 'M CHG', chargeList)\n writeAtomPropList.call(this, 'M ISO', isotopeList)\n writeAtomPropList.call(this, 'M RAD', radicalList)\n writeAtomPropList.call(this, 'M RGP', rglabelList)\n for (var j = 0; j < rglogicList.length; ++j)\n this.write('M LOG' + rglogicList[j] + '\\n')\n\n writeAtomPropList.call(this, 'M APO', aplabelList)\n writeAtomPropList.call(this, 'M RBC', rbcountList)\n writeAtomPropList.call(this, 'M SUB', substcountList)\n writeAtomPropList.call(this, 'M UNS', unsaturatedList)\n\n if (atomList_list.length > 0) {\n for (j = 0; j < atomList_list.length; ++j) {\n var aid = atomList_list[j]\n var atomList = this.molecule.atoms.get(aid).atomList\n this.write('M ALS')\n this.writePaddedNumber(aid + 1, 4)\n this.writePaddedNumber(atomList.ids.length, 3)\n this.writeWhiteSpace()\n this.write(atomList.notList ? 'T' : 'F')\n\n var labelList = atomList.labelList()\n for (var k = 0; k < labelList.length; ++k) {\n this.writeWhiteSpace()\n this.writePadded(labelList[k], 3)\n }\n this.writeCR()\n }\n }\n\n var sgmap = {}\n var cnt = 1\n var sgmapback = {}\n var sgorder = this.molecule.sGroupForest.getSGroupsBFS()\n sgorder.forEach(id => {\n sgmapback[cnt] = id\n sgmap[id] = cnt++\n })\n for (var q = 1; q < cnt; ++q) {\n // each group on its own\n var id = sgmapback[q]\n var sgroup = this.molecule.sgroups.get(id)\n this.write('M STY')\n this.writePaddedNumber(1, 3)\n this.writeWhiteSpace(1)\n this.writePaddedNumber(q, 3)\n this.writeWhiteSpace(1)\n this.writePadded(sgroup.type, 3)\n this.writeCR()\n\n // TODO: write subtype, M SST\n\n this.write('M SLB')\n this.writePaddedNumber(1, 3)\n this.writeWhiteSpace(1)\n this.writePaddedNumber(q, 3)\n this.writeWhiteSpace(1)\n this.writePaddedNumber(q, 3)\n this.writeCR()\n\n var parentid = this.molecule.sGroupForest.parent.get(id)\n if (parentid >= 0) {\n this.write('M SPL')\n this.writePaddedNumber(1, 3)\n this.writeWhiteSpace(1)\n this.writePaddedNumber(q, 3)\n this.writeWhiteSpace(1)\n this.writePaddedNumber(sgmap[parentid], 3)\n this.writeCR()\n }\n\n // connectivity\n if (sgroup.type == 'SRU' && sgroup.data.connectivity) {\n var connectivity = ''\n connectivity += ' '\n connectivity += q.toString().padStart(3)\n connectivity += ' '\n connectivity += (sgroup.data.connectivity || '').padEnd(3)\n this.write('M SCN')\n this.writePaddedNumber(1, 3)\n this.write(connectivity.toUpperCase())\n this.writeCR()\n }\n\n if (sgroup.type == 'SRU') {\n this.write('M SMT ')\n this.writePaddedNumber(q, 3)\n this.writeWhiteSpace()\n this.write(sgroup.data.subscript || 'n')\n this.writeCR()\n }\n\n this.writeCR(\n common.saveToMolfile[sgroup.type](\n sgroup,\n this.molecule,\n sgmap,\n this.mapping,\n this.bondMapping\n )\n )\n }\n\n // TODO: write M APO\n // TODO: write M AAL\n // TODO: write M RGP\n // TODO: write M LOG\n\n this.writeCR('M END')\n}\n\nexport default Molfile\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport Molfile from './molfile'\n\n// TODO: reconstruct molfile string instead parsing multiple times\n// merge to bottom\nfunction parseCTFile(str, options) {\n const molfile = new Molfile()\n const lines = str.split(/\\r\\n|[\\n\\r]/g)\n try {\n return molfile.parseCTFile(lines, options.reactionRelayout)\n } catch (ex) {\n if (options.badHeaderRecover) {\n try {\n // check whether there's an extra empty line on top\n // this often happens when molfile text is pasted into the dialog window\n return molfile.parseCTFile(lines.slice(1), options.reactionRelayout)\n } catch (ex1) {\n //\n }\n try {\n // check for a missing first line\n // this sometimes happens when pasting\n return molfile.parseCTFile([''].concat(lines), options.reactionRelayout)\n } catch (ex2) {\n //\n }\n }\n throw ex\n }\n}\n\nconst molFileManager = {\n stringify(struct, options) {\n const opts = options || {}\n return new Molfile(opts.v3000).saveMolecule(\n struct,\n opts.ignoreErrors,\n opts.noRgroups,\n opts.preserveIndigoDesc\n )\n },\n parse(str, options) {\n return parseCTFile(str, options || {})\n },\n version(molFileStr) {\n let regex = /v(?:2000|3000)/im\n const match = regex.exec(molFileStr)\n if (match) {\n return match[0].toUpperCase()\n }\n return 'V2000'\n }\n}\n\nexport default molFileManager\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport Pool from '../../util/pool'\nimport Vec2 from '../../util/vec2'\n\nimport { Bond } from '../struct'\n\nfunction CisTrans(mol, neighborsFunc, context) {\n this.molecule = mol\n this.bonds = new Pool()\n this.getNeighbors = neighborsFunc\n this.context = context\n}\n\nCisTrans.PARITY = {\n NONE: 0,\n CIS: 1,\n TRANS: 2\n}\n\nCisTrans.prototype.each = function (func) {\n this.bonds.forEach(func)\n}\n\nCisTrans.prototype.getParity = function (idx) {\n return this.bonds.get(idx).parity\n}\n\nCisTrans.prototype.getSubstituents = function (idx) {\n return this.bonds.get(idx).substituents\n}\n\nCisTrans.prototype.sameside = function (beg, end, neiBeg, neiEnd) {\n var diff = Vec2.diff(beg, end)\n var norm = new Vec2(-diff.y, diff.x)\n\n if (!norm.normalize()) return 0\n\n var normBeg = Vec2.diff(neiBeg, beg)\n var normEnd = Vec2.diff(neiEnd, end)\n\n if (!normBeg.normalize()) return 0\n if (!normEnd.normalize()) return 0\n\n var prodBeg = Vec2.dot(normBeg, norm)\n var prodEnd = Vec2.dot(normEnd, norm)\n\n if (Math.abs(prodBeg) < 0.001 || Math.abs(prodEnd) < 0.001) return 0\n\n return prodBeg * prodEnd > 0 ? 1 : -1\n}\n\nCisTrans.prototype.samesides = function (iBeg, iEnd, iNeiBeg, iNeiEnd) {\n return this.sameside(\n this.molecule.atoms.get(iBeg).pp,\n this.molecule.atoms.get(iEnd).pp,\n this.molecule.atoms.get(iNeiBeg).pp,\n this.molecule.atoms.get(iNeiEnd).pp\n )\n}\n\nCisTrans.prototype.sortSubstituents = function (substituents) {\n // eslint-disable-line max-statements\n var h0 = this.molecule.atoms.get(substituents[0]).pureHydrogen()\n var h1 =\n substituents[1] < 0 ||\n this.molecule.atoms.get(substituents[1]).pureHydrogen()\n var h2 = this.molecule.atoms.get(substituents[2]).pureHydrogen()\n var h3 =\n substituents[3] < 0 ||\n this.molecule.atoms.get(substituents[3]).pureHydrogen()\n\n if (h0 && h1) return false\n if (h2 && h3) return false\n\n if (h1) {\n substituents[1] = -1\n } else if (h0) {\n substituents[0] = substituents[1]\n substituents[1] = -1\n } else if (substituents[0] > substituents[1]) {\n swap(substituents, 0, 1)\n }\n\n if (h3) {\n substituents[3] = -1\n } else if (h2) {\n substituents[2] = substituents[3]\n substituents[3] = -1\n } else if (substituents[2] > substituents[3]) {\n swap(substituents, 2, 3)\n }\n\n return true\n}\n\nCisTrans.prototype.isGeomStereoBond = function (bondIdx, substituents) {\n // eslint-disable-line max-statements\n // it must be [C,N,Si]=[C,N,Si] bond\n var bond = this.molecule.bonds.get(bondIdx)\n\n if (bond.type != Bond.PATTERN.TYPE.DOUBLE) return false\n\n var label1 = this.molecule.atoms.get(bond.begin).label\n var label2 = this.molecule.atoms.get(bond.end).label\n\n if (label1 != 'C' && label1 != 'N' && label1 != 'Si' && label1 != 'Ge')\n return false\n if (label2 != 'C' && label2 != 'N' && label2 != 'Si' && label2 != 'Ge')\n return false\n\n // the atoms should have 1 or 2 single bonds\n // (apart from the double bond under consideration)\n var neiBegin = this.getNeighbors.call(this.context, bond.begin)\n var neiЕnd = this.getNeighbors.call(this.context, bond.end)\n\n if (\n neiBegin.length < 2 ||\n neiBegin.length > 3 ||\n neiЕnd.length < 2 ||\n neiЕnd.length > 3\n )\n return false\n\n substituents[0] = -1\n substituents[1] = -1\n substituents[2] = -1\n substituents[3] = -1\n\n var i\n var nei\n\n for (i = 0; i < neiBegin.length; i++) {\n nei = neiBegin[i]\n\n if (nei.bid == bondIdx) continue // eslint-disable-line no-continue\n\n if (this.molecule.bonds.get(nei.bid).type != Bond.PATTERN.TYPE.SINGLE)\n return false\n\n if (substituents[0] == -1) substituents[0] = nei.aid\n // (substituents[1] == -1)\n else substituents[1] = nei.aid\n }\n\n for (i = 0; i < neiЕnd.length; i++) {\n nei = neiЕnd[i]\n\n if (nei.bid == bondIdx) continue // eslint-disable-line no-continue\n\n if (this.molecule.bonds.get(nei.bid).type != Bond.PATTERN.TYPE.SINGLE)\n return false\n\n if (substituents[2] == -1) substituents[2] = nei.aid\n // (substituents[3] == -1)\n else substituents[3] = nei.aid\n }\n\n if (\n substituents[1] != -1 &&\n this.samesides(bond.begin, bond.end, substituents[0], substituents[1]) != -1\n )\n return false\n if (\n substituents[3] != -1 &&\n this.samesides(bond.begin, bond.end, substituents[2], substituents[3]) != -1\n )\n return false\n\n return true\n}\n\nCisTrans.prototype.build = function (excludeBonds) {\n this.molecule.bonds.forEach((bond, bid) => {\n const ct = {\n parity: 0,\n substituents: []\n }\n this.bonds.set(bid, ct)\n\n if (Array.isArray(excludeBonds) && excludeBonds[bid]) return\n\n if (!this.isGeomStereoBond(bid, ct.substituents)) return\n\n if (!this.sortSubstituents(ct.substituents)) return\n\n const sign = this.samesides(\n bond.begin,\n bond.end,\n ct.substituents[0],\n ct.substituents[2]\n )\n\n if (sign === 1) ct.parity = CisTrans.PARITY.CIS\n else if (sign === -1) ct.parity = CisTrans.PARITY.TRANS\n })\n}\n\nfunction swap(arr, i1, i2) {\n var tmp = arr[i1]\n arr[i1] = arr[i2]\n arr[i2] = tmp\n}\n\nexport default CisTrans\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nfunction Dfs(mol, atomData, components, nReactants) {\n this.molecule = mol\n this.atom_data = atomData\n this.components = components\n this.nComponentsInReactants = -1\n this.nReactants = nReactants\n\n this.vertices = new Array(this.molecule.atoms.size) // Minimum size\n this.molecule.atoms.forEach((atom, aid) => {\n this.vertices[aid] = new Dfs.VertexDesc()\n }, this)\n\n this.edges = new Array(this.molecule.bonds.size) // Minimum size\n this.molecule.bonds.forEach((bond, bid) => {\n this.edges[bid] = new Dfs.EdgeDesc()\n }, this)\n\n this.v_seq = []\n}\n\nDfs.VertexDesc = function () {\n this.dfs_state = 0 // 0 -- not on stack\n // 1 -- on stack\n // 2 -- removed from stack\n this.parent_vertex = 0 // parent vertex in DFS tree\n this.parent_edge = 0 // edge to parent vertex\n this.branches = 0 // how many DFS branches go out from this vertex}\n}\n\nDfs.EdgeDesc = function () {\n this.opening_cycles = 0 // how many cycles are\n // (i) starting with this edge\n // and (ii) ending in this edge's first vertex\n this.closing_cycle = 0 // 1 if this edge closes a cycle\n}\n\nDfs.SeqElem = function (vIdx, parVertex, parEdge) {\n this.idx = vIdx // index of vertex in _graph\n this.parent_vertex = parVertex // parent vertex in DFS tree\n this.parent_edge = parEdge // edge to parent vertex\n}\n\nDfs.prototype.walk = function () {\n // eslint-disable-line max-statements\n var vStack = []\n var i, j\n var cid = 0\n var component = 0\n\n while (true) {\n // eslint-disable-line no-constant-condition\n if (vStack.length < 1) {\n var selected = -1\n\n while (cid < this.components.length && selected == -1) {\n selected = this.components[cid].find(aid => {\n if (this.vertices[aid].dfs_state === 0) {\n selected = aid\n return true\n }\n return false\n })\n if (selected === null) {\n selected = -1\n cid++\n }\n if (cid == this.nReactants) this.nComponentsInReactants = component\n }\n if (selected < -1) {\n this.molecule.atoms.find(aid => {\n if (this.vertices[aid].dfs_state === 0) {\n selected = aid\n return true\n }\n return false\n })\n }\n if (selected == -1) break\n this.vertices[selected].parent_vertex = -1\n this.vertices[selected].parent_edge = -1\n vStack.push(selected)\n component++\n }\n\n var vIdx = vStack.pop()\n var parentVertex = this.vertices[vIdx].parent_vertex\n\n var seqElem = new Dfs.SeqElem(\n vIdx,\n parentVertex,\n this.vertices[vIdx].parent_edge\n )\n this.v_seq.push(seqElem)\n\n this.vertices[vIdx].dfs_state = 2\n\n var atomD = this.atom_data[vIdx]\n\n for (i = 0; i < atomD.neighbours.length; i++) {\n var neiIdx = atomD.neighbours[i].aid\n var edgeIdx = atomD.neighbours[i].bid\n\n if (neiIdx == parentVertex) continue // eslint-disable-line no-continue\n\n if (this.vertices[neiIdx].dfs_state == 2) {\n this.edges[edgeIdx].closing_cycle = 1\n\n j = vIdx\n\n while (j != -1 && this.vertices[j].parent_vertex != neiIdx)\n j = this.vertices[j].parent_vertex\n\n if (j == -1) throw new Error('cycle unwind error')\n\n this.edges[this.vertices[j].parent_edge].opening_cycles++\n this.vertices[vIdx].branches++\n\n seqElem = new Dfs.SeqElem(neiIdx, vIdx, edgeIdx)\n this.v_seq.push(seqElem)\n } else {\n if (this.vertices[neiIdx].dfs_state == 1) {\n j = vStack.indexOf(neiIdx)\n\n if (j == -1)\n // eslint-disable-line max-depth\n throw new Error('internal: removing vertex from stack')\n\n vStack.splice(j, 1)\n\n var parent = this.vertices[neiIdx].parent_vertex\n\n if (parent >= 0)\n // eslint-disable-line max-depth\n this.vertices[parent].branches--\n }\n\n this.vertices[vIdx].branches++\n this.vertices[neiIdx].parent_vertex = vIdx\n this.vertices[neiIdx].parent_edge = edgeIdx\n this.vertices[neiIdx].dfs_state = 1\n vStack.push(neiIdx)\n }\n }\n }\n}\n\nDfs.prototype.edgeClosingCycle = function (eIdx) {\n return this.edges[eIdx].closing_cycle !== 0\n}\n\nDfs.prototype.numBranches = function (vIdx) {\n return this.vertices[vIdx].branches\n}\n\nDfs.prototype.numOpeningCycles = function (eIdx) {\n return this.edges[eIdx].opening_cycles\n}\n\nDfs.prototype.toString = function () {\n var str = ''\n this.v_seq.forEach(seqElem => {\n str += seqElem.idx + ' -> '\n })\n str += '*'\n return str\n}\n\nexport default Dfs\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport Vec2 from '../../util/vec2'\nimport Pool from '../../util/pool'\nimport Pile from '../../util/pile'\nimport { Bond } from '../struct'\n\nfunction Stereocenters(mol, neighborsFunc, context) {\n this.molecule = mol\n this.atoms = new Pool()\n this.getNeighbors = neighborsFunc\n this.context = context\n}\n\nStereocenters.prototype.each = function (func, context) {\n this.atoms.forEach(func, context)\n}\n\nStereocenters.prototype.buildFromBonds = function (\n /* const int *atom_types, const int *atom_groups, const int *bond_orientations, */ ignoreErrors\n) {\n var atoms = this.molecule.atoms\n var bonds = this.molecule.bonds\n\n /*\n\t\tthis is a set of atoms that are likely to belong to allene structures and\n\t\ttherefore should not be considered as potential stereocenters in the code below,\n\t\tas allenes cannot be encoded in the SMILES notation\n\t*/\n\n var alleneMask = new Pile()\n atoms.forEach((atom, aid) => {\n var neiList = this.getNeighbors.call(this.context, aid)\n if (neiList.length !== 2) return false\n var nei1 = neiList[0]\n var nei2 = neiList[1]\n // check atom labels\n if (\n [aid, nei1.aid, nei2.aid].findIndex(\n aid => ['C', 'Si'].indexOf(atoms.get(aid).label) < 0,\n this\n ) >= 0\n )\n return false\n\n // check adjacent bond types\n if (\n [nei1.bid, nei2.bid].findIndex(\n bid => bonds.get(bid).type !== Bond.PATTERN.TYPE.DOUBLE,\n this\n ) >= 0\n )\n return false\n\n // get the other neighbors of the two adjacent atoms except for the central atom\n var nei1nei = this.getNeighbors\n .call(this.context, nei1.aid)\n .filter(nei => nei.aid != aid)\n var nei2nei = this.getNeighbors\n .call(this.context, nei2.aid)\n .filter(nei => nei.aid != aid)\n if (\n nei1nei.length < 1 ||\n nei1nei.length > 2 ||\n nei2nei.length < 1 ||\n nei2nei.length > 2\n )\n return false\n\n if (\n nei1nei\n .concat(nei2nei)\n .findIndex(\n nei => bonds.get(nei.bid).type != Bond.PATTERN.TYPE.SINGLE,\n this\n ) >= 0\n )\n return false\n\n if (\n nei1nei\n .concat(nei2nei)\n .findIndex(\n nei => bonds.get(nei.bid).stereo == Bond.PATTERN.STEREO.EITHER,\n this\n ) >= 0\n )\n return false\n alleneMask.add(nei1.aid).add(nei2.aid)\n return true\n })\n\n if (alleneMask.size > 0)\n //TODO: add error handler call\n //legacy message: This structure may contain allenes, which cannot be represented in the SMILES notation. Relevant stereo-information will be discarded.\n\n atoms.forEach((atom, aid) => {\n if (alleneMask.has(aid)) return\n /*\n if (atom_types[atom_idx] == 0)\n continue;\n */\n var neiList = this.getNeighbors.call(this.context, aid)\n var stereocenter = false\n\n neiList.find(function (nei) {\n var bond = this.molecule.bonds.get(nei.bid)\n\n if (bond.type === Bond.PATTERN.TYPE.SINGLE && bond.begin == aid) {\n if (\n bond.stereo === Bond.PATTERN.STEREO.UP ||\n bond.stereo == Bond.PATTERN.STEREO.DOWN\n ) {\n stereocenter = true\n return true\n }\n }\n return false\n }, this)\n\n if (!stereocenter) return\n\n if (ignoreErrors)\n this.buildOneCenter(\n aid /* , atom_groups[atom_idx], atom_types[atom_idx], bond_orientations*/\n )\n else\n this.buildOneCenter(\n aid /* , atom_groups[atom_idx], atom_types[atom_idx], bond_orientations*/\n )\n })\n}\n\nStereocenters.allowed_stereocenters = [\n { elem: 'C', charge: 0, degree: 3, n_double_bonds: 0, implicit_degree: 4 },\n { elem: 'C', charge: 0, degree: 4, n_double_bonds: 0, implicit_degree: 4 },\n { elem: 'Si', charge: 0, degree: 3, n_double_bonds: 0, implicit_degree: 4 },\n { elem: 'Si', charge: 0, degree: 4, n_double_bonds: 0, implicit_degree: 4 },\n { elem: 'N', charge: 1, degree: 3, n_double_bonds: 0, implicit_degree: 4 },\n { elem: 'N', charge: 1, degree: 4, n_double_bonds: 0, implicit_degree: 4 },\n { elem: 'N', charge: 0, degree: 3, n_double_bonds: 0, implicit_degree: 3 },\n { elem: 'S', charge: 0, degree: 4, n_double_bonds: 2, implicit_degree: 4 },\n { elem: 'S', charge: 1, degree: 3, n_double_bonds: 0, implicit_degree: 3 },\n { elem: 'S', charge: 0, degree: 3, n_double_bonds: 1, implicit_degree: 3 },\n { elem: 'P', charge: 0, degree: 3, n_double_bonds: 0, implicit_degree: 3 },\n { elem: 'P', charge: 1, degree: 4, n_double_bonds: 0, implicit_degree: 4 },\n { elem: 'P', charge: 0, degree: 4, n_double_bonds: 1, implicit_degree: 4 }\n]\n\nStereocenters.prototype.buildOneCenter = function (\n atomIdx /* , int group, int type, const int *bond_orientations*/\n) {\n // eslint-disable-line max-statements\n var atom = this.molecule.atoms.get(atomIdx)\n\n var neiList = this.getNeighbors.call(this.context, atomIdx)\n var degree = neiList.length\n var implicitDegree = -1\n\n var stereocenter = {\n group: 0, // = group;\n type: 0, // = type;\n pyramid: []\n }\n\n var edgeIds = []\n\n var lastAtomDir = 0\n var nDoubleBonds = 0\n\n stereocenter.pyramid[0] = -1\n stereocenter.pyramid[1] = -1\n stereocenter.pyramid[2] = -1\n stereocenter.pyramid[3] = -1\n\n var nPureHydrogens = 0\n\n if (degree > 4)\n throw new Error('stereocenter with %d bonds are not supported' + degree)\n\n neiList.forEach((nei, neiIdx) => {\n var neiAtom = this.molecule.atoms.get(nei.aid)\n var bond = this.molecule.bonds.get(nei.bid)\n edgeIds[neiIdx] = {\n edge_idx: nei.bid,\n nei_idx: nei.aid,\n rank: nei.aid,\n vec: Vec2.diff(neiAtom.pp, atom.pp).yComplement()\n }\n\n if (neiAtom.pureHydrogen()) {\n nPureHydrogens++\n edgeIds[neiIdx].rank = 10000\n } else if (neiAtom.label === 'H') {\n edgeIds[neiIdx].rank = 5000\n }\n\n if (!edgeIds[neiIdx].vec.normalize()) throw new Error('zero bond length')\n\n if (bond.type === Bond.PATTERN.TYPE.TRIPLE)\n throw new Error('non-single bonds not allowed near stereocenter')\n else if (bond.type === Bond.PATTERN.TYPE.AROMATIC)\n throw new Error('aromatic bonds not allowed near stereocenter')\n else if (bond.type === Bond.PATTERN.TYPE.DOUBLE) nDoubleBonds++\n })\n\n Stereocenters.allowed_stereocenters.find(as => {\n if (\n as.elem === atom.label &&\n as.charge === atom.charge &&\n as.degree === degree &&\n as.n_double_bonds === nDoubleBonds\n ) {\n implicitDegree = as.implicit_degree\n return true\n }\n return false\n })\n\n if (implicitDegree === -1)\n throw new Error(\n 'unknown stereocenter configuration: ' +\n atom.label +\n ', charge ' +\n atom.charge +\n ', ' +\n degree +\n ' bonds (' +\n nDoubleBonds +\n ' double)'\n )\n\n if (degree === 4 && nPureHydrogens > 1)\n throw new Error(nPureHydrogens + ' hydrogens near stereocenter')\n\n if (degree === 3 && implicitDegree === 4 && nPureHydrogens > 0)\n throw new Error(\n 'have hydrogen(s) besides implicit hydrogen near stereocenter'\n )\n\n if (degree === 4) {\n // sort by neighbor atom index (ascending)\n if (edgeIds[0].rank > edgeIds[1].rank) swap(edgeIds, 0, 1)\n if (edgeIds[1].rank > edgeIds[2].rank) swap(edgeIds, 1, 2)\n if (edgeIds[2].rank > edgeIds[3].rank) swap(edgeIds, 2, 3)\n if (edgeIds[1].rank > edgeIds[2].rank) swap(edgeIds, 1, 2)\n if (edgeIds[0].rank > edgeIds[1].rank) swap(edgeIds, 0, 1)\n if (edgeIds[1].rank > edgeIds[2].rank) swap(edgeIds, 1, 2)\n\n var main1 = -1\n var main2 = -1\n var side1 = -1\n var side2 = -1\n var mainDir = 0\n\n for (var neiIdx = 0; neiIdx < 4; neiIdx++) {\n var stereo = this.getBondStereo(atomIdx, edgeIds[neiIdx].edge_idx)\n\n if (\n stereo === Bond.PATTERN.STEREO.UP ||\n stereo == Bond.PATTERN.STEREO.DOWN\n ) {\n main1 = neiIdx\n mainDir = stereo\n break\n }\n }\n\n if (main1 === -1)\n throw new Error('none of 4 bonds going from stereocenter is stereobond')\n\n var xyz1, xyz2\n\n // find main2 as opposite to main1\n if (main2 === -1) {\n xyz1 = Stereocenters.xyzzy(\n edgeIds[main1].vec,\n edgeIds[(main1 + 1) % 4].vec,\n edgeIds[(main1 + 2) % 4].vec\n )\n xyz2 = Stereocenters.xyzzy(\n edgeIds[main1].vec,\n edgeIds[(main1 + 1) % 4].vec,\n edgeIds[(main1 + 3) % 4].vec\n )\n\n if (xyz1 + xyz2 == 3 || xyz1 + xyz2 == 12) {\n main2 = (main1 + 1) % 4\n side1 = (main1 + 2) % 4\n side2 = (main1 + 3) % 4\n }\n }\n if (main2 == -1) {\n xyz1 = Stereocenters.xyzzy(\n edgeIds[main1].vec,\n edgeIds[(main1 + 2) % 4].vec,\n edgeIds[(main1 + 1) % 4].vec\n )\n xyz2 = Stereocenters.xyzzy(\n edgeIds[main1].vec,\n edgeIds[(main1 + 2) % 4].vec,\n edgeIds[(main1 + 3) % 4].vec\n )\n\n if (xyz1 + xyz2 == 3 || xyz1 + xyz2 == 12) {\n main2 = (main1 + 2) % 4\n side1 = (main1 + 1) % 4\n side2 = (main1 + 3) % 4\n }\n }\n if (main2 == -1) {\n xyz1 = Stereocenters.xyzzy(\n edgeIds[main1].vec,\n edgeIds[(main1 + 3) % 4].vec,\n edgeIds[(main1 + 1) % 4].vec\n )\n xyz2 = Stereocenters.xyzzy(\n edgeIds[main1].vec,\n edgeIds[(main1 + 3) % 4].vec,\n edgeIds[(main1 + 2) % 4].vec\n )\n\n if (xyz1 + xyz2 == 3 || xyz1 + xyz2 == 12) {\n main2 = (main1 + 3) % 4\n side1 = (main1 + 2) % 4\n side2 = (main1 + 1) % 4\n }\n }\n\n if (main2 == -1)\n throw new Error('internal error: can not find opposite bond')\n\n if (\n mainDir == Bond.PATTERN.STEREO.UP &&\n this.getBondStereo(atomIdx, edgeIds[main2].edge_idx) ==\n Bond.PATTERN.STEREO.DOWN\n )\n throw new Error('stereo types of the opposite bonds mismatch')\n if (\n mainDir == Bond.PATTERN.STEREO.DOWN &&\n this.getBondStereo(atomIdx, edgeIds[main2].edge_idx) ==\n Bond.PATTERN.STEREO.UP\n )\n throw new Error('stereo types of the opposite bonds mismatch')\n\n if (mainDir == this.getBondStereo(atomIdx, edgeIds[side1].edge_idx))\n throw new Error('stereo types of non-opposite bonds match')\n if (mainDir == this.getBondStereo(atomIdx, edgeIds[side2].edge_idx))\n throw new Error('stereo types of non-opposite bonds match')\n\n if (main1 == 3 || main2 == 3) lastAtomDir = mainDir\n else\n lastAtomDir =\n mainDir == Bond.PATTERN.STEREO.UP\n ? Bond.PATTERN.STEREO.DOWN\n : Bond.PATTERN.STEREO.UP\n\n sign = Stereocenters.sign(edgeIds[0].vec, edgeIds[1].vec, edgeIds[2].vec)\n\n if (\n (lastAtomDir == Bond.PATTERN.STEREO.UP && sign > 0) ||\n (lastAtomDir == Bond.PATTERN.STEREO.DOWN && sign < 0)\n ) {\n stereocenter.pyramid[0] = edgeIds[0].nei_idx\n stereocenter.pyramid[1] = edgeIds[1].nei_idx\n stereocenter.pyramid[2] = edgeIds[2].nei_idx\n } else {\n stereocenter.pyramid[0] = edgeIds[0].nei_idx\n stereocenter.pyramid[1] = edgeIds[2].nei_idx\n stereocenter.pyramid[2] = edgeIds[1].nei_idx\n }\n\n stereocenter.pyramid[3] = edgeIds[3].nei_idx\n } else if (degree === 3) {\n // sort by neighbor atom index (ascending)\n if (edgeIds[0].rank > edgeIds[1].rank) swap(edgeIds, 0, 1)\n if (edgeIds[1].rank > edgeIds[2].rank) swap(edgeIds, 1, 2)\n if (edgeIds[0].rank > edgeIds[1].rank) swap(edgeIds, 0, 1)\n\n var stereo0 = this.getBondStereo(atomIdx, edgeIds[0].edge_idx)\n var stereo1 = this.getBondStereo(atomIdx, edgeIds[1].edge_idx)\n var stereo2 = this.getBondStereo(atomIdx, edgeIds[2].edge_idx)\n\n var nUp = 0\n var nDown = 0\n\n nUp += stereo0 === Bond.PATTERN.STEREO.UP ? 1 : 0\n nUp += stereo1 === Bond.PATTERN.STEREO.UP ? 1 : 0\n nUp += stereo2 === Bond.PATTERN.STEREO.UP ? 1 : 0\n\n nDown += stereo0 === Bond.PATTERN.STEREO.DOWN ? 1 : 0\n nDown += stereo1 === Bond.PATTERN.STEREO.DOWN ? 1 : 0\n nDown += stereo2 === Bond.PATTERN.STEREO.DOWN ? 1 : 0\n\n if (implicitDegree == 4) {\n // have implicit hydrogen\n if (nUp == 3) throw new Error('all 3 bonds up near stereoatom')\n if (nDown == 3) throw new Error('all 3 bonds down near stereoatom')\n\n if (nUp == 0 && nDown == 0)\n throw new Error('no up/down bonds near stereoatom -- indefinite case')\n if (nUp == 1 && nDown == 1)\n throw new Error('one bond up, one bond down -- indefinite case')\n\n mainDir = 0\n\n if (nUp == 2) {\n lastAtomDir = Bond.PATTERN.STEREO.DOWN\n } else if (nDown == 2) {\n lastAtomDir = Bond.PATTERN.STEREO.UP\n } else {\n main1 = -1\n side1 = -1\n side2 = -1\n\n for (neiIdx = 0; neiIdx < 3; neiIdx++) {\n dir = this.getBondStereo(atomIdx, edgeIds[neiIdx].edge_idx)\n\n if (\n dir == Bond.PATTERN.STEREO.UP ||\n dir == Bond.PATTERN.STEREO.DOWN\n ) {\n // eslint-disable-line max-depth\n main1 = neiIdx\n mainDir = dir\n side1 = (neiIdx + 1) % 3\n side2 = (neiIdx + 2) % 3\n break\n }\n }\n\n if (main1 == -1)\n throw new Error('internal error: can not find up or down bond')\n\n var xyz = Stereocenters.xyzzy(\n edgeIds[side1].vec,\n edgeIds[side2].vec,\n edgeIds[main1].vec\n )\n\n if (xyz == 3 || xyz == 4)\n throw new Error('degenerate case for 3 bonds near stereoatom')\n\n if (xyz == 1) lastAtomDir = mainDir\n else\n lastAtomDir =\n mainDir == Bond.PATTERN.STEREO.UP\n ? Bond.PATTERN.STEREO.DOWN\n : Bond.PATTERN.STEREO.UP\n }\n\n var sign = Stereocenters.sign(\n edgeIds[0].vec,\n edgeIds[1].vec,\n edgeIds[2].vec\n )\n\n if (\n (lastAtomDir == Bond.PATTERN.STEREO.UP && sign > 0) ||\n (lastAtomDir == Bond.PATTERN.STEREO.DOWN && sign < 0)\n ) {\n stereocenter.pyramid[0] = edgeIds[0].nei_idx\n stereocenter.pyramid[1] = edgeIds[1].nei_idx\n stereocenter.pyramid[2] = edgeIds[2].nei_idx\n } else {\n stereocenter.pyramid[0] = edgeIds[0].nei_idx\n stereocenter.pyramid[1] = edgeIds[2].nei_idx\n stereocenter.pyramid[2] = edgeIds[1].nei_idx\n }\n\n stereocenter.pyramid[3] = -1\n } else {\n // 3-connected P, N or S; no implicit hydrogens\n var dir\n\n if (nDown > 0 && nUp > 0)\n throw new Error('one bond up, one bond down -- indefinite case')\n else if (nDown == 0 && nUp == 0)\n throw new Error('no up-down bonds attached to stereocenter')\n else if (nUp > 0) dir = 1\n else dir = -1\n\n if (\n Stereocenters.xyzzy(edgeIds[0].vec, edgeIds[1].vec, edgeIds[2].vec) ===\n 1 ||\n Stereocenters.xyzzy(edgeIds[0].vec, edgeIds[2].vec, edgeIds[1].vec) ===\n 1 ||\n Stereocenters.xyzzy(edgeIds[2].vec, edgeIds[1].vec, edgeIds[0].vec) ===\n 1\n )\n // all bonds belong to the same half-plane\n dir = -dir\n\n sign = Stereocenters.sign(edgeIds[0].vec, edgeIds[1].vec, edgeIds[2].vec)\n\n if (sign == dir) {\n stereocenter.pyramid[0] = edgeIds[0].nei_idx\n stereocenter.pyramid[1] = edgeIds[2].nei_idx\n stereocenter.pyramid[2] = edgeIds[1].nei_idx\n } else {\n stereocenter.pyramid[0] = edgeIds[0].nei_idx\n stereocenter.pyramid[1] = edgeIds[1].nei_idx\n stereocenter.pyramid[2] = edgeIds[2].nei_idx\n }\n stereocenter.pyramid[3] = -1\n }\n }\n this.atoms.set(atomIdx, stereocenter)\n}\n\nStereocenters.prototype.getBondStereo = function (centerIdx, edgeIdx) {\n var bond = this.molecule.bonds.get(edgeIdx)\n\n if (centerIdx != bond.begin)\n // TODO: check this\n return 0\n\n return bond.stereo\n}\n\n// 1 -- in the smaller angle, 2 -- in the bigger angle,\n// 4 -- in the 'positive' straight angle, 8 -- in the 'negative' straight angle\nStereocenters.xyzzy = function (v1, v2, u) {\n var eps = 0.001\n\n var sine1 = Vec2.cross(v1, v2)\n var cosine1 = Vec2.dot(v1, v2)\n\n var sine2 = Vec2.cross(v1, u)\n var cosine2 = Vec2.dot(v1, u)\n\n if (Math.abs(sine1) < eps) {\n if (Math.abs(sine2) < eps)\n throw new Error('degenerate case -- bonds overlap')\n\n return sine2 > 0 ? 4 : 8\n }\n\n if (sine1 * sine2 < -eps * eps) return 2\n\n if (cosine2 < cosine1) return 2\n\n return 1\n}\n\nStereocenters.sign = function (v1, v2, v3) {\n var res = (v1.x - v3.x) * (v2.y - v3.y) - (v1.y - v3.y) * (v2.x - v3.x) // eslint-disable-line no-mixed-operators\n var eps = 0.001\n\n if (res > eps) return 1\n if (res < -eps) return -1\n\n throw new Error('degenerate triangle')\n}\n\nStereocenters.isPyramidMappingRigid = function (mapping) {\n var arr = mapping.slice()\n var rigid = true\n\n if (arr[0] > arr[1]) {\n swap(arr, 0, 1)\n rigid = !rigid\n }\n if (arr[1] > arr[2]) {\n swap(arr, 1, 2)\n rigid = !rigid\n }\n if (arr[2] > arr[3]) {\n swap(arr, 2, 3)\n rigid = !rigid\n }\n if (arr[1] > arr[2]) {\n swap(arr, 1, 2)\n rigid = !rigid\n }\n if (arr[0] > arr[1]) {\n swap(arr, 0, 1)\n rigid = !rigid\n }\n if (arr[1] > arr[2]) {\n swap(arr, 1, 2)\n rigid = !rigid\n }\n\n return rigid\n}\n\nfunction swap(arr, i1, i2) {\n var tmp = arr[i1]\n arr[i1] = arr[i2]\n arr[i2] = tmp\n}\n\nexport default Stereocenters\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport Pile from '../../util/pile'\nimport { Atom, Bond, SGroup } from '../struct'\nimport CisTrans from './cis_trans'\nimport Dfs from './dfs'\nimport Stereocenters from './stereocenters'\n\nfunction Smiles() {\n this.smiles = ''\n this.writtenAtoms = []\n this.writtenComponents = 0\n\n this.ignore_errors = false\n}\n\nSmiles._Atom = function (hСount) {\n // eslint-disable-line no-underscore-dangle\n this.neighbours = [] // Array of integer pairs {a, b}\n this.aromatic = false // has aromatic bond\n this.lowercase = false // aromatic and has to be written lowercase\n this.chirality = 0 // 0 means no chirality, 1 means CCW pyramid, 2 means CW pyramid\n this.branch_cnt = 0 // runs from 0 to (branches - 1)\n this.paren_written = false\n this.h_count = hСount\n this.parent = -1\n}\n\n// NB: only loops of length up to 6 are included here\nSmiles.prototype.isBondInRing = function (bid) {\n console.assert(this.inLoop, 'Init this.inLoop prior to calling this method')\n return this.inLoop[bid]\n}\n\nSmiles.prototype.saveMolecule = function (molecule, ignoreErrors) {\n // eslint-disable-line max-statements\n var i, j, k\n\n if (!ignoreErrors) this.ignore_errors = ignoreErrors\n\n // [RB]: KETCHER-498 (Incorrect smile-string for multiple Sgroup)\n // TODO the fix is temporary, still need to implement error handling/reporting\n // BEGIN\n molecule = molecule.clone()\n molecule.initHalfBonds()\n molecule.initNeighbors()\n molecule.sortNeighbors()\n molecule.setImplicitHydrogen()\n molecule.sgroups.forEach(sg => {\n if (sg.type === 'MUL') {\n try {\n SGroup.prepareMulForSaving(sg, molecule)\n } catch (ex) {\n throw Error('Bad s-group (' + ex.message + ')')\n }\n }\n // 'SMILES data format doesn\\'t support s-groups'\n })\n // END\n\n this.atoms = new Array(molecule.atoms.size)\n\n molecule.atoms.forEach((atom, aid) => {\n this.atoms[aid] = new Smiles._Atom(atom.implicitH) // eslint-disable-line no-underscore-dangle\n })\n\n // From the SMILES specification:\n // Please note that only atoms on the following list\n // can be considered aromatic: C, N, O, P, S, As, Se, and * (wildcard).\n var allowedLowercase = ['B', 'C', 'N', 'O', 'P', 'S', 'Se', 'As']\n\n // Detect atoms that have aromatic bonds and count neighbours\n molecule.bonds.forEach((bond, bid) => {\n if (bond.type === Bond.PATTERN.TYPE.AROMATIC) {\n this.atoms[bond.begin].aromatic = true\n if (allowedLowercase.indexOf(molecule.atoms.get(bond.begin).label) !== -1)\n this.atoms[bond.begin].lowercase = true\n this.atoms[bond.end].aromatic = true\n if (allowedLowercase.indexOf(molecule.atoms.get(bond.end).label) !== -1)\n this.atoms[bond.end].lowercase = true\n }\n this.atoms[bond.begin].neighbours.push({ aid: bond.end, bid })\n this.atoms[bond.end].neighbours.push({ aid: bond.begin, bid })\n })\n\n this.inLoop = (function () {\n molecule.prepareLoopStructure()\n let bondsInLoops = new Pile()\n molecule.loops.forEach(loop => {\n if (loop.hbs.length <= 6) {\n const hbids = loop.hbs.map(hbid => molecule.halfBonds.get(hbid).bid)\n bondsInLoops = bondsInLoops.union(new Pile(hbids))\n }\n })\n const inLoop = {}\n bondsInLoops.forEach(bid => {\n inLoop[bid] = 1\n })\n return inLoop\n })()\n\n this.touchedCistransbonds = 0\n this.markCisTrans(molecule)\n\n var components = molecule.getComponents()\n var componentsAll = components.reactants.concat(components.products)\n\n var walk = new Dfs(\n molecule,\n this.atoms,\n componentsAll,\n components.reactants.length\n )\n\n walk.walk()\n this.atoms.forEach(atom => {\n atom.neighbours = []\n })\n\n // fill up neighbor lists for the stereocenters calculation\n for (i = 0; i < walk.v_seq.length; i++) {\n var seqEl = walk.v_seq[i]\n var vIdx = seqEl.idx\n var eIdx = seqEl.parent_edge\n var vPrevIdx = seqEl.parent_vertex\n\n if (eIdx >= 0) {\n var atom = this.atoms[vIdx]\n\n var openingCycles = walk.numOpeningCycles(eIdx)\n\n for (j = 0; j < openingCycles; j++)\n this.atoms[vPrevIdx].neighbours.push({ aid: -1, bid: -1 })\n\n if (walk.edgeClosingCycle(eIdx)) {\n for (k = 0; k < atom.neighbours.length; k++) {\n if (atom.neighbours[k].aid === -1) {\n // eslint-disable-line max-depth\n atom.neighbours[k].aid = vPrevIdx\n atom.neighbours[k].bid = eIdx\n break\n }\n }\n if (k === atom.neighbours.length)\n throw new Error('internal: can not put closing bond to its place')\n } else {\n atom.neighbours.push({ aid: vPrevIdx, bid: eIdx })\n atom.parent = vPrevIdx\n }\n this.atoms[vPrevIdx].neighbours.push({ aid: vIdx, bid: eIdx })\n }\n }\n\n try {\n // detect chiral configurations\n var stereocenters = new Stereocenters(\n molecule,\n function (idx) {\n return this.atoms[idx].neighbours\n },\n this\n )\n stereocenters.buildFromBonds(this.ignore_errors)\n\n stereocenters.each((sc, atomIdx) => {\n // eslint-disable-line max-statements\n // if (sc.type < MoleculeStereocenters::ATOM_AND)\n // continue;\n\n var implicitHIdx = -1\n\n if (sc.pyramid[3] == -1) implicitHIdx = 3\n /*\n\t\t\telse for (j = 0; j < 4; j++)\n\t\t\t\tif (ignored_vertices[pyramid[j]])\n\t\t\t\t{\n\t\t\t\t\timplicit_h_idx = j;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t*/\n\n var pyramidMapping = []\n var counter = 0\n\n var atom = this.atoms[atomIdx]\n\n if (atom.parent != -1) {\n for (k = 0; k < 4; k++) {\n if (sc.pyramid[k] == atom.parent) {\n pyramidMapping[counter++] = k\n break\n }\n }\n }\n\n if (implicitHIdx != -1) pyramidMapping[counter++] = implicitHIdx\n\n for (j = 0; j != atom.neighbours.length; j++) {\n if (atom.neighbours[j].aid == atom.parent) continue // eslint-disable-line no-continue\n\n for (k = 0; k < 4; k++) {\n if (atom.neighbours[j].aid == sc.pyramid[k]) {\n if (counter >= 4) throw new Error('internal: pyramid overflow')\n pyramidMapping[counter++] = k\n break\n }\n }\n }\n\n if (counter == 4) {\n // move the 'from' atom to the end\n counter = pyramidMapping[0]\n pyramidMapping[0] = pyramidMapping[1]\n pyramidMapping[1] = pyramidMapping[2]\n pyramidMapping[2] = pyramidMapping[3]\n pyramidMapping[3] = counter\n } else if (counter != 3) {\n throw new Error('cannot calculate chirality')\n }\n\n if (Stereocenters.isPyramidMappingRigid(pyramidMapping))\n this.atoms[atomIdx].chirality = 1\n else this.atoms[atomIdx].chirality = 2\n })\n } catch (ex) {\n //TODO: add error handler call\n }\n\n // write the SMILES itself\n\n // cycle_numbers[i] == -1 means that the number is available\n // cycle_numbers[i] == n means that the number is used by vertex n\n var cycleNumbers = []\n\n cycleNumbers.push(0) // never used\n\n var firstComponent = true\n\n for (i = 0; i < walk.v_seq.length; i++) {\n seqEl = walk.v_seq[i]\n vIdx = seqEl.idx\n eIdx = seqEl.parent_edge\n vPrevIdx = seqEl.parent_vertex\n var writeAtom = true\n\n if (vPrevIdx >= 0) {\n if (walk.numBranches(vPrevIdx) > 1) {\n if (\n this.atoms[vPrevIdx].branch_cnt > 0 &&\n this.atoms[vPrevIdx].paren_written\n )\n this.smiles += ')'\n }\n\n openingCycles = walk.numOpeningCycles(eIdx)\n\n for (j = 0; j < openingCycles; j++) {\n for (k = 1; k < cycleNumbers.length; k++) {\n if (cycleNumbers[k] == -1)\n // eslint-disable-line max-depth\n break\n }\n if (k == cycleNumbers.length) cycleNumbers.push(vPrevIdx)\n else cycleNumbers[k] = vPrevIdx\n\n this.writeCycleNumber(k)\n }\n\n if (vPrevIdx >= 0) {\n var branches = walk.numBranches(vPrevIdx)\n\n if (branches > 1 && this.atoms[vPrevIdx].branch_cnt < branches - 1) {\n if (walk.edgeClosingCycle(eIdx)) {\n // eslint-disable-line max-depth\n this.atoms[vPrevIdx].paren_written = false\n } else {\n this.smiles += '('\n this.atoms[vPrevIdx].paren_written = true\n }\n }\n\n this.atoms[vPrevIdx].branch_cnt++\n\n if (this.atoms[vPrevIdx].branch_cnt > branches)\n throw new Error('unexpected branch')\n }\n\n var bond = molecule.bonds.get(eIdx)\n\n var dir = 0\n\n if (bond.type == Bond.PATTERN.TYPE.SINGLE)\n dir = this.calcBondDirection(molecule, eIdx, vPrevIdx)\n\n if ((dir == 1 && vIdx == bond.end) || (dir == 2 && vIdx == bond.begin))\n this.smiles += '/'\n else if (\n (dir == 2 && vIdx == bond.end) ||\n (dir == 1 && vIdx == bond.begin)\n )\n this.smiles += '\\\\'\n else if (bond.type == Bond.PATTERN.TYPE.ANY) {\n this.smiles += '~'\n } else if (bond.type == Bond.PATTERN.TYPE.DOUBLE) {\n this.smiles += '='\n } else if (bond.type == Bond.PATTERN.TYPE.TRIPLE) {\n this.smiles += '#'\n } else if (bond.type == Bond.PATTERN.TYPE.SINGLE_OR_AROMATIC) {\n this.smiles += '-,:'\n } else if (bond.type == Bond.PATTERN.TYPE.DOUBLE_OR_AROMATIC) {\n this.smiles += '=,:'\n } else if (bond.type == Bond.PATTERN.TYPE.SINGLE_OR_DOUBLE) {\n this.smiles += '-,='\n } else if (\n bond.type == Bond.PATTERN.TYPE.AROMATIC &&\n (!this.atoms[bond.begin].lowercase ||\n !this.atoms[bond.end].lowercase ||\n !this.isBondInRing(eIdx))\n )\n this.smiles += ':'\n // TODO: Check if this : is needed\n else if (\n bond.type == Bond.PATTERN.TYPE.SINGLE &&\n this.atoms[bond.begin].aromatic &&\n this.atoms[bond.end].aromatic\n )\n this.smiles += '-'\n\n if (walk.edgeClosingCycle(eIdx)) {\n for (j = 1; j < cycleNumbers.length; j++) {\n if (cycleNumbers[j] == vIdx) break\n }\n\n if (j == cycleNumbers.length) throw new Error('cycle number not found')\n\n this.writeCycleNumber(j)\n\n cycleNumbers[j] = -1\n writeAtom = false\n }\n } else {\n if (!firstComponent) {\n this.smiles +=\n this.writtenComponents === walk.nComponentsInReactants &&\n walk.nReactants !== 0\n ? '>>'\n : '.' // when walk.nReactants === 0 - not reaction\n }\n firstComponent = false\n this.writtenComponents++\n }\n if (writeAtom) {\n this.writeAtom(\n molecule,\n vIdx,\n this.atoms[vIdx].aromatic,\n this.atoms[vIdx].lowercase,\n this.atoms[vIdx].chirality\n )\n this.writtenAtoms.push(seqEl.idx)\n }\n }\n\n this.comma = false\n\n // this._writeStereogroups(mol, atoms);\n this.writeRadicals(molecule)\n // this._writePseudoAtoms(mol);\n // this._writeHighlighting();\n\n if (this.comma) this.smiles += '|'\n\n return this.smiles\n}\n\nSmiles.prototype.writeCycleNumber = function (n) {\n if (n > 0 && n < 10) this.smiles += n\n else if (n >= 10 && n < 100) this.smiles += '%' + n\n else if (n >= 100 && n < 1000) this.smiles += '%%' + n\n else throw new Error('bad cycle number: ' + n)\n}\n\nSmiles.prototype.writeAtom = function (\n mol,\n idx,\n aromatic,\n lowercase,\n chirality\n) {\n // eslint-disable-line max-params, max-statements\n var atom = mol.atoms.get(idx)\n var needBrackets = false\n var hydro = -1\n var aam = 0\n\n /*\n\tif (mol.haveQueryAtoms())\n\t{\n\t query_atom = &mol.getQueryAtom(idx);\n\n\t if (query_atom->type == QUERY_ATOM_RGROUP)\n\t {\n\t\t if (mol.getRGroups()->isRGroupAtom(idx))\n\t\t {\n\t\t\tconst Array &rg = mol.getRGroups()->getSiteRGroups(idx);\n\n\t\t\tif (rg.length != 1)\n\t\t\t throw Error(\"rgroup count %d\", rg.length);\n\n\t\t\t_output.printf(\"[&%d]\", rg[0] + 1);\n\t\t }\n\t\t else\n\t\t\t_output.printf(\"[&%d]\", 1);\n\n\t\t return;\n\t }\n\t}\n\t*/\n\n if (atom.label == 'A') {\n this.smiles += '*'\n return\n }\n\n if (atom.label == 'R' || atom.label == 'R#') {\n this.smiles += '[*]'\n return\n }\n\n // KETCHER-598 (Ketcher does not save AAM into reaction SMILES)\n // BEGIN\n // if (this.atom_atom_mapping)\n // aam = atom_atom_mapping[idx];\n aam = atom.aam\n // END\n\n if (\n atom.label != 'C' &&\n atom.label != 'P' &&\n atom.label != 'N' &&\n atom.label != 'S' &&\n atom.label != 'O' &&\n atom.label != 'Cl' &&\n atom.label != 'F' &&\n atom.label != 'Br' &&\n atom.label != 'B' &&\n atom.label != 'I'\n )\n needBrackets = true\n\n if (\n atom.explicitValence >= 0 ||\n atom.radical != 0 ||\n chirality > 0 ||\n (aromatic && atom.label != 'C' && atom.label != 'O') ||\n (aromatic &&\n atom.label == 'C' &&\n this.atoms[idx].neighbours.length < 3 &&\n this.atoms[idx].h_count == 0)\n )\n hydro = this.atoms[idx].h_count\n\n var label = atom.label\n if (atom.atomList && !atom.atomList.notList) {\n label = atom.atomList.label()\n needBrackets = false // atom list label already has brackets\n } else if (atom.isPseudo() || (atom.atomList && atom.atomList.notList)) {\n label = '*'\n needBrackets = true\n } else if (\n chirality ||\n atom.charge != 0 ||\n atom.isotope > 0 ||\n hydro >= 0 ||\n aam > 0\n ) {\n needBrackets = true\n }\n\n if (needBrackets) {\n if (hydro == -1) hydro = this.atoms[idx].h_count\n this.smiles += '['\n }\n\n if (atom.isotope > 0) this.smiles += atom.isotope\n\n if (lowercase) this.smiles += label.toLowerCase()\n else this.smiles += label\n\n if (chirality > 0) {\n if (chirality == 1) this.smiles += '@'\n // chirality == 2\n else this.smiles += '@@'\n\n if (atom.implicitH > 1)\n throw new Error(atom.implicitH + ' implicit H near stereocenter')\n }\n\n if (atom.label != 'H') {\n if (hydro > 1 || (hydro == 0 && !needBrackets)) this.smiles += 'H' + hydro\n else if (hydro == 1) this.smiles += 'H'\n }\n\n if (atom.charge > 1) this.smiles += '+' + atom.charge\n else if (atom.charge < -1) this.smiles += atom.charge\n else if (atom.charge == 1) this.smiles += '+'\n else if (atom.charge == -1) this.smiles += '-'\n\n if (aam > 0) this.smiles += ':' + aam\n\n if (needBrackets) this.smiles += ']'\n\n /*\n\tif (mol.getRGroupFragment() != 0)\n\t{\n\t for (i = 0; i < 2; i++)\n\t {\n\t\t int j;\n\n\t\t for (j = 0; mol.getRGroupFragment()->getAttachmentPoint(i, j) != -1; j++)\n\t\t\tif (idx == mol.getRGroupFragment()->getAttachmentPoint(i, j))\n\t\t\t{\n\t\t\t _output.printf(\"([*])\");\n\t\t\t break;\n\t\t\t}\n\n\t\t if (mol.getRGroupFragment()->getAttachmentPoint(i, j) != -1)\n\t\t\tbreak;\n\t }\n\t}\n\t*/\n}\n\nSmiles.prototype.markCisTrans = function (mol) {\n this.cis_trans = new CisTrans(\n mol,\n function (idx) {\n return this.atoms[idx].neighbours\n },\n this\n )\n this.cis_trans.build()\n this.dbonds = new Array(mol.bonds.size)\n\n mol.bonds.forEach((bond, bid) => {\n this.dbonds[bid] = {\n ctbond_beg: -1,\n ctbond_end: -1,\n saved: 0\n }\n })\n\n this.cis_trans.each((ct, bid) => {\n var bond = mol.bonds.get(bid)\n\n if (ct.parity !== 0 && !this.isBondInRing(bid)) {\n var neiBeg = this.atoms[bond.begin].neighbours\n var neiEnd = this.atoms[bond.end].neighbours\n var aromFailBeg = true\n var aromFailEnd = true\n\n neiBeg.forEach(nei => {\n if (\n nei.bid !== bid &&\n mol.bonds.get(nei.bid).type === Bond.PATTERN.TYPE.SINGLE\n )\n aromFailBeg = false\n })\n\n neiEnd.forEach(nei => {\n if (\n nei.bid !== bid &&\n mol.bonds.get(nei.bid).type === Bond.PATTERN.TYPE.SINGLE\n )\n aromFailEnd = false\n })\n\n if (aromFailBeg || aromFailEnd) return\n\n neiBeg.forEach(nei => {\n if (nei.bid === bid) return\n if (mol.bonds.get(nei.bid).begin === bond.begin)\n this.dbonds[nei.bid].ctbond_beg = bid\n else this.dbonds[nei.bid].ctbond_end = bid\n })\n\n neiEnd.forEach(nei => {\n if (nei.bid === bid) return\n if (mol.bonds.get(nei.bid).begin === bond.end)\n this.dbonds[nei.bid].ctbond_beg = bid\n else this.dbonds[nei.bid].ctbond_end = bid\n })\n }\n })\n}\n\nSmiles.prototype.updateSideBonds = function (mol, bondIdx) {\n // eslint-disable-line max-statements\n var bond = mol.bonds.get(bondIdx)\n var subst = this.cis_trans.getSubstituents(bondIdx)\n var parity = this.cis_trans.getParity(bondIdx)\n\n var sidebonds = [-1, -1, -1, -1]\n\n sidebonds[0] = mol.findBondId(subst[0], bond.begin)\n if (subst[1] != -1) sidebonds[1] = mol.findBondId(subst[1], bond.begin)\n\n sidebonds[2] = mol.findBondId(subst[2], bond.end)\n if (subst[3] != -1) sidebonds[3] = mol.findBondId(subst[3], bond.end)\n\n var n1 = 0\n var n2 = 0\n var n3 = 0\n var n4 = 0\n\n if (this.dbonds[sidebonds[0]].saved != 0) {\n if (\n (this.dbonds[sidebonds[0]].saved == 1 &&\n mol.bonds.get(sidebonds[0]).begin == bond.begin) ||\n (this.dbonds[sidebonds[0]].saved == 2 &&\n mol.bonds.get(sidebonds[0]).end == bond.begin)\n )\n n1++\n else n2++\n }\n if (sidebonds[1] != -1 && this.dbonds[sidebonds[1]].saved != 0) {\n if (\n (this.dbonds[sidebonds[1]].saved == 2 &&\n mol.bonds.get(sidebonds[1]).begin == bond.begin) ||\n (this.dbonds[sidebonds[1]].saved == 1 &&\n mol.bonds.get(sidebonds[1]).end == bond.begin)\n )\n n1++\n else n2++\n }\n if (this.dbonds[sidebonds[2]].saved != 0) {\n if (\n (this.dbonds[sidebonds[2]].saved == 1 &&\n mol.bonds.get(sidebonds[2]).begin == bond.end) ||\n (this.dbonds[sidebonds[2]].saved == 2 &&\n mol.bonds.get(sidebonds[2]).end == bond.end)\n )\n n3++\n else n4++\n }\n if (sidebonds[3] != -1 && this.dbonds[sidebonds[3]].saved != 0) {\n if (\n (this.dbonds[sidebonds[3]].saved == 2 &&\n mol.bonds.get(sidebonds[3]).begin == bond.end) ||\n (this.dbonds[sidebonds[3]].saved == 1 &&\n mol.bonds.get(sidebonds[3]).end == bond.end)\n )\n n3++\n else n4++\n }\n\n if (parity == CisTrans.PARITY.CIS) {\n n1 += n3\n n2 += n4\n } else {\n n1 += n4\n n2 += n3\n }\n\n if (n1 > 0 && n2 > 0) throw new Error('incompatible cis-trans configuration')\n\n if (n1 == 0 && n2 == 0) return false\n\n if (n1 > 0) {\n this.dbonds[sidebonds[0]].saved =\n mol.bonds.get(sidebonds[0]).begin == bond.begin ? 1 : 2\n if (sidebonds[1] != -1) {\n this.dbonds[sidebonds[1]].saved =\n mol.bonds.get(sidebonds[1]).begin == bond.begin ? 2 : 1\n }\n\n this.dbonds[sidebonds[2]].saved =\n (mol.bonds.get(sidebonds[2]).begin == bond.end) ==\n (parity == CisTrans.PARITY.CIS)\n ? 1\n : 2\n if (sidebonds[3] != -1) {\n this.dbonds[sidebonds[3]].saved =\n (mol.bonds.get(sidebonds[3]).begin == bond.end) ==\n (parity == CisTrans.PARITY.CIS)\n ? 2\n : 1\n }\n }\n if (n2 > 0) {\n this.dbonds[sidebonds[0]].saved =\n mol.bonds.get(sidebonds[0]).begin == bond.begin ? 2 : 1\n if (sidebonds[1] != -1) {\n this.dbonds[sidebonds[1]].saved =\n mol.bonds.get(sidebonds[1]).begin == bond.begin ? 1 : 2\n }\n\n this.dbonds[sidebonds[2]].saved =\n (mol.bonds.get(sidebonds[2]).begin == bond.end) ==\n (parity == CisTrans.PARITY.CIS)\n ? 2\n : 1\n if (sidebonds[3] != -1) {\n this.dbonds[sidebonds[3]].saved =\n (mol.bonds.get(sidebonds[3]).begin == bond.end) ==\n (parity == CisTrans.PARITY.CIS)\n ? 1\n : 2\n }\n }\n\n return true\n}\n\nSmiles.prototype.calcBondDirection = function (mol, idx, vprev) {\n var ntouched\n\n if (this.dbonds[idx].ctbond_beg == -1 && this.dbonds[idx].ctbond_end == -1)\n return 0\n\n if (mol.bonds.get(idx).type != Bond.PATTERN.TYPE.SINGLE)\n throw new Error('internal: directed bond type ' + mol.bonds.get(idx).type)\n\n while (true) {\n // eslint-disable-line no-constant-condition\n ntouched = 0\n this.cis_trans.each((ct, bid) => {\n if (ct.parity !== 0 && !this.isBondInRing(bid)) {\n if (this.updateSideBonds(mol, bid)) ntouched++\n }\n })\n if (ntouched === this.touchedCistransbonds) break\n this.touchedCistransbonds = ntouched\n }\n\n if (this.dbonds[idx].saved === 0) {\n if (vprev === mol.bonds.get(idx).begin) this.dbonds[idx].saved = 1\n else this.dbonds[idx].saved = 2\n }\n\n return this.dbonds[idx].saved\n}\n\nSmiles.prototype.writeRadicals = function (mol) {\n // eslint-disable-line max-statements\n var marked = new Array(this.writtenAtoms.length)\n var i, j\n\n for (i = 0; i < this.writtenAtoms.length; i++) {\n if (marked[i]) continue // eslint-disable-line no-continue\n\n var radical = mol.atoms.get(this.writtenAtoms[i]).radical\n\n if (radical == 0) continue // eslint-disable-line no-continue\n\n if (this.comma) {\n this.smiles += ','\n } else {\n this.smiles += ' |'\n this.comma = true\n }\n\n if (radical == Atom.PATTERN.RADICAL.SINGLET) this.smiles += '^3:'\n else if (radical == Atom.PATTERN.RADICAL.DOUPLET) this.smiles += '^1:'\n // RADICAL_TRIPLET\n else this.smiles += '^4:'\n\n this.smiles += i\n\n for (j = i + 1; j < this.writtenAtoms.length; j++) {\n if (mol.atoms.get(this.writtenAtoms[j]).radical == radical) {\n marked[j] = true\n this.smiles += ',' + j\n }\n }\n }\n}\n\nexport default {\n stringify(struct, options) {\n const opts = options || {}\n return new Smiles().saveMolecule(struct, opts.ignoreErrors)\n }\n}\n","const headerSchema = {\n title: 'Header',\n type: 'object',\n properties: {\n moleculeName: {\n title: 'Molecule name',\n type: 'string',\n default: ''\n },\n creatorProgram: {\n title: 'Creator program',\n type: 'string'\n },\n comment: {\n title: 'Comment',\n type: 'string'\n }\n }\n}\n\nconst rootSchema = {\n id: '/Root',\n required: ['nodes'],\n properties: {\n nodes: {\n type: 'array',\n items: {\n oneOf: [\n { $ref: '/RxnPlus' },\n { $ref: '/RxnArrow' },\n {\n type: 'object',\n required: ['$ref'],\n properties: {\n $ref: {\n type: 'string'\n }\n }\n }\n ]\n }\n },\n edges: {\n type: 'array',\n items: {\n oneOf: [\n {\n properties: {\n $refs: {\n type: 'array',\n maxItems: 2,\n items: {\n type: 'string'\n }\n }\n }\n }\n // ...\n ]\n }\n }\n }\n}\n\nconst graphSchema = {\n id: '/Graph',\n type: 'object',\n required: ['root'],\n properties: {\n header: { $ref: '#/header' },\n root: { $ref: '#/root' }\n },\n patternProperties: {\n '^mol': { $ref: '/Molecule' },\n '^rg': { $ref: '/RGroup' }\n },\n\n root: rootSchema,\n header: headerSchema\n}\n\nexport default graphSchema\n","export function ifDef(target, key, value, defaultValue) {\n if (\n value !== undefined &&\n value !== null &&\n value !== defaultValue &&\n !(Array.isArray(value) && value.length === 0)\n )\n target[key] = value\n}\n\n// /**\n// * Takes parsed data & match it with format schema\n// * @param source {object}\n// * @param schema {object}\n// * @returns {object}\n// */\n// export function schemify(source, schema) {\n// \treturn schemifyEnv(source, schema, true);\n// }\n//\n// /**\n// * Replace properties according to v3000 format\n// * @param source {object}\n// * @param schema {object}\n// * @returns {object}\n// */\n// export function unSchemify(source, schema) {\n// \treturn schemifyEnv(source, schema, false);\n// }\n//\n// /**\n// * Schemify/unSchemify logic\n// * @param source {object}\n// * @param schema {object}\n// * @param convertToSchema {boolean}\n// * @returns {object}\n// */\n// function schemifyEnv(source, schema, convertToSchema) {\n// \tconst props = schema.properties;\n//\n// \tif (!props)\n// \t\treturn source;\n//\n// \treturn Object.keys(source).reduce((acc, propName) => {\n// \t\tconst value = source[propName];\n//\n// \t\tif (!props[propName])\n// \t\t\tthrow new Error(`Schema doesn't have property ${propName}`);\n//\n// \t\tif (props[propName].type === 'boolean') {\n// \t\t\tacc[propName] = convertToSchema ? !!value : +value;\n// \t\t\treturn acc;\n// \t\t}\n//\n// \t\tif (!props[propName].enum || !props[propName].enumNames) {\n// \t\t\tacc[propName] = value;\n// \t\t\treturn acc;\n// \t\t}\n//\n// \t\tconst index = convertToSchema ?\n// \t\t\tprops[propName].enum.findIndex(elem => elem === value) :\n// \t\t\tprops[propName].enumNames.findIndex(elem => elem === value);\n//\n// \t\tacc[propName] = convertToSchema ?\n// \t\t\tprops[propName].enumNames[index] :\n// \t\t\tprops[propName].enum[index];\n//\n// \t\treturn acc;\n// \t}, {});\n// }\n","const atom = {\n title: 'Atom',\n type: 'object',\n required: ['label', 'location'],\n properties: {\n label: {\n title: 'Label',\n type: 'string',\n maxLength: 3\n },\n alias: {\n title: 'Alias',\n type: 'string'\n },\n location: {\n title: 'Location',\n type: 'array',\n items: {\n type: 'float',\n precision: 1\n }\n },\n rgroups: {\n title: 'Rgroups',\n type: 'array',\n items: {\n type: 'integer'\n }\n },\n charge: {\n title: 'Charge',\n type: 'integer',\n minimum: -1000,\n maximum: 1000,\n default: 0\n },\n explicitValence: {\n title: 'Valence',\n enum: [-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],\n enumNames: [\n 'Not specified',\n '0',\n 'I',\n 'II',\n 'III',\n 'IV',\n 'V',\n 'VI',\n 'VII',\n 'VIII',\n 'IX',\n 'X',\n 'XI',\n 'XII'\n ],\n default: -1\n },\n isotope: {\n title: 'Isotope',\n type: 'integer',\n minimum: 0,\n default: 0\n },\n radical: {\n title: 'Radical',\n enum: [0, 2, 1, 3],\n enumNames: [\n 'Not specified',\n 'Monoradical',\n 'Diradical (singlet)',\n 'Diradical (triplet)'\n ],\n default: 0\n },\n attachmentPoints: {\n title: 'Rgroup attachment points',\n enum: [0, 1, 2, 3],\n enumNames: [\n 'No',\n 'First site only',\n 'Second site only',\n 'First and second site'\n ],\n default: 0\n },\n // stereo\n stereoLabel: {\n title: 'Stereo label',\n type: ['string', 'null'],\n pattern: /(^abs)|(^and)|(^or)/,\n default: null\n },\n stereoParity: {\n title: 'Stereo parity configuration',\n enum: [0, 1, 2, 3],\n enumNames: ['none', 'odd parity', 'even parity', 'either parity'],\n default: 0\n },\n weight: {\n title: 'Atomic weight',\n type: 'integer',\n default: 0\n },\n // query\n ringBondCount: {\n title: 'Ring bond count',\n enum: [0, -2, -1, 2, 3, 4],\n enumNames: ['', 'As drawn', '0', '2', '3', '4'],\n default: 0\n },\n substitutionCount: {\n title: 'Substitution count',\n enum: [0, -2, -1, 1, 2, 3, 4, 5, 6],\n enumNames: [\n 'Not specified',\n 'As drawn',\n '0',\n '1',\n '2',\n '3',\n '4',\n '5',\n '6'\n ],\n default: 0\n },\n unsaturatedAtom: {\n title: 'Unsaturated',\n type: 'boolean',\n default: false\n },\n hCount: {\n title: 'H count',\n enum: [-1, 0, 1, 2, 3, 4, 5],\n enumNames: ['Zero', 'Not specified', 'H0', 'H1', 'H2', 'H3', 'H4'],\n default: 0\n },\n // reaction\n mapping: {\n title: 'Atom-atom mapping',\n type: 'integer',\n default: 0\n },\n invRet: {\n title: 'Inversion',\n enum: [0, 1, 2],\n enumNames: ['', 'Inverts', 'Retains'],\n default: 0\n },\n exactChangeFlag: {\n title: 'Exact change',\n type: 'boolean',\n default: false\n }\n }\n}\n\nconst rgatom = {\n title: 'RGroup-atom',\n type: 'object',\n required: ['type', 'location'],\n properties: {\n type: {\n enum: ['rg-label']\n },\n location: {\n title: 'Location',\n type: 'array',\n items: {\n type: 'float',\n precision: 1\n }\n },\n $refs: {\n // RGroups in root of Graph (only one: `$refs` or `rgroups`)\n type: 'array',\n items: {\n type: 'string',\n pattern: '^rg-',\n maxLength: 5\n }\n },\n rgroups: {\n // inline Rgroups in atom (only one: `$refs` or `rgroups`)\n type: 'array',\n items: { $ref: '/RGroup' }\n },\n attachmentPoints: {\n title: 'Rgroup attachment points',\n enum: [0, 1, 2, 3],\n enumNames: [\n 'No',\n 'First site only',\n 'Second site only',\n 'First and second site'\n ],\n default: 0\n }\n }\n}\n\nconst atomlist = {\n title: 'RGroup-atom',\n type: 'object',\n required: ['type', 'location'],\n properties: {\n type: {\n enum: ['atom-list']\n },\n notList: {\n type: 'boolean',\n default: false\n },\n location: {\n title: 'Location',\n type: 'array',\n items: {\n type: 'float',\n precision: 1\n }\n },\n elements: {\n type: 'array',\n minItems: 2,\n items: {\n type: 'string',\n maxLength: 3\n }\n },\n attachmentPoints: {\n title: 'Rgroup attachment points',\n enum: [0, 1, 2, 3],\n enumNames: [\n 'No',\n 'First site only',\n 'Second site only',\n 'First and second site'\n ],\n default: 0\n }\n }\n}\n\nconst bond = {\n title: 'Bond',\n type: 'object',\n required: ['atoms'],\n properties: {\n type: {\n title: 'Type',\n enum: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],\n enumNames: [\n 'Single',\n 'Single Up',\n 'Single Down',\n 'Single Up/Down',\n 'Double',\n 'Double Cis/Trans',\n 'Triple',\n 'Aromatic',\n 'Any',\n 'Single/Double',\n 'Single/Aromatic',\n 'Double/Aromatic'\n ],\n default: 1\n },\n atoms: {\n title: 'Atoms',\n type: 'array',\n minItems: 2,\n maxItems: 2,\n items: {\n type: 'integer'\n }\n },\n stereo: {\n title: 'Bond stereo configuration',\n enum: [0, 1, 2, 3],\n enumNames: ['None', 'Up', 'Either', 'Down'],\n default: 0\n },\n topology: {\n title: 'Topology',\n enum: [0, 1, 2],\n enumNames: ['Either', 'Ring', 'Chain'],\n default: 0\n },\n center: {\n title: 'Reacting Center',\n enum: [0, -1, 1, 2, 4, 8, 12], // 5, 9, 13\n enumNames: [\n 'Unmarked',\n 'Not center',\n 'Center',\n 'No change',\n 'Made/broken',\n 'Order changes',\n 'Made/broken and changes'\n ], // \"Order changes\" x 3\n default: 0\n },\n stereobox: {\n title: 'Stereo box',\n enum: [0, 1],\n default: 0\n }\n }\n}\n\nconst sgroup = {\n title: 'SGroup',\n allOf: [\n {\n required: ['atoms'],\n properties: {\n atoms: {\n type: 'array'\n }\n }\n },\n {\n oneOf: [\n {\n key: 'GEN',\n title: 'Generic',\n properties: {\n type: { enum: ['GEN'] }\n }\n },\n {\n key: 'MUL',\n title: 'Multiple group',\n type: 'object',\n properties: {\n type: { enum: ['MUL'] },\n mul: {\n title: 'Repeat count',\n type: 'integer',\n default: 1,\n minimum: 1,\n maximum: 1000\n }\n },\n required: ['mul']\n },\n {\n key: 'SRU',\n title: 'SRU polymer',\n properties: {\n type: { enum: ['SRU'] },\n subscript: {\n title: 'Polymer label',\n type: 'string',\n default: 'n',\n pattern: '^[a-zA-Z]$',\n invalidMessage: 'SRU subscript should consist of a single letter'\n },\n connectivity: {\n title: 'Repeat Pattern',\n enum: ['HT', 'HH', 'EU'],\n enumNames: ['Head-to-tail', 'Head-to-head', 'Either unknown'],\n default: 'ht'\n }\n },\n required: ['subscript', 'connectivity']\n },\n {\n key: 'SUP',\n title: 'Superatom',\n properties: {\n type: { enum: ['SUP'] },\n name: {\n title: 'Name',\n type: 'string',\n default: '',\n minLength: 1,\n invalidMessage: 'Please, provide a name for the superatom'\n }\n }\n },\n {\n key: 'DAT',\n title: 'Data-group',\n properties: {\n type: { enum: ['DAT'] },\n context: {\n title: 'Context',\n enum: ['Fragment', 'Multifragment', 'Bond', 'Atom', 'Group'],\n default: 'Fragment'\n },\n fieldName: {\n title: 'Field name',\n type: 'string',\n default: '',\n minLength: 1,\n invalidMessage: 'Please, specify field name'\n },\n fieldValue: {\n title: 'Field value',\n type: 'string',\n default: '',\n minLength: 1,\n invalidMessage: 'Please, specify field value'\n },\n display: {\n title: 'Display',\n type: 'boolean',\n default: false\n },\n placement: {\n title: 'Placement',\n type: 'boolean',\n default: true\n }\n },\n required: ['context', 'fieldName', 'fieldValue']\n }\n ]\n }\n ]\n}\n\nconst moleculeSchema = {\n id: '/Molecule',\n type: 'object',\n properties: {\n stereoFlag: {\n title: 'Stereo Flag',\n type: ['string', null],\n enum: [null, 'ABS', 'AND', 'OR', 'Mixed'],\n default: null\n },\n atoms: {\n title: 'Atoms',\n type: 'array',\n items: {\n oneOf: [\n { $ref: '#/atom' },\n { $ref: '#/rgatom' },\n { $ref: '#/atomlist' }\n ]\n }\n },\n bonds: {\n title: 'Bonds',\n type: 'array',\n items: { $ref: '#/bond' }\n },\n sgroups: {\n title: 'SGroups',\n type: 'array',\n items: { $ref: '#/sgroup' }\n }\n },\n\n atom,\n atomlist,\n rgatom,\n bond,\n sgroup\n}\n\nexport default moleculeSchema\n","import structSchema from '../../schemes/moleculeSchema'\n\nimport { fromRlabel } from '../convertStruct'\nimport { ifDef } from '../../utils'\n\nexport function moleculeToGraph(struct) {\n const body = {\n atoms: Array.from(struct.atoms.values()).map(atom => {\n if (atom.label === 'R#') return rglabelToGraph(atom)\n if (atom.label === 'L#') return atomListToGraph(atom)\n return atomToGraph(atom)\n })\n }\n\n if (struct.bonds.size !== 0)\n body.bonds = Array.from(struct.bonds.values()).map(bondToGraph)\n\n if (struct.sgroups.size !== 0)\n body.sgroups = Array.from(struct.sgroups.values()).map(sgroupToGraph)\n\n const fragment = struct.frags.get(0)\n if (fragment)\n ifDef(\n body,\n 'stereoFlag',\n fragment.enhancedStereoFlag,\n structSchema.properties.stereoFlag.default\n )\n\n return {\n type: 'molecule',\n ...body\n }\n}\n\nfunction atomToGraph(source) {\n const schema = structSchema.atom.properties\n const result = {}\n ifDef(result, 'label', source.label)\n ifDef(result, 'alias', source.alias)\n ifDef(result, 'location', [source.pp.x, source.pp.y, source.pp.z])\n ifDef(result, 'charge', source.charge, schema.charge.default)\n ifDef(\n result,\n 'explicitValence',\n source.explicitValence,\n schema.explicitValence.default\n )\n ifDef(result, 'isotope', source.isotope, schema.isotope.default)\n ifDef(result, 'radical', source.radical, schema.radical.default)\n ifDef(\n result,\n 'attachmentPoints',\n source.attpnt,\n schema.attachmentPoints.default\n )\n // stereo\n ifDef(result, 'stereoLabel', source.stereoLabel, schema.stereoLabel.default)\n ifDef(result, 'stereoParity', source.stereoCare, schema.stereoParity.default)\n ifDef(result, 'weight', source.weight, schema.weight.default)\n // query\n ifDef(\n result,\n 'ringBondCount',\n source.ringBondCount,\n schema.ringBondCount.default\n )\n ifDef(\n result,\n 'substitutionCount',\n source.substitutionCount,\n schema.substitutionCount.default\n )\n ifDef(\n result,\n 'unsaturatedAtom',\n !!source.unsaturatedAtom,\n schema.unsaturatedAtom.default\n )\n ifDef(result, 'hCount', source.hCount, schema.hCount.default)\n // reaction\n ifDef(result, 'mapping', parseInt(source.aam), schema.mapping.default)\n ifDef(result, 'invRet', source.invRet, schema.invRet.default)\n ifDef(\n result,\n 'exactChangeFlag',\n !!source.exactChangeFlag,\n schema.exactChangeFlag.default\n )\n return result\n}\n\nfunction rglabelToGraph(source) {\n const schema = structSchema.rgatom.properties\n const result = {\n type: 'rg-label'\n }\n ifDef(result, 'location', [source.pp.x, source.pp.y, source.pp.z])\n ifDef(\n result,\n 'attachmentPoints',\n source.attpnt,\n schema.attachmentPoints.default\n )\n\n const refsToRGroups = fromRlabel(source.rglabel).map(\n rgnumber => `rg-${rgnumber}`\n )\n ifDef(result, '$refs', refsToRGroups)\n\n return result\n}\n\nfunction atomListToGraph(source) {\n const schema = structSchema.atomlist.properties\n const result = {\n type: 'atom-list'\n }\n ifDef(result, 'location', [source.pp.x, source.pp.y, source.pp.z])\n ifDef(\n result,\n 'attachmentPoints',\n source.attpnt,\n schema.attachmentPoints.default\n )\n ifDef(result, 'elements', source.atomList.labelList())\n ifDef(result, 'notList', source.atomList.notList, schema.notList.default)\n return result\n}\n\nfunction bondToGraph(source) {\n const schema = structSchema.bond.properties\n const result = {}\n\n ifDef(result, 'type', source.type)\n ifDef(result, 'atoms', [source.begin, source.end])\n ifDef(result, 'stereo', source.stereo, schema.stereo.default)\n ifDef(result, 'topology', source.topology, schema.topology.default)\n ifDef(result, 'center', source.reactingCenterStatus, schema.center.default)\n\n return result\n}\n\nfunction sgroupToGraph(source) {\n let schema\n const result = {}\n\n ifDef(result, 'type', source.type)\n ifDef(result, 'atoms', source.atoms)\n\n switch (source.type) {\n case 'GEN':\n break\n case 'MUL': {\n schema = structSchema.sgroup.allOf[1].oneOf[1].properties\n ifDef(result, 'mul', source.data.mul || schema.mul.default)\n break\n }\n case 'SRU': {\n schema = structSchema.sgroup.allOf[1].oneOf[2].properties\n ifDef(\n result,\n 'subscript',\n source.data.subscript || schema.subscript.default\n )\n ifDef(\n result,\n 'connectivity',\n source.data.connectivity.toUpperCase() || schema.connectivity.default\n )\n break\n }\n case 'SUP': {\n schema = structSchema.sgroup.allOf[1].oneOf[3].properties\n ifDef(result, 'name', source.data.name || schema.name.default)\n break\n }\n case 'DAT': {\n schema = structSchema.sgroup.allOf[1].oneOf[4].properties\n const data = source.data\n ifDef(result, 'placement', data.absolute, schema.placement.default)\n ifDef(result, 'display', data.attached, schema.display.default)\n ifDef(result, 'context', data.context)\n ifDef(result, 'fieldName', data.fieldName)\n ifDef(result, 'fieldData', data.fieldValue)\n break\n }\n default:\n break\n }\n\n return result\n}\n","export function fromRlabel(rg) {\n const res = []\n let rgi\n let val\n for (rgi = 0; rgi < 32; rgi++) {\n if (rg & (1 << rgi)) {\n val = rgi + 1\n res.push(val) // push the string\n }\n }\n return res\n}\n\nexport function toRlabel(values) {\n let res = 0\n values.forEach(val => {\n const rgi = val - 1\n res |= 1 << rgi\n })\n return res\n}\n","const rgroupLogic = {\n title: 'RGroupLogic',\n type: 'object',\n required: ['number'],\n properties: {\n number: {\n type: 'number'\n },\n range: {\n title: 'Occurrence',\n type: 'string',\n maxLength: 50,\n default: ''\n },\n resth: {\n title: 'RestH',\n type: 'boolean',\n default: false\n },\n ifthen: {\n title: 'Condition',\n type: 'integer',\n minimum: 0,\n default: 0\n }\n }\n}\n\nconst rgroupSchema = {\n id: '/RGroup',\n type: 'object',\n allOf: [\n {\n required: ['type'],\n properties: {\n type: { enum: ['rgroup'] },\n rlogic: { $ref: '#/logic' }\n }\n },\n { $ref: '/Molecule' }\n ],\n\n logic: rgroupLogic\n}\n\nexport default rgroupSchema\n","import rgroupSchema from '../../schemes/rgroupSchema'\nimport { moleculeToGraph } from './moleculeToGraph'\n\nimport { ifDef } from '../../utils'\n\nexport function rgroupToGraph(struct, data) {\n const body = {\n rlogic: rgroupLogicToGraph(data.rgnumber, data.rgroup),\n ...moleculeToGraph(struct)\n }\n\n return {\n ...body,\n type: 'rgroup'\n }\n}\n\nfunction rgroupLogicToGraph(rgnumber, rglogic) {\n const schema = rgroupSchema.logic.properties\n const result = {}\n\n ifDef(result, 'number', rgnumber)\n ifDef(result, 'range', rglogic.range, schema.range.default)\n ifDef(result, 'resth', rglogic.resth, schema.resth.default)\n ifDef(result, 'ifthen', rglogic.ifthen, schema.ifthen.default)\n\n return result\n}\n","import { ifDef } from '../../utils'\nimport Struct, { Atom, Bond, SGroup } from '../../../chem/struct'\nimport { toRlabel } from '../convertStruct'\nimport element from '../../../chem/element'\n\nexport function moleculeToStruct(graphItem) {\n const struct = new Struct()\n graphItem.atoms.forEach(atom => {\n if (atom.type === 'rg-label') struct.atoms.add(rglabelToStruct(atom))\n if (atom.type === 'atom-list') struct.atoms.add(atomListToStruct(atom))\n if (!atom.type) struct.atoms.add(atomToStruct(atom))\n })\n\n if (graphItem.bonds)\n graphItem.bonds.forEach(bond => struct.bonds.add(bondToStruct(bond)))\n\n if (graphItem.sgroups)\n graphItem.sgroups.forEach(sgroup =>\n struct.sgroups.add(sgroupToStruct(sgroup))\n )\n\n struct.initHalfBonds()\n struct.initNeighbors()\n struct.markFragments()\n if (graphItem.stereoFlag)\n struct.frags.get(0).enhancedStereoFlag = graphItem.stereoFlag\n\n return struct\n}\n\nexport function atomToStruct(source) {\n const params = {}\n\n ifDef(params, 'label', source.label)\n ifDef(params, 'alias', source.alias)\n ifDef(params, 'pp', {\n x: source.location[0],\n y: source.location[1],\n z: source.location[2] || 0.0\n })\n ifDef(params, 'charge', source.charge)\n ifDef(params, 'explicitValence', source.explicitValence)\n ifDef(params, 'isotope', source.isotope)\n ifDef(params, 'radical', source.radical)\n ifDef(params, 'attpnt', source.attachmentPoints)\n // stereo\n ifDef(params, 'stereoLabel', source.stereoLabel)\n ifDef(params, 'stereoParity', source.stereoParity)\n ifDef(params, 'weight', source.weight)\n // query\n ifDef(params, 'ringBondCount', source.ringBondCount)\n ifDef(params, 'substitutionCount', source.substitutionCount)\n ifDef(params, 'unsaturatedAtom', !!source.unsaturatedAtom)\n ifDef(params, 'hCount', source.hCount)\n // reaction\n ifDef(params, 'aam', source.mapping)\n ifDef(params, 'invRet', source.invRet)\n ifDef(params, 'exactChangeFlag', !!source.exactChangeFlag)\n return new Atom(params)\n}\n\nexport function rglabelToStruct(source) {\n const params = {}\n params.label = 'R#'\n ifDef(params, 'pp', {\n x: source.location[0],\n y: source.location[1],\n z: source.location[2] || 0.0\n })\n ifDef(params, 'attpnt', source.attachmentPoints)\n const rglabel = toRlabel(source.$refs.map(el => parseInt(el.slice(3))))\n ifDef(params, 'rglabel', rglabel)\n return new Atom(params)\n}\n\nexport function atomListToStruct(source) {\n const params = {}\n params.label = 'L#'\n ifDef(params, 'pp', {\n x: source.location[0],\n y: source.location[1],\n z: source.location[2] || 0.0\n })\n ifDef(params, 'attpnt', source.attachmentPoints)\n const ids = source.elements.map(el => element.map[el])\n ifDef(params, 'atomList', {\n ids,\n notList: source.notList\n })\n return new Atom(params)\n}\n\nexport function bondToStruct(source) {\n const params = {}\n\n ifDef(params, 'type', source.type)\n ifDef(params, 'topology', source.topology)\n ifDef(params, 'reactingCenterStatus', source.center)\n ifDef(params, 'stereo', source.stereo)\n // if (params.stereo)\n // \tparams.stereo = params.stereo > 1 ? params.stereo * 2 : params.stereo;\n // params.xxx = 0;\n ifDef(params, 'begin', source.atoms[0])\n ifDef(params, 'end', source.atoms[1])\n\n return new Bond(params)\n}\n\nexport function sgroupToStruct(source) {\n const sgroup = new SGroup(source.type)\n ifDef(sgroup, 'atoms', source.atoms)\n switch (source.type) {\n case 'GEN':\n break\n case 'MUL': {\n ifDef(sgroup.data, 'mul', source.mul)\n break\n }\n case 'SRU': {\n ifDef(sgroup.data, 'subscript', source.subscript)\n ifDef(sgroup.data, 'connectivity', source.connectivity.toLowerCase())\n break\n }\n case 'SUP': {\n ifDef(sgroup.data, 'name', source.name)\n break\n }\n case 'DAT': {\n ifDef(sgroup.data, 'absolute', source.placement)\n ifDef(sgroup.data, 'attached', source.display)\n ifDef(sgroup.data, 'context', source.context)\n ifDef(sgroup.data, 'fieldName', source.fieldName)\n ifDef(sgroup.data, 'fieldValue', source.fieldData)\n break\n }\n default:\n break\n }\n return sgroup\n}\n","import { ifDef } from '../../utils'\nimport { moleculeToStruct } from './moleculeToStruct'\nimport RGroup from '../../../chem/struct/rgroup'\n\nexport function rgroupToStruct(graphItem) {\n const struct = moleculeToStruct(graphItem)\n const rgroup = rgroupLogicToStruct(graphItem.rlogic)\n struct.frags.forEach((value, key) => {\n rgroup.frags.add(key)\n })\n if (graphItem.rlogic) struct.rgroups.set(graphItem.rlogic.number, rgroup)\n return struct\n}\n\nexport function rgroupLogicToStruct(rglogic) {\n const params = {}\n ifDef(params, 'range', rglogic.range)\n ifDef(params, 'resth', rglogic.resth)\n ifDef(params, 'ifthen', rglogic.ifthen)\n\n return new RGroup(params)\n}\n","import { RxnPlus, RxnArrow } from '../../../chem/struct'\n\nexport function rxnToStruct(graphItem, struct) {\n if (graphItem.type === 'arrow') {\n struct.rxnArrows.add(\n new RxnArrow({\n pp: {\n x: graphItem.location[0],\n y: graphItem.location[1],\n z: graphItem.location[2]\n }\n })\n )\n } else {\n struct.rxnPluses.add(\n new RxnPlus({\n pp: {\n x: graphItem.location[0],\n y: graphItem.location[1],\n z: graphItem.location[2]\n }\n })\n )\n }\n return struct\n}\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\nimport Pile from '../../../util/pile'\nimport Vec2 from '../../../util/vec2'\n\nexport function prepareStructForGraph(struct) {\n const graphNodes = []\n\n const rgFrags = new Set() // skip this when writing molecules\n for (const [rgnumber, rgroup] of struct.rgroups.entries()) {\n // RGroups writing\n rgroup.frags.forEach(frid => rgFrags.add(frid))\n\n const fragsAtoms = Array.from(rgroup.frags.values()).reduce(\n (res, frid) => res.union(struct.getFragmentIds(frid)),\n new Pile()\n )\n\n graphNodes.push({\n type: 'rgroup',\n fragment: struct.clone(fragsAtoms),\n center: getFragmentCenter(struct, fragsAtoms),\n data: { rgnumber, rgroup }\n })\n }\n\n const molFrags = Array.from(struct.frags.keys()).filter(\n fid => !rgFrags.has(fid)\n )\n const moleculeFragsAtoms = molFrags.reduce((acc, fid) => {\n const fragAtoms = struct.getFragmentIds(fid)\n acc = acc.union(fragAtoms)\n return acc\n }, new Pile())\n\n graphNodes.push({\n type: 'molecule',\n fragment: struct.clone(moleculeFragsAtoms),\n center: getFragmentCenter(struct, moleculeFragsAtoms)\n })\n\n struct.rxnArrows.forEach(item => {\n graphNodes.push({\n type: 'arrow',\n center: item.pp,\n data: {}\n })\n })\n\n struct.rxnPluses.forEach(item => {\n graphNodes.push({\n type: 'plus',\n center: item.pp,\n data: {}\n })\n })\n\n struct.simpleObjects.forEach(item => {\n graphNodes.push({\n type: 'simpleObject',\n center: item.pos[0],\n data: {\n mode: item.mode,\n pos: item.pos\n }\n })\n })\n\n return graphNodes.sort((a, b) => a.center.x - b.center.x)\n}\n\nfunction getFragmentCenter(struct, atomSet) {\n const bb = struct.getCoordBoundingBox(atomSet)\n return Vec2.centre(bb.min, bb.max)\n}\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\nimport Struct from '../../chem/struct'\nimport { headerToGraph } from './toGraph/headerToGraph'\nimport { moleculeToGraph } from './toGraph/moleculeToGraph'\nimport { rgroupToGraph } from './toGraph/rgroupToGraph'\nimport { arrowToGraph, plusToGraph } from './toGraph/rxnToGraph'\nimport { simpleObjectToGraph } from './toGraph/simpleObjectToGraph'\nimport { moleculeToStruct } from './fromGraph/moleculeToStruct'\nimport { rgroupToStruct } from './fromGraph/rgroupToStruct'\nimport { rxnToStruct } from './fromGraph/rxnToStruct'\nimport { simpleObjectToStruct } from './fromGraph/simpleObjectToStruct'\n\nimport { prepareStructForGraph } from './toGraph/prepare'\n\nfunction toGraph(struct) {\n const result = {\n root: {\n nodes: []\n }\n }\n\n const header = headerToGraph(struct)\n if (header) result.header = header\n\n const graphNodes = prepareStructForGraph(struct)\n\n let moleculeId = 0\n graphNodes.forEach(item => {\n switch (item.type) {\n case 'molecule': {\n result.root.nodes.push({ $ref: `mol${moleculeId}` })\n result[`mol${moleculeId++}`] = moleculeToGraph(item.fragment)\n break\n }\n case 'rgroup': {\n result.root.nodes.push({ $ref: `rg${item.data.rgnumber}` })\n result[`rg${item.data.rgnumber}`] = rgroupToGraph(\n item.fragment,\n item.data\n )\n break\n }\n case 'plus': {\n result.root.nodes.push(plusToGraph(item))\n break\n }\n case 'arrow': {\n result.root.nodes.push(arrowToGraph(item))\n break\n }\n case 'simpleObject': {\n result.root.nodes.push(simpleObjectToGraph(item))\n break\n }\n default:\n break\n }\n })\n\n return result\n}\n\nfunction fromGraph(graph) {\n const resultingStruct = new Struct()\n resultingStruct.name = graph.header ? graph.header.moleculeName : null\n\n const nodes = graph.root.nodes\n Object.keys(nodes).forEach(i => {\n if (nodes[i].type) parseNode(nodes[i], resultingStruct)\n else if (nodes[i].$ref) parseNode(graph[nodes[i].$ref], resultingStruct)\n })\n\n return resultingStruct\n}\n\nfunction parseNode(node, struct) {\n const type = node.type\n switch (type) {\n case 'arrow':\n rxnToStruct(node, struct)\n break\n case 'plus':\n rxnToStruct(node, struct)\n break\n case 'simpleObject':\n simpleObjectToStruct(node, struct)\n break\n case 'molecule':\n moleculeToStruct(node).mergeInto(struct)\n break\n case 'rgroup':\n rgroupToStruct(node).mergeInto(struct)\n break\n default:\n break\n }\n}\n\nexport default {\n toGraph,\n fromGraph\n}\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\nimport { SimpleObject } from '../../../chem/struct'\nexport function simpleObjectToStruct(graphItem, struct) {\n struct.simpleObjects.add(new SimpleObject(graphItem.data))\n return struct\n}\n","import rootSchema from '../../schemes/rootSchema'\nimport { ifDef } from '../../utils'\n\nexport function headerToGraph(struct) {\n const header = {}\n\n const headerSchema = rootSchema.header.properties\n ifDef(header, 'moleculeName', struct.name, headerSchema.moleculeName.default)\n ifDef(header, 'creatorProgram', null, headerSchema.moleculeName.default)\n ifDef(header, 'comment', null, headerSchema.moleculeName.default)\n\n return Object.keys(header).length !== 0 ? header : null\n}\n","export function arrowToGraph(arrowNode) {\n const coord = arrowNode.center\n return {\n type: 'arrow',\n location: [coord.x, coord.y, coord.z],\n prop: arrowNode.data\n }\n}\n\nexport function plusToGraph(plusNode) {\n const coord = plusNode.center\n return {\n type: 'plus',\n location: [coord.x, coord.y, coord.z],\n prop: plusNode.data\n }\n}\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\nexport function simpleObjectToGraph(simpleObjectNode) {\n return {\n type: 'simpleObject',\n data: simpleObjectNode.data\n }\n}\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport molfile from '../../../chem/molfile'\nimport smiles from '../../../chem/smiles'\nimport graph from '../../../format/chemGraph'\n\nexport const map = {\n mol: {\n name: 'MDL Molfile',\n mime: 'chemical/x-mdl-molfile',\n ext: ['.mol'],\n supportsCoords: true\n },\n rxn: {\n name: 'MDL Rxnfile',\n mime: 'chemical/x-mdl-rxnfile',\n ext: ['.rxn'],\n supportsCoords: true\n },\n smiles: {\n name: 'Daylight SMILES',\n mime: 'chemical/x-daylight-smiles',\n ext: ['.smi', '.smiles']\n },\n 'smiles-ext': {\n name: 'Extended SMILES',\n mime: 'chemical/x-chemaxon-cxsmiles',\n ext: ['.cxsmi', '.cxsmiles']\n },\n smarts: {\n name: 'Daylight SMARTS',\n mime: 'chemical/x-daylight-smarts',\n ext: ['.smarts']\n },\n inchi: {\n name: 'InChI',\n mime: 'chemical/x-inchi',\n ext: ['.inchi']\n },\n 'inchi-aux': {\n name: 'InChI AuxInfo',\n mime: 'chemical/x-inchi-aux',\n ext: ['.inchi']\n },\n cml: {\n name: 'CML',\n mime: 'chemical/x-cml',\n ext: ['.cml', '.mrv'],\n supportsCoords: true\n },\n graph: {\n name: 'Graph Format',\n mime: 'application/json',\n ext: ['.ket']\n }\n}\n\nexport function guess(structStr, strict) {\n // Mimic Indigo/molecule_auto_loader.cpp as much as possible\n const molStr = structStr.trim()\n\n try {\n if (JSON.parse(molStr)) return 'graph'\n } catch (er) {} // eslint-disable-line\n\n if (molStr.indexOf('$RXN') !== -1) return 'rxn'\n\n const molMatch = molStr.match(/^(M {2}END|\\$END MOL)$/m)\n\n if (molMatch) {\n const end = molMatch.index + molMatch[0].length\n if (\n end === molStr.length ||\n molStr.slice(end, end + 20).search(/^\\$(MOL|END CTAB)$/m) !== -1\n )\n return 'mol'\n }\n if (molStr[0] === '<' && molStr.indexOf(' {\n const moldata = molfile.stringify(struct)\n if (format === 'mol' || format === 'rxn') {\n resolve(moldata)\n } else if (format === 'smiles') {\n resolve(smiles.stringify(struct))\n } else {\n const converting = server\n .then(() =>\n server.convert(\n {\n struct: moldata,\n output_format: map[format].mime\n },\n serverOpts\n )\n )\n .catch(err => {\n throw err.message === 'Server is not compatible'\n ? Error(`${map[format].name} is not supported in standalone mode.`)\n : Error(`Convert error!\\n${err.message}`)\n })\n .then(res => res.struct)\n resolve(converting)\n }\n })\n}\n\nexport function fromString(structStr, opts, server, serverOpts) {\n return new Promise(resolve => {\n const format = guess(structStr)\n console.assert(map[format], 'No such format')\n if (format === 'graph') {\n const res = graph.fromGraph(JSON.parse(structStr))\n resolve(res)\n } else if (\n (format === 'mol' && molfile.version(structStr) === 'V2000') ||\n format === 'rxn'\n ) {\n const struct = molfile.parse(structStr, opts)\n resolve(struct)\n } else {\n const withCoords = map[format].supportsCoords\n const converting = server\n .then(() =>\n withCoords\n ? server.convert(\n {\n struct: structStr,\n output_format: map['mol'].mime\n },\n serverOpts\n )\n : server.layout(\n {\n struct: structStr.trim(),\n output_format: map['mol'].mime\n },\n serverOpts\n )\n )\n .catch(err => {\n if (err.message === 'Server is not compatible') {\n const formatError =\n format === 'smiles'\n ? `${map['smiles-ext'].name} and opening of ${map['smiles'].name}`\n : map[format].name\n throw Error(`${formatError} is not supported in standalone mode.`)\n } else {\n throw Error(`Convert error!\\n${err.message}`)\n }\n })\n .then(res => {\n const struct = molfile.parse(res.struct)\n if (!withCoords) struct.rescale()\n return struct\n })\n resolve(converting)\n }\n })\n}\n\nexport function couldBeSaved(struct, format) {\n let warnings = []\n if (\n format === 'inchi' ||\n format === 'inchi-aux' ||\n format === 'smiles' ||\n format === 'smiles-ext'\n ) {\n if (struct.rgroups.size !== 0)\n warnings.push(\n `In ${map[format].name} the structure will be saved without R-group fragments`\n )\n struct = struct.clone() // need this: .getScaffold()\n const isRg = struct.atoms.find((ind, atom) => atom.label === 'R#')\n if (isRg !== null)\n warnings.push(\n `In ${map[format].name} the structure will be saved without R-group members`\n )\n\n const isSg = struct.sgroups.find(\n (ind, sg) =>\n sg.type !== 'MUL' && !/^INDIGO_.+_DESC$/i.test(sg.data.fieldName)\n )\n if (isSg !== null)\n warnings.push(\n `In ${map[format].name} the structure will be saved without S-groups`\n )\n }\n\n if (\n format === 'smiles' ||\n format === 'smiles-ext' ||\n format === 'smarts' ||\n format === 'inchi' ||\n format === 'inchi-aux' ||\n format === 'cml'\n ) {\n const isVal = struct.atoms.find((ind, atom) => atom.explicitValence >= 0)\n if (isVal !== null)\n warnings.push(`In ${map[format].name} valence is not supported`)\n }\n\n if (warnings.length !== 0) return warnings.join('\\n')\n\n return null\n}\n","import React from 'react'\n\nexport interface ISettingsContext {\n staticResourcesUrl: string\n}\n\nconst settingsContext = React.createContext(\n {} as ISettingsContext\n)\n\nexport default settingsContext\n","import React from 'react'\n\nconst formContext = React.createContext(null)\n\nexport default formContext\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport React, { Component, createRef } from 'react'\n\nconst ieCb = window.clipboardData\n\nclass ClipArea extends Component {\n constructor(props) {\n super(props)\n this.textAreaRef = createRef()\n }\n\n componentDidMount() {\n const el = this.textAreaRef.current\n this.target = this.props.target || el.parentNode\n\n this.listeners = {\n mouseup: event => {\n if (\n el === event.target ||\n (!isActiveElement(event.target) && this.props.focused())\n )\n autofocus(el)\n },\n mousedown: event => {\n if (event.shiftKey && !isActiveElement(event.target))\n event.preventDefault()\n },\n copy: event => {\n if (this.props.focused() && this.props.onCopy) {\n const data = this.props.onCopy()\n\n if (data) copy(event.clipboardData, data)\n\n event.preventDefault()\n }\n },\n cut: event => {\n if (this.props.focused() && this.props.onCut) {\n const data = this.props.onCut()\n\n if (data) copy(event.clipboardData, data)\n\n event.preventDefault()\n }\n },\n paste: event => {\n if (this.props.focused() && this.props.onPaste) {\n const data = paste(event.clipboardData, this.props.formats)\n\n if (data) this.props.onPaste(data)\n\n event.preventDefault()\n }\n }\n }\n\n Object.keys(this.listeners).forEach(en => {\n this.target.addEventListener(en, this.listeners[en])\n })\n }\n\n shouldComponentUpdate() {\n return false\n }\n\n componentWillUnmount() {\n Object.keys(this.listeners).forEach(en => {\n this.target.removeEventListener(en, this.listeners[en])\n })\n }\n\n render() {\n return (\n \n )\n }\n}\n\nfunction isActiveElement(el) {\n if (el.tagName === 'INPUT' && el.type === 'button') return false\n return ['INPUT', 'SELECT', 'TEXTAREA', 'OPTION', 'LABEL'].includes(el.tagName)\n}\n\nfunction autofocus(cliparea) {\n cliparea.value = ' '\n cliparea.focus()\n cliparea.select()\n}\n\nfunction copy(cb, data) {\n if (!cb && ieCb) {\n ieCb.setData('text', data['text/plain'])\n } else {\n let curFmt = null\n cb.setData('text/plain', data['text/plain'])\n try {\n Object.keys(data).forEach(fmt => {\n curFmt = fmt\n cb.setData(fmt, data[fmt])\n })\n } catch (ex) {\n console.info(`Could not write exact type ${curFmt}`)\n }\n }\n}\n\nfunction paste(cb, formats) {\n let data = {}\n if (!cb && ieCb) {\n data['text/plain'] = ieCb.getData('text')\n } else {\n data['text/plain'] = cb.getData('text/plain')\n data = formats.reduce((res, fmt) => {\n const d = cb.getData(fmt)\n if (d) res[fmt] = d\n return res\n }, data)\n }\n return data\n}\n\nexport const actions = ['cut', 'copy', 'paste']\n\nexport function exec(action) {\n let enabled = document.queryCommandSupported(action)\n if (enabled) {\n try {\n enabled = document.execCommand(action) || window.ClipboardEvent || ieCb\n } catch (ex) {\n // FF < 41\n enabled = false\n }\n }\n return enabled\n}\n\nexport default ClipArea\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport * as KN from 'w3c-keyname'\n\nconst mac =\n typeof navigator !== 'undefined' ? /Mac/.test(navigator.platform) : false // eslint-disable-line no-undef\n\nfunction normalizeKeyName(name) {\n const parts = name.split(/\\+(?!$)/)\n let result = parts[parts.length - 1]\n if (result === 'Space') result = ' '\n let alt\n let ctrl\n let shift\n let meta\n\n for (let i = 0; i < parts.length - 1; i++) {\n const mod = parts[i]\n if (/^(cmd|meta|m)$/i.test(mod)) meta = true\n else if (/^a(lt)?$/i.test(mod)) alt = true\n else if (/^(c|ctrl|control)$/i.test(mod)) ctrl = true\n else if (/^s(hift)?$/i.test(mod)) shift = true\n else if (/^mod$/i.test(mod))\n if (mac) meta = true\n else ctrl = true\n else throw new Error('Unrecognized modifier name: ' + mod)\n }\n\n if (alt) result = 'Alt+' + result\n if (ctrl) result = 'Ctrl+' + result\n if (meta) result = 'Meta+' + result\n if (shift) result = 'Shift+' + result\n\n return result\n}\n\nfunction normalizeKeyMap(map) {\n const copy = Object.create(null)\n\n Object.keys(map).forEach(prop => {\n copy[normalizeKeyName(prop)] = map[prop]\n })\n\n return copy\n}\n\nfunction modifiers(name, event, shift) {\n if (event.altKey) name = 'Alt+' + name\n if (event.ctrlKey) name = 'Ctrl+' + name\n if (event.metaKey) name = 'Meta+' + name\n if (shift !== false && event.shiftKey) name = 'Shift+' + name\n\n return name\n}\n\nfunction rusToEng(name, event) {\n return name\n .replace(/[а-я]/, KN.base[event.keyCode])\n .replace(/[А-Я]/, KN.shift[event.keyCode])\n}\n\nfunction normalizeKeyEvent(event, base = false) {\n const name = rusToEng(KN.keyName(event), event)\n const isChar = name.length === 1 && name !== ' '\n\n return isChar && !base\n ? modifiers(name, event, !isChar)\n : modifiers(KN.base[event.keyCode], event, true)\n}\n\nfunction keyNorm(obj) {\n if (obj instanceof KeyboardEvent)\n // eslint-disable-line no-undef\n return normalizeKeyEvent(...arguments) // eslint-disable-line prefer-rest-params\n\n return typeof obj === 'object' ? normalizeKeyMap(obj) : normalizeKeyName(obj)\n}\n\nfunction lookup(map, event) {\n let name = rusToEng(KN.keyName(event), event)\n if (name === 'Add') name = '+' // numpad '+' and '-'\n if (name === 'Subtract') name = '-'\n\n const isChar = name.length === 1 && name !== ' '\n let res = map[modifiers(name, event, !isChar)]\n let baseName\n\n if (event.shiftKey && isChar && (baseName = KN.base[event.keyCode]))\n res = map[modifiers(baseName, event, true)] || res\n\n return res\n}\n\nkeyNorm.lookup = lookup\n\nexport default keyNorm\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\n/* schema utils */\nfunction constant(schema, prop) {\n const desc = schema.properties[prop]\n return desc.constant || desc.enum[0] // see https://git.io/v6hyP\n}\n\nexport function mapOf(schema, prop) {\n console.assert(schema.oneOf)\n return schema.oneOf.reduce((res, desc) => {\n res[constant(desc, prop)] = desc\n return res\n }, {})\n}\n\nexport function selectListOf(schema, prop) {\n const desc = schema.properties && schema.properties[prop]\n if (desc) {\n return desc.enum.map((value, i) => {\n const title = desc.enumNames && desc.enumNames[i]\n return title ? { title, value } : value\n })\n }\n return schema.oneOf.map(ds =>\n !ds.title\n ? constant(ds, prop)\n : {\n title: ds.title,\n value: constant(ds, prop)\n }\n )\n}\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport { range } from 'lodash/fp'\n\nimport { mapOf } from './schema-helper'\n\nexport const atom = {\n title: 'Atom',\n type: 'object',\n required: 'label',\n properties: {\n label: {\n title: 'Label',\n type: 'string', // TODO:should really be enum of elements\n maxLength: 3,\n invalidMessage: 'Wrong label'\n },\n alias: {\n title: 'Alias',\n type: 'string',\n invalidMessage: 'Leading and trailing spaces are not allowed'\n },\n charge: {\n title: 'Charge',\n type: 'string',\n pattern: /^([+-]?)(\\d{1,3}|1000)([+-]?)$/,\n maxLength: 5,\n default: '0',\n invalidMessage: 'Invalid charge value'\n },\n explicitValence: {\n title: 'Valence',\n enum: [-1, 0, 1, 2, 3, 4, 5, 6, 7, 8],\n enumNames: ['', '0', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII'],\n default: -1\n },\n isotope: {\n title: 'Isotope',\n type: 'integer',\n minimum: 0,\n default: 0,\n invalidMessage: 'There must be integer'\n },\n radical: {\n title: 'Radical',\n enum: [0, 2, 1, 3],\n enumNames: [\n '',\n 'Monoradical',\n 'Diradical (singlet)',\n 'Diradical (triplet)'\n ],\n default: 0\n },\n ringBondCount: {\n title: 'Ring bond count',\n enum: [0, -2, -1, 2, 3, 4],\n enumNames: ['', 'As drawn', '0', '2', '3', '4'],\n default: 0\n },\n hCount: {\n title: 'H count',\n enum: [0, 1, 2, 3, 4, 5],\n enumNames: ['', '0', '1', '2', '3', '4'],\n default: 0\n },\n substitutionCount: {\n title: 'Substitution count',\n enum: [0, -2, -1, 1, 2, 3, 4, 5, 6],\n enumNames: ['', 'As drawn', '0', '1', '2', '3', '4', '5', '6'],\n default: 0\n },\n unsaturatedAtom: {\n title: 'Unsaturated',\n type: 'boolean',\n default: false\n },\n invRet: {\n title: 'Inversion',\n enum: [0, 1, 2],\n enumNames: ['', 'Inverts', 'Retains'],\n default: 0\n },\n exactChangeFlag: {\n title: 'Exact change',\n type: 'boolean',\n default: false\n }\n }\n}\n\nexport const rgroupSchema = {\n title: 'R-group',\n type: 'object',\n properties: {\n values: {\n type: 'array',\n items: {\n type: 'string',\n enum: range(1, 33),\n enumNames: range(1, 33).map(item => 'R' + item)\n }\n }\n }\n}\n\nexport const labelEdit = {\n title: 'Label Edit',\n type: 'object',\n required: ['label'],\n properties: {\n label: {\n title: 'Atom',\n default: '',\n invalidMessage: 'Wrong atom symbol'\n }\n }\n}\n\nexport const attachmentPoints = {\n title: 'Attachment Points',\n type: 'object',\n properties: {\n primary: {\n title: 'Primary attachment point',\n type: 'boolean'\n },\n secondary: {\n title: 'Secondary attachment point',\n type: 'boolean'\n }\n }\n}\n\nexport const bond = {\n title: 'Bond',\n type: 'object',\n required: ['type'],\n properties: {\n type: {\n title: 'Type',\n enum: [\n 'single',\n 'up',\n 'down',\n 'updown',\n 'double',\n 'crossed',\n 'triple',\n 'aromatic',\n 'any',\n 'singledouble',\n 'singlearomatic',\n 'doublearomatic'\n ],\n enumNames: [\n 'Single',\n 'Single Up',\n 'Single Down',\n 'Single Up/Down',\n 'Double',\n 'Double Cis/Trans',\n 'Triple',\n 'Aromatic',\n 'Any',\n 'Single/Double',\n 'Single/Aromatic',\n 'Double/Aromatic'\n ],\n default: 'single'\n },\n topology: {\n title: 'Topology',\n enum: [0, 1, 2],\n enumNames: ['Either', 'Ring', 'Chain'],\n default: 0\n },\n center: {\n title: 'Reacting Center',\n enum: [0, -1, 1, 2, 4, 8, 12], // 5, 9, 13\n enumNames: [\n 'Unmarked',\n 'Not center',\n 'Center',\n 'No change',\n 'Made/broken',\n 'Order changes',\n 'Made/broken and changes'\n ], // \"Order changes\" x 3\n default: 0\n }\n }\n}\n\nconst sgroup = {\n title: 'SGroup',\n type: 'object',\n required: ['type'],\n oneOf: [\n {\n key: 'GEN',\n title: 'Generic',\n properties: {\n type: { enum: ['GEN'] }\n }\n },\n {\n key: 'MUL',\n title: 'Multiple group',\n type: 'object',\n properties: {\n type: { enum: ['MUL'] },\n mul: {\n title: 'Repeat count',\n type: 'integer',\n default: 1,\n minimum: 1,\n maximum: 1000,\n invalidMessage: 'Value out of range: must be between 1 and 1000'\n }\n },\n required: ['mul']\n },\n {\n key: 'SRU',\n title: 'SRU polymer',\n properties: {\n type: { enum: ['SRU'] },\n subscript: {\n title: 'Polymer label',\n type: 'string',\n default: 'n',\n pattern: /^[a-zA-Z]$/,\n invalidMessage: 'SRU subscript should consist of a single letter'\n },\n connectivity: {\n title: 'Repeat Pattern',\n enum: ['ht', 'hh', 'eu'],\n enumNames: ['Head-to-tail', 'Head-to-head', 'Either unknown'],\n default: 'ht'\n }\n },\n required: ['subscript', 'connectivity']\n },\n {\n key: 'SUP',\n title: 'Superatom',\n properties: {\n type: { enum: ['SUP'] },\n name: {\n title: 'Name',\n type: 'string',\n default: '',\n minLength: 1,\n invalidMessage: 'Please, provide a name for the superatom'\n }\n },\n required: ['name']\n }\n ]\n}\nexport const sgroupMap = mapOf(sgroup, 'type')\n\nexport const rgroupLogic = {\n title: 'R-Group',\n type: 'object',\n properties: {\n range: {\n title: 'Occurrence',\n type: 'string',\n maxLength: 50,\n invalidMessage: 'Wrong value'\n },\n resth: {\n title: 'RestH',\n type: 'boolean'\n },\n ifthen: {\n title: 'Condition',\n type: 'integer',\n minium: 0\n }\n }\n}\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport { mapOf } from './schema-helper'\n\nconst radioButtonsSchema = {\n enum: ['Absolute', 'Relative', 'Attached'],\n default: 'Absolute'\n}\n\nconst contextSchema = {\n title: 'Context',\n enum: ['Fragment', 'Multifragment', 'Bond', 'Atom', 'Group'],\n default: 'Fragment'\n}\n\nconst sData = {\n Fragment: {\n title: 'Fragment',\n type: 'Object',\n oneOf: [\n {\n key: 'FRG_STR',\n title: 'MDLBG_FRAGMENT_STEREO',\n properties: {\n type: { enum: ['DAT'] },\n fieldName: {\n title: 'Field name',\n enum: ['MDLBG_FRAGMENT_STEREO'],\n default: 'MDLBG_FRAGMENT_STEREO'\n },\n fieldValue: {\n title: 'Field value',\n type: 'array',\n items: {\n enum: [\n 'abs',\n '(+)-enantiomer',\n '(-)-enantiomer',\n 'racemate',\n 'steric',\n 'rel',\n 'R(a)',\n 'S(a)',\n 'R(p)',\n 'S(p)'\n ]\n },\n default: ['abs']\n },\n radiobuttons: radioButtonsSchema\n },\n required: ['fieldName', 'fieldValue', 'radiobuttons']\n },\n {\n key: 'FRG_COEFF',\n title: 'MDLBG_FRAGMENT_COEFFICIENT',\n properties: {\n type: { enum: ['DAT'] },\n fieldName: {\n title: 'Field name',\n enum: ['MDLBG_FRAGMENT_COEFFICIENT'],\n default: 'MDLBG_FRAGMENT_COEFFICIENT'\n },\n fieldValue: {\n title: 'Field value',\n type: 'string',\n default: '',\n minLength: 1,\n invalidMessage: 'Please, specify field name'\n },\n radiobuttons: radioButtonsSchema\n },\n required: ['fieldName', 'fieldValue', 'radiobuttons']\n },\n {\n key: 'FRG_CHRG',\n title: 'MDLBG_FRAGMENT_CHARGE',\n properties: {\n type: { enum: ['DAT'] },\n fieldName: {\n title: 'Field name',\n enum: ['MDLBG_FRAGMENT_CHARGE'],\n default: 'MDLBG_FRAGMENT_CHARGE'\n },\n fieldValue: {\n title: 'Field value',\n type: 'string',\n default: '',\n minLength: 1,\n invalidMessage: 'Please, specify field name'\n },\n radiobuttons: radioButtonsSchema\n },\n required: ['fieldName', 'fieldValue', 'radiobuttons']\n },\n {\n key: 'FRG_RAD',\n title: 'MDLBG_FRAGMENT_RADICALS',\n properties: {\n type: { enum: ['DAT'] },\n fieldName: {\n title: 'Field name',\n enum: ['MDLBG_FRAGMENT_RADICALS'],\n default: 'MDLBG_FRAGMENT_RADICALS'\n },\n fieldValue: {\n title: 'Field value',\n type: 'string',\n default: '',\n minLength: 1,\n invalidMessage: 'Please, specify field name'\n },\n radiobuttons: radioButtonsSchema\n },\n required: ['fieldName', 'fieldValue', 'radiobuttons']\n }\n ]\n },\n Multifragment: {\n title: 'Multifragment',\n type: 'Object',\n oneOf: [\n {\n key: 'MLT_FRG',\n title: 'KETCHER_MULTIPLE_FRAGMENT',\n properties: {\n type: { enum: ['DAT'] },\n fieldName: {\n title: 'Field name',\n enum: ['KETCHER_MULTIPLE_FRAGMENT'],\n default: 'KETCHER_MULTIPLE_FRAGMENT'\n },\n fieldValue: {\n title: 'Field value',\n type: 'array',\n items: {\n enum: [\n 'aerosol',\n 'alloy',\n 'catenane',\n 'complex',\n 'composite',\n 'co-polymer',\n 'emulsion',\n 'host-guest complex',\n 'mixture',\n 'rotaxane',\n 'suspension'\n ]\n },\n default: ['aerosol']\n },\n radiobuttons: radioButtonsSchema\n },\n required: ['fieldName', 'fieldValue', 'radiobuttons']\n }\n ]\n },\n Bond: {\n title: 'Bond',\n type: 'Object',\n oneOf: [\n {\n key: 'SB_STR',\n title: 'MDLBG_STEREO_KEY',\n properties: {\n type: { enum: ['DAT'] },\n fieldName: {\n title: 'Field name',\n enum: ['MDLBG_STEREO_KEY'],\n default: 'MDLBG_STEREO_KEY'\n },\n fieldValue: {\n title: 'Field value',\n type: 'array',\n items: {\n enum: [\n 'erythro',\n 'threo',\n 'alpha',\n 'beta',\n 'endo',\n 'exo',\n 'anti',\n 'syn',\n 'ECL',\n 'STG'\n ]\n },\n default: ['erythro']\n },\n radiobuttons: radioButtonsSchema\n },\n required: ['fieldName', 'fieldValue', 'radiobuttons']\n },\n {\n key: 'SB_BND',\n title: 'MDLBG_BOND_KEY',\n properties: {\n type: { enum: ['DAT'] },\n fieldName: {\n title: 'Field name',\n enum: ['MDLBG_BOND_KEY'],\n default: 'MDLBG_BOND_KEY'\n },\n fieldValue: {\n title: 'Field value',\n type: 'array',\n items: {\n enum: ['Value=4']\n },\n default: ['Value=4']\n },\n radiobuttons: radioButtonsSchema\n },\n required: ['fieldName', 'fieldValue', 'radiobuttons']\n }\n ]\n },\n Atom: {\n title: 'Atom',\n type: 'Object',\n oneOf: [\n {\n key: 'AT_STR',\n title: 'MDLBG_STEREO_KEY',\n properties: {\n type: { enum: ['DAT'] },\n fieldName: {\n title: 'Field name',\n enum: ['MDLBG_STEREO_KEY'],\n default: 'MDLBG_STEREO_KEY'\n },\n fieldValue: {\n title: 'Field value',\n type: 'array',\n items: {\n enum: [\n 'RS',\n 'SR',\n 'P-3',\n 'P-3-PI',\n 'SP-4',\n 'SP-4-PI',\n 'T-4',\n 'T-4-PI',\n 'SP-5',\n 'SP-5-PI',\n 'TB-5',\n 'TB-5-PI',\n 'OC-6',\n 'TP-6',\n 'PB-7',\n 'CU-8',\n 'SA-8',\n 'DD-8',\n 'HB-9',\n 'TPS-9'\n ]\n },\n default: ['RS']\n },\n radiobuttons: radioButtonsSchema\n },\n required: ['fieldName', 'fieldValue', 'radiobuttons']\n }\n ]\n },\n Group: {\n title: 'Group',\n type: 'Object',\n oneOf: [\n {\n key: 'GRP_STR',\n title: 'MDLBG_STEREO_KEY',\n properties: {\n type: { enum: ['DAT'] },\n fieldName: {\n title: 'Field name',\n enum: ['MDLBG_STEREO_KEY'],\n default: 'MDLBG_STEREO_KEY'\n },\n fieldValue: {\n title: 'Field value',\n type: 'array',\n items: {\n enum: ['cis', 'trans']\n },\n default: ['cis']\n },\n radiobuttons: radioButtonsSchema\n },\n required: ['fieldName', 'fieldValue', 'radiobuttons']\n }\n ]\n }\n}\n\nexport const sdataCustomSchema = {\n key: 'Custom',\n properties: {\n type: { enum: ['DAT'] },\n context: {\n title: 'Context',\n enum: ['Fragment', 'Multifragment', 'Bond', 'Atom', 'Group'],\n default: 'Fragment'\n },\n fieldName: {\n title: 'Field name',\n type: 'string',\n default: '',\n minLength: 1,\n invalidMessage: 'Please, specify field name'\n },\n fieldValue: {\n title: 'Field value',\n type: 'string',\n default: '',\n minLength: 1,\n invalidMessage: 'Please, specify field value'\n },\n radiobuttons: {\n enum: ['Absolute', 'Relative', 'Attached'],\n default: 'Absolute'\n }\n },\n required: ['context', 'fieldName', 'fieldValue', 'radiobuttons']\n}\n\nexport const sdataSchema = Object.keys(sData).reduce((acc, title) => {\n acc[title] = mapOf(sData[title], 'fieldName')\n Object.keys(acc[title]).forEach(fieldName => {\n acc[title][fieldName].properties.context = contextSchema\n })\n return acc\n}, {})\n\n/**\n * Returns first key of passed object\n * @param obj { object }\n */\nfunction firstKeyOf(obj) {\n return Object.keys(obj)[0]\n}\n\n/**\n * Returns schema default values. Depends on passed arguments:\n * pass schema only -> returns default context\n * pass schema & context -> returns default fieldName\n * pass schema & context & fieldName -> returns default fieldValue\n * @param context? { string }\n * @param fieldName? { string }\n * @returns { string }\n */\nexport function getSdataDefault(context, fieldName) {\n if (!context && !fieldName) return firstKeyOf(sdataSchema)\n\n if (!fieldName) return firstKeyOf(sdataSchema[context])\n\n return sdataSchema[context][fieldName]\n ? sdataSchema[context][fieldName].properties.fieldValue.default\n : ''\n}\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport { capitalize } from 'lodash/fp'\n\nimport { Bond, AtomList } from '../../../chem/struct/index'\nimport element from '../../../chem/element'\nimport { sdataSchema } from '../schema/sdata-schema'\nimport { atom as atomSchema } from '../schema/struct-schema'\n\nexport function fromElement(selem) {\n if (selem.label === 'R#') {\n return {\n type: 'rlabel',\n values: fromRlabel(selem.rglabel),\n ...selem\n }\n }\n if (selem.label === 'L#') return fromAtomList(selem)\n\n if (element.map[selem.label]) return fromAtom(selem)\n\n if (!selem.label && 'attpnt' in selem) return { ap: fromApoint(selem.attpnt) }\n\n return selem // probably generic\n}\n\nexport function toElement(elem) {\n if (elem.type === 'rlabel') {\n return {\n label: elem.values.length ? 'R#' : 'C',\n rglabel: elem.values.length === 0 ? null : toRlabel(elem.values)\n }\n }\n if (elem.type === 'list' || elem.type === 'not-list') return toAtomList(elem)\n\n if (!elem.label && 'ap' in elem) return { attpnt: toApoint(elem.ap) }\n\n if (element.map[capitalize(elem.label)]) return toAtom(elem)\n\n if (\n elem.label === 'A' ||\n elem.label === '*' ||\n elem.label === 'Q' ||\n elem.label === 'X' ||\n elem.label === 'R'\n ) {\n elem.pseudo = elem.label\n return toAtom(elem)\n }\n\n return elem\n}\n\nfunction fromAtom(satom) {\n const alias = satom.alias || ''\n const charge = satom.charge.toString()\n\n return {\n alias,\n label: satom.label,\n charge,\n isotope: satom.isotope,\n explicitValence: satom.explicitValence,\n radical: satom.radical,\n invRet: satom.invRet,\n exactChangeFlag: !!satom.exactChangeFlag,\n ringBondCount: satom.ringBondCount,\n substitutionCount: satom.substitutionCount,\n unsaturatedAtom: !!satom.unsaturatedAtom,\n hCount: satom.hCount,\n stereoParity: satom.stereoParity\n }\n}\n\nfunction toAtom(atom) {\n // TODO merge this to Atom.attrlist?\n // see ratomtool\n const chargeRegexp = atomSchema.properties.charge.pattern\n const pch = chargeRegexp.exec(atom.charge)\n const charge = pch ? parseInt(pch[1] + pch[3] + pch[2]) : atom.charge\n\n const conv = Object.assign({}, atom, {\n label: capitalize(atom.label),\n alias: atom.alias || null\n })\n if (charge !== undefined) conv.charge = charge\n return conv\n}\n\nfunction fromAtomList(satom) {\n return {\n type: satom.atomList.notList ? 'not-list' : 'list',\n values: satom.atomList.ids.map(i => element[i].label)\n }\n}\n\nfunction toAtomList(atom) {\n return {\n pseudo: null,\n label: 'L#',\n atomList: new AtomList({\n notList: atom.type === 'not-list',\n ids: atom.values.map(el => element.map[el])\n })\n }\n}\n\nexport function fromStereoLabel(stereoLabel) {\n if (stereoLabel === null) return { type: null }\n const stereo = stereoLabel.split('-')\n return {\n type: stereo[0],\n number: +stereo[1] || 0\n }\n}\n\nexport function toStereoLabel(sstereoLabel) {\n if (sstereoLabel.type === null) return null\n if (sstereoLabel.type === 'abs') return 'abs'\n return `${sstereoLabel.type}-${sstereoLabel.number}`\n}\n\nfunction fromApoint(sap) {\n return {\n primary: ((sap || 0) & 1) > 0,\n secondary: ((sap || 0) & 2) > 0\n }\n}\n\nfunction toApoint(ap) {\n return (ap.primary && 1) + (ap.secondary && 2)\n}\n\nfunction fromRlabel(rg) {\n const res = []\n let rgi\n let val\n for (rgi = 0; rgi < 32; rgi++) {\n if (rg & (1 << rgi)) {\n val = rgi + 1\n res.push(val) // push the string\n }\n }\n return res\n}\n\nfunction toRlabel(values) {\n let res = 0\n values.forEach(val => {\n const rgi = val - 1\n res |= 1 << rgi\n })\n return res\n}\n\nexport function fromBond(sbond) {\n const type = sbond.type\n const stereo = sbond.stereo\n return {\n type: fromBondType(type, stereo),\n topology: sbond.topology || 0,\n center: sbond.reactingCenterStatus || 0\n }\n}\n\nexport function toBond(bond) {\n return {\n topology: bond.topology,\n reactingCenterStatus: bond.center,\n ...toBondType(bond.type)\n }\n}\n\nexport function toBondType(caption) {\n return Object.assign({}, bondCaptionMap[caption])\n}\n\nfunction fromBondType(type, stereo) {\n for (const caption in bondCaptionMap) {\n if (\n bondCaptionMap[caption].type === type &&\n bondCaptionMap[caption].stereo === stereo\n )\n return caption\n }\n throw Error('No such bond caption')\n}\n\nconst bondCaptionMap = {\n single: {\n type: Bond.PATTERN.TYPE.SINGLE,\n stereo: Bond.PATTERN.STEREO.NONE\n },\n up: {\n type: Bond.PATTERN.TYPE.SINGLE,\n stereo: Bond.PATTERN.STEREO.UP\n },\n down: {\n type: Bond.PATTERN.TYPE.SINGLE,\n stereo: Bond.PATTERN.STEREO.DOWN\n },\n updown: {\n type: Bond.PATTERN.TYPE.SINGLE,\n stereo: Bond.PATTERN.STEREO.EITHER\n },\n double: {\n type: Bond.PATTERN.TYPE.DOUBLE,\n stereo: Bond.PATTERN.STEREO.NONE\n },\n crossed: {\n type: Bond.PATTERN.TYPE.DOUBLE,\n stereo: Bond.PATTERN.STEREO.CIS_TRANS\n },\n triple: {\n type: Bond.PATTERN.TYPE.TRIPLE,\n stereo: Bond.PATTERN.STEREO.NONE\n },\n aromatic: {\n type: Bond.PATTERN.TYPE.AROMATIC,\n stereo: Bond.PATTERN.STEREO.NONE\n },\n singledouble: {\n type: Bond.PATTERN.TYPE.SINGLE_OR_DOUBLE,\n stereo: Bond.PATTERN.STEREO.NONE\n },\n singlearomatic: {\n type: Bond.PATTERN.TYPE.SINGLE_OR_AROMATIC,\n stereo: Bond.PATTERN.STEREO.NONE\n },\n doublearomatic: {\n type: Bond.PATTERN.TYPE.DOUBLE_OR_AROMATIC,\n stereo: Bond.PATTERN.STEREO.NONE\n },\n any: {\n type: Bond.PATTERN.TYPE.ANY,\n stereo: Bond.PATTERN.STEREO.NONE\n }\n}\n\nexport function fromSgroup(ssgroup) {\n const type = ssgroup.type || 'GEN'\n const { context, fieldName, fieldValue, absolute, attached } = ssgroup.attrs\n\n if (absolute === false && attached === false)\n ssgroup.attrs.radiobuttons = 'Relative'\n else ssgroup.attrs.radiobuttons = attached ? 'Attached' : 'Absolute'\n\n if (\n sdataSchema[context][fieldName] &&\n sdataSchema[context][fieldName].properties.fieldValue.items\n )\n ssgroup.attrs.fieldValue = fieldValue.split('\\n')\n\n return Object.assign({ type }, ssgroup.attrs)\n}\n\nexport function toSgroup(sgroup) {\n const { type, radiobuttons, ...props } = sgroup\n const attrs = { ...props }\n\n const absolute = 'absolute'\n const attached = 'attached'\n\n switch (radiobuttons) {\n case 'Absolute':\n attrs[absolute] = true\n attrs[attached] = false\n break\n case 'Attached':\n attrs[absolute] = false\n attrs[attached] = true\n break\n case 'Relative':\n attrs[absolute] = false\n attrs[attached] = false\n break\n default:\n break\n }\n\n if (attrs.fieldName) attrs.fieldName = attrs.fieldName.trim()\n\n if (attrs.fieldValue) {\n attrs.fieldValue =\n typeof attrs.fieldValue === 'string'\n ? attrs.fieldValue.trim()\n : attrs.fieldValue\n }\n\n return {\n type,\n attrs\n }\n}\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport { bond as bondSchema } from '../data/schema/struct-schema'\nimport { toBondType } from '../data/convert/structconv'\n\nconst toolActions = {\n 'select-lasso': {\n title: 'Lasso Selection',\n shortcut: 'Escape',\n action: { tool: 'select', opts: 'lasso' }\n },\n 'select-rectangle': {\n title: 'Rectangle Selection',\n shortcut: 'Escape',\n action: { tool: 'select', opts: 'rectangle' }\n },\n 'select-fragment': {\n title: 'Fragment Selection',\n shortcut: 'Escape',\n action: { tool: 'select', opts: 'fragment' }\n },\n erase: {\n title: 'Erase',\n shortcut: ['Delete', 'Backspace'],\n action: { tool: 'eraser', opts: 1 } // TODO last selector mode is better\n },\n chain: {\n title: 'Chain',\n action: { tool: 'chain' }\n },\n 'enhanced-stereo': {\n shortcut: 'Alt+e',\n title: 'Enhanced Stereo',\n action: { tool: 'enhancedStereo' }\n },\n 'charge-plus': {\n shortcut: '5',\n title: 'Charge Plus',\n action: { tool: 'charge', opts: 1 }\n },\n 'charge-minus': {\n shortcut: '5',\n title: 'Charge Minus',\n action: { tool: 'charge', opts: -1 }\n },\n 'transform-rotate': {\n shortcut: 'Alt+r',\n title: 'Rotate Tool',\n action: { tool: 'rotate' }\n },\n 'transform-flip-h': {\n shortcut: 'Alt+h',\n title: 'Horizontal Flip',\n action: { tool: 'rotate', opts: 'horizontal' }\n },\n 'transform-flip-v': {\n shortcut: 'Alt+v',\n title: 'Vertical Flip',\n action: { tool: 'rotate', opts: 'vertical' }\n },\n sgroup: {\n shortcut: 'Mod+g',\n title: 'S-Group',\n action: { tool: 'sgroup' }\n },\n 'sgroup-data': {\n shortcut: 'Mod+g',\n title: 'Data S-Group',\n action: { tool: 'sgroup', opts: 'DAT' }\n },\n 'reaction-arrow': {\n title: 'Reaction Arrow Tool',\n action: { tool: 'reactionarrow' }\n },\n 'reaction-plus': {\n title: 'Reaction Plus Tool',\n action: { tool: 'reactionplus' }\n },\n 'reaction-map': {\n title: 'Reaction Mapping Tool',\n action: { tool: 'reactionmap' }\n },\n 'reaction-unmap': {\n title: 'Reaction Unmapping Tool',\n action: { tool: 'reactionunmap' }\n },\n 'rgroup-label': {\n shortcut: 'Mod+r',\n title: 'R-Group Label Tool',\n action: { tool: 'rgroupatom' }\n },\n 'rgroup-fragment': {\n shortcut: ['Mod+Shift+r', 'Mod+r'],\n title: 'R-Group Fragment Tool',\n action: { tool: 'rgroupfragment' }\n },\n 'rgroup-attpoints': {\n shortcut: 'Mod+r',\n title: 'Attachment Point Tool',\n action: { tool: 'apoint' }\n },\n 'shape-circle': {\n title: 'Shape Circle',\n action: { tool: 'simpleobject', opts: 'circle' }\n },\n 'shape-rectangle': {\n title: 'Shape Rectangle',\n action: { tool: 'simpleobject', opts: 'rectangle' }\n },\n 'shape-line': {\n title: 'Shape Line',\n action: { tool: 'simpleobject', opts: 'line' }\n }\n}\n\nconst bondCuts = {\n single: '1',\n double: '2',\n triple: '3',\n up: '1',\n down: '1',\n updown: '1',\n crossed: '2',\n any: '0',\n aromatic: '4'\n}\n\nconst typeSchema = bondSchema.properties.type\n\nexport default typeSchema.enum.reduce((res, type, i) => {\n res[`bond-${type}`] = {\n title: `${typeSchema.enumNames[i]} Bond`,\n shortcut: bondCuts[type],\n action: {\n tool: 'bond',\n opts: toBondType(type)\n }\n }\n return res\n}, toolActions)\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nexport const basic = ['H', 'C', 'N', 'O', 'S', 'P', 'F', 'Cl', 'Br', 'I']\n\nexport const atomCuts = {\n H: 'h',\n C: 'c',\n N: 'n',\n O: 'o',\n S: 's',\n P: 'p',\n F: 'f',\n Cl: 'Shift+c',\n Br: 'Shift+b',\n I: 'i',\n A: 'a'\n}\n\nexport default Object.keys(atomCuts).reduce((res, label) => {\n res[`atom-${label.toLowerCase()}`] = {\n title: `Atom ${label}`,\n shortcut: atomCuts[label],\n action: {\n tool: 'atom',\n opts: { label }\n }\n }\n return res\n}, {})\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport { findIndex, findLastIndex } from 'lodash/fp'\n\nexport const zoomList = [\n 0.2,\n 0.3,\n 0.4,\n 0.5,\n 0.6,\n 0.7,\n 0.8,\n 0.9,\n 1,\n 1.1,\n 1.2,\n 1.3,\n 1.4,\n 1.5,\n 1.7,\n 2,\n 2.5,\n 3,\n 3.5,\n 4\n]\n\nexport default {\n zoom: {\n selected: editor => editor.zoom()\n },\n 'zoom-out': {\n shortcut: ['-', '_', 'Shift+-'],\n title: 'Zoom Out',\n disabled: editor => editor.zoom() <= zoomList[0], // unsave\n action: editor => {\n const zoom = editor.zoom()\n const i = findIndex(z => z >= zoom, zoomList)\n editor.zoom(zoomList[zoomList[i] === zoom && i > 0 ? i - 1 : i])\n }\n },\n 'zoom-in': {\n shortcut: ['+', '=', 'Shift+='],\n title: 'Zoom In',\n disabled: editor => zoomList[zoomList.length - 1] <= editor.zoom(),\n action: editor => {\n const zoom = editor.zoom()\n const i = findLastIndex(z => z <= zoom, zoomList)\n editor.zoom(\n zoomList[zoomList[i] === zoom && i < zoomList.length - 1 ? i + 1 : i]\n )\n }\n }\n}\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport jsonschema from 'jsonschema'\n\nconst editor = {\n resetToSelect: {\n title: 'Reset to Select Tool',\n enum: [true, 'paste', false],\n enumNames: ['on', 'After Paste', 'off'],\n default: 'paste'\n },\n rotationStep: {\n title: 'Rotation Step, º',\n type: 'integer',\n minimum: 1,\n maximum: 90,\n default: 15\n }\n}\n\nconst render = {\n showValenceWarnings: {\n title: 'Show valence warnings',\n type: 'boolean',\n default: true\n },\n atomColoring: {\n title: 'Atom coloring',\n type: 'boolean',\n default: true\n },\n hideStereoFlags: {\n title: 'Do not show the Stereo flags',\n type: 'boolean',\n default: false\n },\n font: {\n title: 'Font',\n type: 'string',\n default: '30px Arial'\n },\n fontsz: {\n title: 'Font size',\n type: 'integer',\n default: 13,\n minimum: 1,\n maximum: 96\n },\n fontszsub: {\n title: 'Sub font size',\n type: 'integer',\n default: 13,\n minimum: 1,\n maximum: 96\n },\n // Atom\n carbonExplicitly: {\n title: 'Display carbon explicitly',\n type: 'boolean',\n default: false\n },\n showCharge: {\n title: 'Display charge',\n type: 'boolean',\n default: true\n },\n showValence: {\n title: 'Display valence',\n type: 'boolean',\n default: true\n },\n showHydrogenLabels: {\n title: 'Show hydrogen labels',\n enum: ['off', 'Hetero', 'Terminal', 'Terminal and Hetero', 'on'],\n default: 'on'\n },\n // Bonds\n aromaticCircle: {\n title: 'Aromatic Bonds as circle',\n type: 'boolean',\n default: true\n },\n doubleBondWidth: {\n title: 'Double bond width',\n type: 'integer',\n default: 6,\n minimum: 1,\n maximum: 96\n },\n bondThickness: {\n title: 'Bond thickness',\n type: 'integer',\n default: 2,\n minimum: 1,\n maximum: 96\n },\n stereoBondWidth: {\n title: 'Stereo (Wedge) bond width',\n type: 'integer',\n default: 6,\n minimum: 1,\n maximum: 96\n }\n}\n\nconst server = {\n 'smart-layout': {\n title: 'Smart-layout',\n type: 'boolean',\n default: true\n },\n 'ignore-stereochemistry-errors': {\n title: 'Ignore stereochemistry errors',\n type: 'boolean',\n default: true\n },\n 'mass-skip-error-on-pseudoatoms': {\n title: 'Ignore pseudoatoms at mass',\n type: 'boolean',\n default: false\n },\n 'gross-formula-add-rsites': {\n title: 'Add Rsites at mass calculation',\n type: 'boolean',\n default: true\n },\n 'gross-formula-add-isotopes': {\n title: 'Add Isotopes at mass calculation',\n type: 'boolean',\n default: true\n }\n}\n\nexport const SERVER_OPTIONS = Object.keys(server)\n\nconst debug = {\n showAtomIds: {\n title: 'Show atom Ids',\n type: 'boolean',\n default: false\n },\n showBondIds: {\n title: 'Show bonds Ids',\n type: 'boolean',\n default: false\n },\n showHalfBondIds: {\n title: 'Show half bonds Ids',\n type: 'boolean',\n default: false\n },\n showLoopIds: {\n title: 'Show loop Ids',\n type: 'boolean',\n default: false\n }\n}\n\nconst miew = {\n miewMode: {\n title: 'Display mode',\n enum: ['LN', 'BS', 'LC'],\n enumNames: ['Lines', 'Balls and Sticks', 'Licorice'],\n default: 'LN'\n },\n miewTheme: {\n title: 'Background color',\n enum: ['light', 'dark'],\n enumNames: ['Light', 'Dark'],\n default: 'light'\n },\n miewAtomLabel: {\n title: 'Label coloring',\n enum: ['no', 'bright', 'blackAndWhite', 'black'],\n enumNames: ['No', 'Bright', 'Black and White', 'Black'],\n default: 'bright'\n }\n}\n\nexport const MIEW_OPTIONS = Object.keys(miew)\n\nconst optionsSchema = {\n title: 'Settings',\n type: 'object',\n required: [],\n properties: {\n ...editor,\n ...render,\n ...server,\n ...debug,\n ...miew\n }\n}\n\nexport default optionsSchema\n\nexport function getDefaultOptions() {\n return Object.keys(optionsSchema.properties).reduce((res, prop) => {\n res[prop] = optionsSchema.properties[prop].default\n return res\n }, {})\n}\n\nexport function validation(settings) {\n if (typeof settings !== 'object' || settings === null) return null\n\n const v = new jsonschema.Validator()\n const { errors } = v.validate(settings, optionsSchema)\n const errProps = errors.map(err => err.property.split('.')[1])\n\n return Object.keys(settings).reduce((res, prop) => {\n if (optionsSchema.properties[prop] && errProps.indexOf(prop) === -1)\n res[prop] = settings[prop]\n return res\n }, {})\n}\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\n/* local storage */\nexport const storage = {\n warningMessage:\n 'Your changes will be lost after the tab closing. See Help (Note 2).',\n isAvailable() {\n try {\n return localStorage\n } catch (ex) {\n return false\n }\n },\n getItem(key) {\n let item = null\n try {\n item = JSON.parse(localStorage.getItem(key))\n } catch (ex) {\n console.info('LocalStorage:', ex.name)\n }\n return item\n },\n setItem(key, data) {\n let isSet = null\n try {\n localStorage.setItem(key, JSON.stringify(data))\n isSet = true\n } catch (ex) {\n console.info('LocalStorage:', ex.name)\n isSet = false\n }\n return isSet\n }\n}\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport { pick } from 'lodash/fp'\n\nimport {\n SERVER_OPTIONS,\n getDefaultOptions,\n validation\n} from '../../data/schema/options-schema'\nimport { storage } from '../../storage-ext'\n\nexport const initOptionsState = {\n app: {\n server: false,\n templates: false\n },\n analyse: {\n values: null,\n roundWeight: 3,\n roundMass: 3\n },\n check: {\n checkOptions: [\n 'valence',\n 'radicals',\n 'pseudoatoms',\n 'stereo',\n 'query',\n 'overlapping_atoms',\n 'overlapping_bonds',\n 'rgroups',\n 'chiral',\n '3d',\n 'chiral_flag'\n ]\n },\n recognize: {\n file: null,\n structStr: null,\n fragment: false,\n version: null\n },\n settings: Object.assign(\n getDefaultOptions(),\n validation(storage.getItem('ketcher-opts'))\n ),\n getServerSettings() {\n return pick(SERVER_OPTIONS, this.settings)\n }\n}\n\nexport function appUpdate(data) {\n return dispatch => {\n dispatch({ type: 'APP_OPTIONS', data })\n dispatch({ type: 'UPDATE' })\n }\n}\n\n/* SETTINGS */\nexport function saveSettings(newSettings) {\n storage.setItem('ketcher-opts', newSettings)\n return {\n type: 'SAVE_SETTINGS',\n data: newSettings\n }\n}\n\n/* ANALYZE */\nexport function changeRound(roundName, value) {\n return {\n type: 'CHANGE_ANALYSE',\n data: { [roundName]: value }\n }\n}\n\n/* RECOGNIZE */\nconst recognizeActions = [\n 'SET_RECOGNIZE_STRUCT',\n 'CHANGE_RECOGNIZE_FILE',\n 'CHANGE_IMAGO_VERSION',\n 'IS_FRAGMENT_RECOGNIZE'\n]\n\nexport function setStruct(str) {\n return {\n type: 'SET_RECOGNIZE_STRUCT',\n data: { structStr: str }\n }\n}\n\nexport function changeVersion(version) {\n return {\n type: 'CHANGE_IMAGO_VERSION',\n data: { version }\n }\n}\n\nexport function changeImage(file) {\n return {\n type: 'CHANGE_RECOGNIZE_FILE',\n data: {\n file,\n structStr: null\n }\n }\n}\n\nexport function shouldFragment(isFrag) {\n return {\n type: 'IS_FRAGMENT_RECOGNIZE',\n data: { fragment: isFrag }\n }\n}\n\n/* CHECK */\nexport function checkOpts(data) {\n return {\n type: 'SAVE_CHECK_OPTS',\n data\n }\n}\n\n/* REDUCER */\nfunction optionsReducer(state = {}, action) {\n const { type, data } = action\n\n if (type === 'APP_OPTIONS')\n return { ...state, app: { ...state.app, ...data } }\n\n if (type === 'SAVE_SETTINGS') return { ...state, settings: data }\n\n if (type === 'SAVE_CHECK_OPTS') return { ...state, check: data }\n\n if (type === 'CHANGE_ANALYSE')\n return { ...state, analyse: { ...state.analyse, ...data } }\n\n if (recognizeActions.includes(type))\n return { ...state, recognize: { ...state.recognize, ...data } }\n return state\n}\n\nexport default optionsReducer\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport { sdataSchema, getSdataDefault } from '../../data/schema/sdata-schema'\n\nexport const initSdata = () => {\n const context = getSdataDefault()\n const fieldName = getSdataDefault(context)\n const fieldValue = getSdataDefault(context, fieldName)\n const radiobuttons = 'Absolute'\n\n return {\n errors: {},\n valid: true,\n result: {\n context,\n fieldName,\n fieldValue,\n radiobuttons,\n type: 'DAT'\n }\n }\n}\n\nexport function sdataReducer(state, action) {\n if (action.data.result.init) {\n return correctErrors(\n {\n ...state,\n result: Object.assign({}, state.result, action.data.result)\n },\n action.data\n )\n }\n\n const actionContext = action.data.result.context\n const actionFieldName = action.data.result.fieldName\n\n let newstate = null\n\n if (actionContext !== state.result.context)\n newstate = onContextChange(state, action.data.result)\n else if (actionFieldName !== state.result.fieldName)\n newstate = onFieldNameChange(state, action.data.result)\n\n newstate = newstate || {\n ...state,\n result: Object.assign({}, state.result, action.data.result)\n }\n\n return correctErrors(newstate, action.data)\n}\n\nconst correctErrors = (state, payload) => {\n const { valid, errors } = payload\n const { fieldName, fieldValue } = state.result\n\n return {\n result: state.result,\n valid: valid && !!fieldName && !!fieldValue,\n errors\n }\n}\n\nconst onContextChange = (state, payload) => {\n const { context, fieldValue } = payload\n\n const fieldName = getSdataDefault(context)\n\n let fValue = fieldValue\n if (fValue === state.result.fieldValue)\n fValue = getSdataDefault(context, fieldName)\n\n return {\n result: {\n ...payload,\n context,\n fieldName,\n fieldValue: fValue\n }\n }\n}\n\nconst onFieldNameChange = (state, payload) => {\n const { fieldName } = payload\n\n const context = state.result.context\n\n let fieldValue = payload.fieldValue\n\n if (sdataSchema[context][fieldName])\n fieldValue = getSdataDefault(context, fieldName)\n\n if (\n fieldValue === state.result.fieldValue &&\n sdataSchema[context][state.result.fieldName]\n )\n fieldValue = ''\n\n return {\n result: {\n ...payload,\n fieldName,\n fieldValue\n }\n }\n}\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport { getDefaultOptions } from '../../data/schema/options-schema'\nimport { initSdata, sdataReducer } from './sdata'\n\nexport const formsState = {\n // TODO: create from schema.{smth}.defaultValue\n atomProps: {\n errors: {},\n valid: true,\n result: {\n label: '',\n charge: 0,\n explicitValence: -1,\n hCount: 0,\n invRet: 0,\n isotope: 0,\n radical: 0,\n ringBondCount: 0,\n substitutionCount: 0\n }\n },\n attachmentPoints: {\n errors: {},\n valid: true,\n result: {\n primary: false,\n secondary: false\n }\n },\n automap: {\n errors: {},\n valid: true,\n result: {\n mode: 'discard'\n }\n },\n bondProps: {\n errors: {},\n valid: true,\n result: {\n type: 'single',\n topology: 0,\n center: 0\n }\n },\n check: {\n errors: {},\n moleculeErrors: {}\n },\n labelEdit: {\n errors: {},\n valid: true,\n result: {\n label: ''\n }\n },\n rgroup: {\n errors: {},\n valid: true,\n result: {\n values: []\n }\n },\n rgroupLogic: {\n errors: {},\n valid: true,\n result: {\n ifthen: 0,\n range: '>0',\n resth: false\n }\n },\n save: {\n errors: {},\n valid: true,\n result: {\n filename: 'ketcher',\n format: 'mol'\n }\n },\n settings: {\n errors: {},\n valid: true,\n result: getDefaultOptions()\n },\n sgroup: {\n errors: {},\n valid: true,\n result: {\n type: 'GEN'\n }\n },\n sdata: initSdata()\n}\n\nexport function updateFormState(data) {\n return {\n type: 'UPDATE_FORM',\n data\n }\n}\n\nexport function checkErrors(errors) {\n return {\n type: 'UPDATE_FORM',\n data: { moleculeErrors: errors }\n }\n}\n\nexport function setDefaultSettings() {\n return {\n type: 'UPDATE_FORM',\n data: {\n result: getDefaultOptions(),\n valid: true,\n errors: {}\n }\n }\n}\n\nexport function formReducer(state, action, formName) {\n if (formName === 'sdata') return sdataReducer(state, action)\n\n return Object.assign({}, state, action.data)\n}\n","import * as structFormat from '../data/convert/structformat'\n\nexport function onAction(action) {\n if (action && action.dialog) {\n return {\n type: 'MODAL_OPEN',\n data: { name: action.dialog }\n }\n }\n if (action && action.thunk) return action.thunk\n\n return {\n type: 'ACTION',\n action\n }\n}\n\nexport function loadStruct(struct) {\n return (dispatch, getState) => {\n const editor = getState().editor\n editor.struct(struct)\n }\n}\n\nexport function load(structStr, options) {\n return (dispatch, getState) => {\n const state = getState()\n const editor = state.editor\n const server = state.server\n\n options = options || {}\n const parsed = structFormat.fromString(structStr, options, server)\n\n return parsed.then(\n struct => {\n if (options.rescale) struct.rescale() // TODO: move out parsing?\n\n if (struct.isBlank()) return\n if (options.fragment)\n dispatch(onAction({ tool: 'paste', opts: struct }))\n else editor.struct(struct)\n },\n err => {\n //TODO: add error handler call\n //legacy message: Can't parse molecule!\n }\n )\n }\n}\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport { omit, without } from 'lodash/fp'\nimport Pool from '../../../util/pool'\n\nimport molfile from '../../../chem/molfile'\n\nimport { setStruct, appUpdate } from '../options'\nimport { checkErrors } from '../modal/form'\nimport { load } from '../shared'\n\nexport function checkServer() {\n return (dispatch, getState) => {\n const server = getState().server\n\n server.then(\n res =>\n dispatch(\n appUpdate({\n indigoVersion: res?.indigoVersion,\n imagoVersions: res?.imagoVersions,\n server: res?.indigoVersion && res?.imagoVersions\n })\n ),\n err => console.info(err)\n // TODO: notification info\n )\n }\n}\n\nexport function recognize(file, version) {\n return (dispatch, getState) => {\n const rec = getState().server.recognize\n\n const process = rec(file, version).then(\n res => {\n dispatch(setStruct(res.struct))\n },\n () => {\n dispatch(setStruct(null))\n //TODO: add error handler call\n //legacy message: The picture isn't recognized\n }\n )\n dispatch(setStruct(process))\n }\n}\n\nfunction ketcherCheck(struct, checkParams) {\n const errors = {}\n\n if (checkParams.includes('chiral_flag')) {\n const isAbs = Array.from(struct.frags.values()).some(fr =>\n fr ? fr.enhancedStereoFlag === 'abs' : false\n )\n if (isAbs) errors['chiral_flag'] = 'Chiral flag is present on the canvas'\n }\n\n if (checkParams.includes('valence')) {\n let badVal = 0\n struct.atoms.forEach(atom => atom.badConn && badVal++)\n if (badVal > 0)\n errors['valence'] = `Structure contains ${badVal} atom${\n badVal !== 1 ? 's' : ''\n } with bad valence`\n }\n\n return errors\n}\n\nexport function check(optsTypes) {\n return (dispatch, getState) => {\n const { editor, server } = getState()\n const ketcherErrors = ketcherCheck(editor.struct(), optsTypes)\n\n const options = getState().options.getServerSettings()\n options.data = { types: without(['valence', 'chiral_flag'], optsTypes) }\n\n return serverCall(editor, server, 'check', options)\n .then(res => {\n res = Object.assign(res, ketcherErrors) // merge Indigo check with Ketcher check\n dispatch(checkErrors(res))\n })\n .catch(e => {\n //TODO: add error handler call\n //legacy message: Failed check\n })\n // TODO: notification\n }\n}\n\nexport function automap(res) {\n return serverTransform('automap', res)\n}\n\nexport function analyse() {\n return (dispatch, getState) => {\n const { editor, server } = getState()\n const options = getState().options.getServerSettings()\n options.data = {\n properties: [\n 'molecular-weight',\n 'most-abundant-mass',\n 'monoisotopic-mass',\n 'gross',\n 'mass-composition'\n ]\n }\n\n return serverCall(editor, server, 'calculate', options)\n .then(values =>\n dispatch({\n type: 'CHANGE_ANALYSE',\n data: { values }\n })\n )\n .catch(e => {\n //TODO: add error handler call\n throw e\n }) // eslint-disable-line no-undef\n // TODO: notification\n }\n}\n\nexport function serverTransform(method, data, struct) {\n return (dispatch, getState) => {\n const state = getState()\n const opts = state.options.getServerSettings()\n opts.data = data\n\n serverCall(state.editor, state.server, method, opts, struct)\n .then(res =>\n dispatch(\n load(res.struct, {\n rescale: method === 'layout',\n reactionRelayout: method === 'clean'\n })\n )\n )\n .catch(e => {\n //TODO: add error handler call\n })\n // TODO: notification\n }\n}\n\nexport function serverCall(editor, server, method, options, struct) {\n const selection = editor.selection()\n let selectedAtoms = []\n\n if (selection)\n selectedAtoms = selection.atoms\n ? selection.atoms\n : editor.explicitSelected().atoms\n\n if (!struct) {\n const aidMap = new Map()\n struct = editor.struct().clone(null, null, false, aidMap)\n\n const reindexMap = getReindexMap(struct.getComponents())\n\n selectedAtoms = selectedAtoms.map(aid => reindexMap.get(aidMap.get(aid)))\n }\n\n return server.then(() =>\n server[method](\n Object.assign(\n {\n struct: molfile.stringify(struct, { ignoreErrors: true })\n },\n selectedAtoms && selectedAtoms.length > 0\n ? {\n selected: selectedAtoms\n }\n : null,\n options.data\n ),\n omit('data', options)\n )\n )\n}\n\nfunction getReindexMap(components) {\n return components.reactants\n .concat(components.products)\n .reduce((acc, item) => {\n Array.from(item).forEach(aid => {\n acc.add(aid)\n })\n\n return acc\n }, new Pool())\n}\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport { serverTransform } from '../state/server'\n\nexport default {\n layout: {\n shortcut: 'Mod+l',\n title: 'Layout',\n action: {\n thunk: serverTransform('layout')\n },\n disabled: (editor, server, options) => !options.app.server\n },\n clean: {\n shortcut: 'Mod+Shift+l',\n title: 'Clean Up',\n action: {\n thunk: serverTransform('clean')\n },\n disabled: (editor, server, options) => !options.app.server\n },\n arom: {\n title: 'Aromatize',\n action: {\n thunk: serverTransform('aromatize')\n },\n disabled: (editor, server, options) => !options.app.server\n },\n dearom: {\n title: 'Dearomatize',\n action: {\n thunk: serverTransform('dearomatize')\n },\n disabled: (editor, server, options) => !options.app.server\n },\n cip: {\n shortcut: 'Mod+p',\n title: 'Calculate CIP',\n action: {\n thunk: serverTransform('calculateCip')\n },\n disabled: (editor, server, options) => !options.app.server\n },\n check: {\n title: 'Check Structure',\n action: { dialog: 'check' },\n disabled: (editor, server, options) => !options.app.server\n },\n analyse: {\n title: 'Calculated Values',\n action: { dialog: 'analyse' },\n disabled: (editor, server, options) => !options.app.server\n },\n recognize: {\n title: 'Recognize Molecule',\n action: { dialog: 'recognize' },\n disabled: (editor, server, options) => !options.app.server\n },\n miew: {\n title: '3D Viewer',\n action: { dialog: 'miew' },\n disabled: () => !window.Miew\n }\n}\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport molfile from '../../chem/molfile'\n\nexport default {\n // original: for dev purposes\n 'force-update': {\n shortcut: 'Ctrl+Shift+r',\n action: editor => {\n editor.update(true)\n }\n },\n 'qs-serialize': {\n shortcut: 'Alt+Shift+r',\n action: editor => {\n const molStr = molfile.stringify(editor.struct())\n const molQs = 'mol=' + encodeURIComponent(molStr).replace(/%20/g, '+')\n const qs = document.location.search\n document.location.search = !qs\n ? '?' + molQs // eslint-disable-line\n : qs.search('mol=') === -1\n ? qs + '&' + molQs\n : qs.replace(/mol=[^&$]*/, molQs)\n }\n }\n}\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport molfile from '../../chem/molfile'\n\nexport default [\n 'Benzene\\n' +\n ' Ketcher 11161218352D 1 1.00000 0.00000 0\\n' +\n '\\n' +\n ' 6 6 0 0 0 999 V2000\\n' +\n ' 0.8660 2.0000 0.0000 C 0 0 0 0 0 0 0 0 0\\n' +\n ' 1.7320 1.5000 0.0000 C 0 0 0 0 0 0 0 0 0\\n' +\n ' 1.7320 0.5000 0.0000 C 0 0 0 0 0 0 0 0 0\\n' +\n ' 0.8660 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0\\n' +\n ' 0.0000 0.5000 0.0000 C 0 0 0 0 0 0 0 0 0\\n' +\n ' 0.0000 1.5000 0.0000 C 0 0 0 0 0 0 0 0 0\\n' +\n ' 1 2 1 0 0 0\\n' +\n ' 2 3 2 0 0 0\\n' +\n ' 3 4 1 0 0 0\\n' +\n ' 4 5 2 0 0 0\\n' +\n ' 5 6 1 0 0 0\\n' +\n ' 6 1 2 0 0 0\\n' +\n 'M END\\n',\n 'Cyclopentadiene\\n' +\n ' Ketcher 11161218352D 1 1.00000 0.00000 0\\n' +\n '\\n' +\n ' 5 5 0 0 0 999 V2000\\n' +\n ' 0.0000 1.4257 0.0000 C 0 0 0 0 0 0 0 0 0\\n' +\n ' 0.8090 0.8379 0.0000 C 0 0 0 0 0 0 0 0 0\\n' +\n ' 0.5000 -0.1132 0.0000 C 0 0 0 0 0 0 0 0 0\\n' +\n ' -0.5000 -0.1132 0.0000 C 0 0 0 0 0 0 0 0 0\\n' +\n ' -0.8090 0.8379 0.0000 C 0 0 0 0 0 0 0 0 0\\n' +\n ' 1 2 1 0 0 0\\n' +\n ' 2 3 2 0 0 0\\n' +\n ' 3 4 1 0 0 0\\n' +\n ' 4 5 2 0 0 0\\n' +\n ' 5 1 1 0 0 0\\n' +\n 'M END\\n',\n\n 'Cyclohexane\\n' +\n ' Ketcher 11161218352D 1 1.00000 0.00000 0\\n' +\n '\\n' +\n ' 6 6 0 0 0 999 V2000\\n' +\n ' 0.8660 2.0000 0.0000 C 0 0 0 0 0 0 0 0 0\\n' +\n ' 1.7320 1.5000 0.0000 C 0 0 0 0 0 0 0 0 0\\n' +\n ' 1.7320 0.5000 0.0000 C 0 0 0 0 0 0 0 0 0\\n' +\n ' 0.8660 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0\\n' +\n ' 0.0000 0.5000 0.0000 C 0 0 0 0 0 0 0 0 0\\n' +\n ' 0.0000 1.5000 0.0000 C 0 0 0 0 0 0 0 0 0\\n' +\n ' 1 2 1 0 0 0\\n' +\n ' 2 3 1 0 0 0\\n' +\n ' 3 4 1 0 0 0\\n' +\n ' 4 5 1 0 0 0\\n' +\n ' 5 6 1 0 0 0\\n' +\n ' 6 1 1 0 0 0\\n' +\n 'M END\\n',\n\n 'Cyclopentane\\n' +\n ' Ketcher 11161218352D 1 1.00000 0.00000 0\\n' +\n '\\n' +\n ' 5 5 0 0 0 999 V2000\\n' +\n ' 0.8090 1.5389 0.0000 C 0 0 0 0 0 0 0 0 0\\n' +\n ' 1.6180 0.9511 0.0000 C 0 0 0 0 0 0 0 0 0\\n' +\n ' 1.3090 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0\\n' +\n ' 0.3090 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0\\n' +\n ' 0.0000 0.9511 0.0000 C 0 0 0 0 0 0 0 0 0\\n' +\n ' 1 2 1 0 0 0\\n' +\n ' 2 3 1 0 0 0\\n' +\n ' 3 4 1 0 0 0\\n' +\n ' 4 5 1 0 0 0\\n' +\n ' 5 1 1 0 0 0\\n' +\n 'M END\\n',\n\n 'Cyclopropane\\n' +\n ' Ketcher 11161218352D 1 1.00000 0.00000 0\\n' +\n '\\n' +\n ' 3 3 0 0 0 999 V2000\\n' +\n ' -3.2250 -0.2750 0.0000 C 0 0 0 0 0 0 0 0 0\\n' +\n ' -2.2250 -0.2750 0.0000 C 0 0 0 0 0 0 0 0 0\\n' +\n ' -2.7250 0.5910 0.0000 C 0 0 0 0 0 0 0 0 0\\n' +\n ' 1 2 1 0 0 0\\n' +\n ' 2 3 1 0 0 0\\n' +\n ' 1 3 1 0 0 0\\n' +\n 'M END\\n',\n\n 'Cyclobutane\\n' +\n ' Ketcher 11161218352D 1 1.00000 0.00000 0\\n' +\n '\\n' +\n ' 4 4 0 0 0 999 V2000\\n' +\n ' -3.8250 1.5500 0.0000 C 0 0 0 0 0 0 0 0 0\\n' +\n ' -3.8250 0.5500 0.0000 C 0 0 0 0 0 0 0 0 0\\n' +\n ' -2.8250 1.5500 0.0000 C 0 0 0 0 0 0 0 0 0\\n' +\n ' -2.8250 0.5500 0.0000 C 0 0 0 0 0 0 0 0 0\\n' +\n ' 1 2 1 0 0 0\\n' +\n ' 1 3 1 0 0 0\\n' +\n ' 3 4 1 0 0 0\\n' +\n ' 4 2 1 0 0 0\\n' +\n 'M END\\n',\n\n 'Cycloheptane\\n' +\n ' Ketcher 11161218352D 1 1.00000 0.00000 0\\n' +\n '\\n' +\n ' 7 7 0 0 0 999 V2000\\n' +\n ' 0.0000 1.6293 0.0000 C 0 0 0 0 0 0 0 0 0\\n' +\n ' 0.7835 2.2465 0.0000 C 0 0 0 0 0 0 0 0 0\\n' +\n ' 1.7559 2.0242 0.0000 C 0 0 0 0 0 0 0 0 0\\n' +\n ' 2.1897 1.1289 0.0000 C 0 0 0 0 0 0 0 0 0\\n' +\n ' 0.0000 0.6228 0.0000 C 0 0 0 0 0 0 0 0 0\\n' +\n ' 1.7566 0.2224 0.0000 C 0 0 0 0 0 0 0 0 0\\n' +\n ' 0.7835 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0\\n' +\n ' 6 7 1 0 0 0\\n' +\n ' 5 7 1 0 0 0\\n' +\n ' 1 5 1 0 0 0\\n' +\n ' 4 6 1 0 0 0\\n' +\n ' 3 4 1 0 0 0\\n' +\n ' 2 3 1 0 0 0\\n' +\n ' 1 2 1 0 0 0\\n' +\n 'M END\\n',\n\n 'Cyclooctane\\n' +\n ' Ketcher 11161218352D 1 1.00000 0.00000 0\\n' +\n '\\n' +\n ' 8 8 0 0 0 999 V2000\\n' +\n ' 0.0000 0.7053 0.0000 C 0 0 0 0 0 0 0 0 0\\n' +\n ' 0.0000 1.7078 0.0000 C 0 0 0 0 0 0 0 0 0\\n' +\n ' 0.7053 2.4131 0.0000 C 0 0 0 0 0 0 0 0 0\\n' +\n ' 0.7056 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0\\n' +\n ' 1.7079 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0\\n' +\n ' 2.4133 0.7053 0.0000 C 0 0 0 0 0 0 0 0 0\\n' +\n ' 2.4133 1.7078 0.0000 C 0 0 0 0 0 0 0 0 0\\n' +\n ' 1.7079 2.4131 0.0000 C 0 0 0 0 0 0 0 0 0\\n' +\n ' 8 3 1 0 0 0\\n' +\n ' 7 8 1 0 0 0\\n' +\n ' 6 7 1 0 0 0\\n' +\n ' 5 6 1 0 0 0\\n' +\n ' 4 5 1 0 0 0\\n' +\n ' 1 4 1 0 0 0\\n' +\n ' 2 3 1 0 0 0\\n' +\n ' 1 2 1 0 0 0\\n' +\n 'M END\\n'\n].map(structStr => molfile.parse(structStr))\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport templates from '../data/templates'\n\nconst templateLib = {\n 'template-lib': {\n shortcut: 'Shift+t',\n title: 'Custom Templates',\n action: { dialog: 'templates' },\n disabled: (editor, server, options) => !options.app.templates\n }\n}\n\nexport default templates.reduce((res, struct, i) => {\n res[`template-${i}`] = {\n title: `${struct.name}`,\n shortcut: 't',\n action: {\n tool: 'template',\n opts: { struct }\n }\n }\n return res\n}, templateLib)\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\n/* eslint-disable no-shadow */\n\nimport tools from './tools'\nimport atoms from './atoms'\nimport zoom from './zoom'\nimport server from './server'\nimport debug from './debug'\nimport templates from './templates'\nimport { exec } from '../component/cliparea'\n\nexport default {\n new: {\n shortcut: 'Mod+Delete',\n title: 'Clear Canvas',\n action: {\n thunk: (dispatch, getState) => {\n const editor = getState().editor\n if (!editor.struct().isBlank()) editor.struct(null)\n dispatch({ type: 'ACTION', action: tools['select-lasso'].action })\n }\n }\n },\n open: {\n shortcut: 'Mod+o',\n title: 'Open…',\n action: { dialog: 'open' }\n },\n save: {\n shortcut: 'Mod+s',\n title: 'Save As…',\n action: { dialog: 'save' }\n },\n undo: {\n shortcut: 'Mod+z',\n title: 'Undo',\n action: editor => {\n editor.undo()\n },\n disabled: editor => editor.historySize().undo === 0\n },\n redo: {\n shortcut: ['Mod+Shift+z', 'Mod+y'],\n title: 'Redo',\n action: editor => {\n editor.redo()\n },\n disabled: editor => editor.historySize().redo === 0\n },\n cut: {\n shortcut: 'Mod+x',\n title: 'Cut',\n action: () => {\n exec('cut') || dontClipMessage('Cut') // eslint-disable-line no-unused-expressions\n },\n disabled: editor => !hasSelection(editor)\n },\n copy: {\n shortcut: 'Mod+c',\n title: 'Copy',\n action: () => {\n exec('copy') || dontClipMessage('Copy') // eslint-disable-line no-unused-expressions\n },\n disabled: editor => !hasSelection(editor)\n },\n paste: {\n shortcut: 'Mod+v',\n title: 'Paste',\n action: () => {\n exec('paste') || dontClipMessage('Paste') // eslint-disable-line no-unused-expressions\n },\n selected: ({ actions }) =>\n actions && // TMP\n actions.active &&\n actions.active.tool === 'paste'\n },\n settings: {\n title: 'Settings',\n action: { dialog: 'settings' }\n },\n help: {\n shortcut: ['?', '&', 'Shift+/'],\n title: 'Help',\n action: { dialog: 'help' }\n },\n about: {\n title: 'About',\n action: { dialog: 'about' }\n },\n 'reaction-automap': {\n title: 'Reaction Auto-Mapping Tool',\n action: { dialog: 'automap' },\n disabled: (editor, server, options) =>\n !options.app.server || !editor.struct().hasRxnArrow()\n },\n 'period-table': {\n title: 'Periodic Table',\n action: { dialog: 'period-table' }\n },\n 'select-all': {\n title: 'Select All',\n shortcut: 'Mod+a',\n action: {\n thunk: (dispatch, getState) => {\n getState().editor.selection('all')\n const selectionTool = getState().toolbar.visibleTools.select\n dispatch({ type: 'ACTION', action: tools[selectionTool].action })\n }\n }\n },\n 'deselect-all': {\n title: 'Deselect All',\n shortcut: 'Mod+Shift+a',\n action: editor => {\n editor.selection(null)\n }\n },\n 'select-descriptors': {\n title: 'Select descriptors',\n shortcut: 'Mod+d',\n action: {\n thunk: (dispatch, getState) => {\n const selectionTool = getState().toolbar.visibleTools.select\n const editor = getState().editor\n editor.alignDescriptors()\n editor.selection('descriptors')\n dispatch({ type: 'ACTION', action: tools[selectionTool].action })\n }\n }\n },\n ...server,\n ...debug,\n ...tools,\n ...atoms,\n ...zoom,\n ...templates\n}\n\nfunction hasSelection(editor) {\n const selection = editor.selection()\n return (\n selection && // if not only sgroupData selected\n (Object.keys(selection).length > 1 || !selection.sgroupData)\n )\n}\n\nfunction dontClipMessage(title) {\n //TODO: add error handler call\n alert(\n 'This action is unavailable via menu.\\n' + // eslint-disable-line no-undef\n 'Instead, use shortcut to ' +\n title +\n '.'\n )\n}\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport { formReducer, formsState } from './form'\n\nexport function openDialog(dispatch, dialogName, props) {\n return new Promise((resolve, reject) => {\n dispatch({\n type: 'MODAL_OPEN',\n data: {\n name: dialogName,\n prop: {\n ...props,\n onResult: resolve,\n onCancel: reject\n }\n }\n })\n })\n}\n\nfunction modalReducer(state = null, action) {\n const { type, data } = action\n\n if (type === 'UPDATE_FORM') {\n const formState = formReducer(state.form, action, state.name)\n return { ...state, form: formState }\n }\n\n switch (type) {\n case 'MODAL_CLOSE':\n return null\n case 'MODAL_OPEN':\n return {\n name: data.name,\n form: formsState[data.name] || null,\n prop: data.prop || null\n }\n default:\n return state\n }\n}\n\nexport default modalReducer\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport { isEqual, debounce } from 'lodash/fp'\n\nimport molfile from '../../chem/molfile'\nimport graph from '../../format/chemGraph'\nimport keyNorm from '../data/convert/keynorm'\nimport actions from '../action'\n\nimport * as clipArea from '../component/cliparea'\nimport * as structFormat from '../data/convert/structformat'\nimport { openDialog } from './modal'\nimport { onAction, load } from './shared'\n\nexport function initKeydownListener(element) {\n return function (dispatch, getState) {\n const hotKeys = initHotKeys()\n element.addEventListener('keydown', event =>\n keyHandle(dispatch, getState(), hotKeys, event)\n )\n }\n}\n\n/* HotKeys */\nfunction keyHandle(dispatch, state, hotKeys, event) {\n if (state.modal) return\n\n const editor = state.editor\n const actionState = state.actionState\n const actionTool = actionState.activeTool\n\n const key = keyNorm(event)\n const atomsSelected = editor.selection() && editor.selection().atoms\n\n let group = null\n\n if (key && key.length === 1 && atomsSelected && key.match(/\\w/)) {\n console.assert(atomsSelected.length > 0)\n openDialog(dispatch, 'labelEdit', { letter: key })\n .then(res => {\n dispatch(onAction({ tool: 'atom', opts: res }))\n })\n .catch(() => null)\n event.preventDefault()\n } else if ((group = keyNorm.lookup(hotKeys, event)) !== undefined) {\n let index = checkGroupOnTool(group, actionTool) // index currentTool in group || -1\n index = (index + 1) % group.length\n\n const actName = group[index]\n if (actionState[actName] && actionState[actName].disabled === true) {\n event.preventDefault()\n return\n }\n if (clipArea.actions.indexOf(actName) === -1) {\n const newAction = actions[actName].action\n dispatch(onAction(newAction))\n event.preventDefault()\n } else if (window.clipboardData) {\n // IE support\n clipArea.exec(event)\n }\n }\n}\n\nfunction setHotKey(key, actName, hotKeys) {\n if (Array.isArray(hotKeys[key])) hotKeys[key].push(actName)\n else hotKeys[key] = [actName]\n}\n\nfunction initHotKeys() {\n const hotKeys = {}\n let act\n\n Object.keys(actions).forEach(actName => {\n act = actions[actName]\n if (!act.shortcut) return\n\n if (Array.isArray(act.shortcut)) {\n act.shortcut.forEach(key => {\n setHotKey(key, actName, hotKeys)\n })\n } else {\n setHotKey(act.shortcut, actName, hotKeys)\n }\n })\n\n return keyNorm(hotKeys)\n}\n\nfunction checkGroupOnTool(group, actionTool) {\n let index = group.indexOf(actionTool.tool)\n\n group.forEach((actName, i) => {\n if (isEqual(actions[actName].action, actionTool)) index = i\n })\n\n return index\n}\n\nconst rxnTextPlain = /\\$RXN\\n+\\s+0\\s+0\\s+0\\n*/\n\n/* ClipArea */\nexport function initClipboard(dispatch, getState) {\n const formats = Object.keys(structFormat.map).map(\n fmt => structFormat.map[fmt].mime\n )\n\n const debAction = debounce(0, action => dispatch(onAction(action)))\n const loadStruct = debounce(0, (structStr, opts) =>\n dispatch(load(structStr, opts))\n )\n\n return {\n formats,\n focused() {\n const state = global.currentState\n return !state.modal\n },\n onCut() {\n const state = global.currentState\n const editor = state.editor\n const data = clipData(editor)\n if (data) debAction({ tool: 'eraser', opts: 1 })\n else editor.selection(null)\n return data\n },\n onCopy() {\n const state = global.currentState\n const editor = state.editor\n const data = clipData(editor)\n editor.selection(null)\n return data\n },\n onPaste(data) {\n const structStr =\n data['application/json'] ||\n data['chemical/x-mdl-molfile'] ||\n data['chemical/x-mdl-rxnfile'] ||\n data['text/plain']\n const state = getState()\n\n const struct = state.editor.render.ctab.molecule\n\n if (\n structStr &&\n (!struct.hasRxnArrow() || !rxnTextPlain.test(data['text/plain']))\n )\n loadStruct(structStr, { fragment: true })\n }\n }\n}\n\nfunction clipData(editor) {\n const res = {}\n const struct = editor.structSelected()\n\n if (struct.isBlank()) return null\n\n try {\n const graphData = graph.toGraph(struct)\n res['application/json'] = JSON.stringify(graphData)\n\n const type = struct.isReaction\n ? 'chemical/x-mdl-molfile'\n : 'chemical/x-mdl-rxnfile'\n const data = molfile.stringify(struct)\n res['text/plain'] = data\n res[type] = data\n\n // res['chemical/x-daylight-smiles'] = smiles.stringify(struct);\n return res\n } catch (ex) {\n //TODO: add error handler call\n }\n\n return null\n}\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport molfile from './molfile'\n\nfunction parse(str, options) {\n var regexp = /^[^]+?\\$\\$\\$\\$$/gm\n var m, chunk\n var result = []\n while ((m = regexp.exec(str)) !== null) {\n chunk = m[0].replace(/\\r/g, '') // TODO: normalize newline?\n chunk = chunk.trim()\n var end = chunk.indexOf('M END')\n if (end !== -1) {\n var item = {}\n var propChunks = chunk\n .substr(end + 7)\n .trim()\n .split(/^$\\n?/m)\n\n item.struct = molfile.parse(chunk.substring(0, end + 6), options)\n item.props = propChunks.reduce((props, pc) => {\n var m = pc.match(/^> [ \\d]*<(\\S+)>/)\n if (m) {\n var field = m[1]\n var value = pc.split('\\n')[1].trim()\n props[field] = isFinite(value) ? +value : value // eslint-disable-line\n }\n return props\n }, {})\n\n result.push(item)\n }\n }\n return result\n}\n\nfunction stringify(items, options) {\n return items.reduce((res, item) => {\n res += molfile.stringify(item.struct, options)\n\n Object.keys(item.props).forEach(prop => {\n res += '> <' + prop + '>\\n'\n res += item.props[prop] + '\\n\\n'\n })\n\n return res + '$$$$'\n }, '')\n}\n\nexport default {\n stringify,\n parse\n}\n","import { storage } from '../../storage-ext'\nimport sdf from '../../../chem/sdf'\nimport molfile from '../../../chem/molfile'\nimport { appUpdate } from '../options'\n\nexport function initLib(lib) {\n return {\n type: 'TMPL_INIT',\n data: { lib }\n }\n}\n\nexport default function initTmplLib(dispatch, baseUrl, cacheEl) {\n prefetchStatic(`${baseUrl}/templates/library.sdf`)\n .then(text => {\n const tmpls = sdf.parse(text)\n const prefetch = prefetchRender(tmpls, baseUrl + '/templates/', cacheEl)\n\n return prefetch.then(cachedFiles =>\n tmpls.map(tmpl => {\n const pr = prefetchSplit(tmpl)\n if (pr.file)\n tmpl.props.prerender =\n cachedFiles.indexOf(pr.file) !== -1 ? `#${pr.id}` : ''\n\n return tmpl\n })\n )\n })\n .then(res => {\n const lib = res.concat(userTmpls())\n dispatch(initLib(lib))\n dispatch(appUpdate({ templates: true }))\n })\n}\n\nfunction userTmpls() {\n const userLib = storage.getItem('ketcher-tmpls')\n if (!Array.isArray(userLib) || userLib.length === 0) return []\n\n return userLib\n .map(tmpl => {\n try {\n if (tmpl.props === '') tmpl.props = {}\n tmpl.props.group = 'User Templates'\n\n return {\n struct: molfile.parse(tmpl.struct),\n props: tmpl.props\n }\n } catch (ex) {\n return null\n }\n })\n .filter(tmpl => tmpl !== null)\n}\n\nfunction prefetchStatic(url) {\n return fetch(url, { credentials: 'same-origin' }).then(resp => {\n if (resp.ok) return resp.text()\n throw Error('Could not fetch ' + url)\n })\n}\n\nfunction prefetchSplit(tmpl) {\n const pr = tmpl.props.prerender\n const res = pr && pr.split('#', 2)\n\n return {\n file: pr && res[0],\n id: pr && res[1]\n }\n}\n\nfunction prefetchRender(tmpls, baseUrl, cacheEl) {\n const files = tmpls.reduce((res, tmpl) => {\n const file = prefetchSplit(tmpl).file\n\n if (file && res.indexOf(file) === -1) res.push(file)\n\n return res\n }, [])\n\n const fetch = Promise.all(\n files.map(fn => prefetchStatic(baseUrl + fn).catch(() => null))\n )\n\n return fetch.then(svgs => {\n svgs.forEach(svgContent => {\n if (svgContent) cacheEl.innerHTML += svgContent\n })\n\n return files.filter((file, i) => !!svgs[i])\n })\n}\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport { omit } from 'lodash/fp'\nimport molfile from '../../../chem/molfile'\nimport { storage } from '../../storage-ext'\n\nimport { openDialog } from '../modal'\nimport initTmplLib, { initLib } from './init-lib'\n\nexport { initTmplLib }\n\n/* TEMPLATES */\nexport function selectTmpl(tmpl) {\n return {\n type: 'TMPL_SELECT',\n data: { selected: tmpl }\n }\n}\n\nexport function changeGroup(group) {\n return {\n type: 'TMPL_CHANGE_GROUP',\n data: { group, selected: null }\n }\n}\n\nexport function changeFilter(filter) {\n return {\n type: 'TMPL_CHANGE_FILTER',\n data: { filter: filter.trim(), selected: null } // TODO: change this\n }\n}\n\n/* TEMPLATE-ATTACH-EDIT */\nexport function initAttach(name, attach) {\n return {\n type: 'INIT_ATTACH',\n data: {\n name,\n atomid: attach.atomid,\n bondid: attach.bondid\n }\n }\n}\n\nexport function setAttachPoints(attach) {\n return {\n type: 'SET_ATTACH_POINTS',\n data: {\n atomid: attach.atomid,\n bondid: attach.bondid\n }\n }\n}\n\nexport function setTmplName(name) {\n return {\n type: 'SET_TMPL_NAME',\n data: { name }\n }\n}\n\nexport function editTmpl(tmpl) {\n return (dispatch, getState) => {\n openDialog(dispatch, 'attach', { tmpl })\n .then(\n ({ name, attach }) => {\n tmpl.struct.name = name\n tmpl.props = Object.assign({}, tmpl.props, attach)\n\n if (tmpl.props.group === 'User Templates')\n updateLocalStore(getState().templates.lib)\n },\n () => null\n )\n .then(() => openDialog(dispatch, 'templates').catch(() => null))\n }\n}\n\n/* SAVE */\nexport function saveUserTmpl(struct) {\n // TODO: structStr can be not in mol format => structformat.toString ...\n const tmpl = { struct: struct.clone(), props: {} }\n\n return (dispatch, getState) => {\n openDialog(dispatch, 'attach', { tmpl })\n .then(({ name, attach }) => {\n tmpl.struct.name = name\n tmpl.props = { ...attach, group: 'User Templates' }\n\n const lib = getState().templates.lib.concat(tmpl)\n dispatch(initLib(lib))\n updateLocalStore(lib)\n })\n .catch(() => null)\n }\n}\n\nfunction updateLocalStore(lib) {\n const userLib = lib\n .filter(item => item.props.group === 'User Templates')\n .map(item => ({\n struct: molfile.stringify(item.struct),\n props: Object.assign({}, omit(['group'], item.props))\n }))\n\n storage.setItem('ketcher-tmpls', userLib)\n}\n\n/* REDUCER */\nexport const initTmplsState = {\n lib: [],\n selected: null,\n filter: '',\n group: null,\n attach: {}\n}\n\nconst tmplActions = [\n 'TMPL_INIT',\n 'TMPL_SELECT',\n 'TMPL_CHANGE_GROUP',\n 'TMPL_CHANGE_FILTER'\n]\n\nconst attachActions = ['INIT_ATTACH', 'SET_ATTACH_POINTS', 'SET_TMPL_NAME']\n\nfunction templatesReducer(state = initTmplsState, action) {\n if (tmplActions.includes(action.type))\n return Object.assign({}, state, action.data)\n\n if (attachActions.includes(action.type)) {\n const attach = Object.assign({}, state.attach, action.data)\n return { ...state, attach }\n }\n\n return state\n}\n\nexport default templatesReducer\n","import React from 'react'\nimport SettingsContext from './../contexts/settingsContext'\n\nexport default function useSettingsContext() {\n return React.useContext(SettingsContext)\n}\n","import React from 'react'\nimport FormContext from './../contexts/formContext'\n\nexport default function useFormContext() {\n return React.useContext(FormContext)\n}\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport React, { useEffect, useRef } from 'react'\nimport { connect } from 'react-redux'\n\nimport ClipArea from '../component/cliparea'\n\nimport { initClipboard } from '../state/hotkeys'\nimport { initTmplLib } from '../state/templates'\nimport { useSettingsContext } from './../../../hooks'\n\nfunction AppHiddenView({ onInitTmpls }) {\n const rootRef = useRef(null)\n const { staticResourcesUrl } = useSettingsContext()\n\n useEffect(() => {\n onInitTmpls(rootRef.current, staticResourcesUrl)\n }, [])\n\n return
\n}\n\nexport const AppHidden = connect(null, dispatch => ({\n onInitTmpls: cacheEl => initTmplLib(dispatch, process.env.PUBLIC_URL, cacheEl)\n}))(AppHiddenView)\n\nexport const AppCliparea = connect(null, dispatch => dispatch(initClipboard))(\n ClipArea\n)\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport { debounce } from 'lodash/fp'\n\nimport element from '../../../chem/element'\nimport {\n fromBond,\n toBond,\n fromStereoLabel,\n toStereoLabel,\n fromSgroup,\n toSgroup,\n fromElement,\n toElement\n} from '../../data/convert/structconv'\nimport acts from '../../action'\n\nimport { openDialog } from '../modal'\nimport { serverCall } from '../server'\n\nexport default function initEditor(dispatch, getState) {\n const updateAction = debounce(100, () => dispatch({ type: 'UPDATE' }))\n const sleep = time => new Promise(resolve => setTimeout(resolve, time))\n\n function resetToSelect(dispatch) {\n // eslint-disable-line no-shadow\n const state = global.currentState\n const activeTool = state.actionState.activeTool.tool\n if (activeTool === 'select') return\n const selectMode = state.toolbar.visibleTools.select\n const resetOption = state.options.settings.resetToSelect\n if (resetOption === true || resetOption === activeTool)\n // example: 'paste'\n dispatch({ type: 'ACTION', action: acts[selectMode].action })\n else updateAction()\n }\n\n return {\n onInit: editor => {\n dispatch({ type: 'INIT', editor })\n },\n onChange: action => {\n if (action === undefined) sleep(0).then(() => dispatch(resetToSelect))\n // new tool in reducer\n else dispatch(resetToSelect)\n },\n onSelectionChange: () => {\n updateAction()\n },\n onElementEdit: selem => {\n const elem = fromElement(selem)\n let dlg = null\n if (element.map[elem.label]) {\n dlg = openDialog(dispatch, 'atomProps', elem)\n } else if (Object.keys(elem).length === 1 && 'ap' in elem) {\n dlg = openDialog(dispatch, 'attachmentPoints', elem.ap).then(res => ({\n ap: res\n }))\n } else if (elem.type === 'list' || elem.type === 'not-list') {\n dlg = openDialog(dispatch, 'period-table', elem)\n } else if (elem.type === 'rlabel') {\n const rgroups = getState().editor.struct().rgroups\n const params = {\n type: 'atom',\n values: elem.values,\n disabledIds: Array.from(rgroups.entries()).reduce(\n (acc, [rgid, rg]) => {\n if (rg.frags.has(elem.fragId)) acc.push(rgid)\n\n return acc\n },\n []\n )\n }\n dlg = openDialog(dispatch, 'rgroup', params).then(res => ({\n values: res.values,\n type: 'rlabel'\n }))\n } else {\n dlg = openDialog(dispatch, 'period-table', elem)\n }\n\n return dlg.then(toElement)\n },\n\n // TODO: correct\n onEnhancedStereoEdit: ({ type, ...init }) =>\n sleep(0).then(() => {\n if (type === 'atoms') init = fromStereoLabel(init.stereoLabel)\n return openDialog(dispatch, 'enhancedStereo', {\n type,\n init\n }).then(res => (type === 'atoms' ? toStereoLabel(res) : res))\n }),\n\n onQuickEdit: atom => openDialog(dispatch, 'labelEdit', atom),\n onBondEdit: bond =>\n openDialog(dispatch, 'bondProps', fromBond(bond)).then(toBond),\n onRgroupEdit: rgroup => {\n const struct = getState().editor.struct()\n\n if (Object.keys(rgroup).length > 2) {\n const rgroupLabels = Array.from(struct.rgroups.keys())\n if (!rgroup.range) rgroup.range = '>0'\n\n return openDialog(\n dispatch,\n 'rgroupLogic',\n Object.assign({ rgroupLabels }, rgroup)\n )\n }\n\n const disabledIds = Array.from(struct.atoms.values()).reduce(\n (acc, atom) => {\n if (atom.fragment === rgroup.fragId && atom.rglabel !== null)\n return acc.concat(fromElement(atom).values)\n\n return acc\n },\n []\n )\n const params = {\n type: 'fragment',\n values: [rgroup.label],\n disabledIds\n }\n return openDialog(dispatch, 'rgroup', params).then(res => ({\n label: res.values[0]\n }))\n },\n onSgroupEdit: sgroup =>\n sleep(0) // huck to open dialog after dispatch sgroup tool action\n .then(() => openDialog(dispatch, 'sgroup', fromSgroup(sgroup)))\n .then(toSgroup),\n onSdataEdit: sgroup =>\n sleep(0)\n .then(() =>\n openDialog(\n dispatch,\n sgroup.type === 'DAT' ? 'sdata' : 'sgroup',\n fromSgroup(sgroup)\n )\n )\n .then(toSgroup),\n onMessage: msg => {\n if (msg.error) {\n //TODO: add error handler call\n }\n },\n onAromatizeStruct: struct => {\n const state = getState()\n const serverOpts = state.options.getServerSettings()\n return serverCall(\n state.editor,\n state.server,\n 'aromatize',\n serverOpts,\n struct\n )\n },\n onDearomatizeStruct: struct => {\n const state = getState()\n const serverOpts = state.options.getServerSettings()\n return serverCall(\n state.editor,\n state.server,\n 'dearomatize',\n serverOpts,\n struct\n )\n },\n onMouseDown: () => {\n updateAction()\n }\n }\n}\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\n// Single entry point to Raphaël library\n\nimport Raphael from 'raphael'\nimport Vec2 from './util/vec2'\n\n// TODO: refactor ugly prototype extensions to plain old functions\nRaphael.el.translateAbs = function (x, y) {\n this.delta = this.delta || new Vec2()\n this.delta.x += x - 0\n this.delta.y += y - 0\n this.transform('t' + this.delta.x.toString() + ',' + this.delta.y.toString())\n}\n\nRaphael.st.translateAbs = function (x, y) {\n this.forEach(el => {\n el.translateAbs(x, y)\n })\n}\n\nexport default Raphael\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\nfunction scaled2obj(v, options) {\n return v.scaled(1 / options.scale)\n}\n\nfunction obj2scaled(v, options) {\n return v.scaled(options.scale)\n}\n\nexport default {\n scaled2obj,\n obj2scaled\n}\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport Vec2 from '../util/vec2'\n\nfunction tfx(v) {\n return parseFloat(v).toFixed(8)\n}\n\nfunction relBox(box) {\n return {\n x: box.x,\n y: box.y,\n width: box.width,\n height: box.height\n }\n}\n\n/**\n * Finds intersection of a ray and a box and\n * Returns the shift magnitude to avoid it\n * @param p { Vec2 }\n * @param d { Vec2 }\n * @param bb { Box2Abs }\n */\nfunction shiftRayBox(p, d, bb) {\n console.assert(!!p)\n console.assert(!!d)\n console.assert(!!bb)\n\n // four corner points of the box\n const b = [\n bb.p0,\n new Vec2(bb.p1.x, bb.p0.y),\n bb.p1,\n new Vec2(bb.p0.x, bb.p1.y)\n ]\n\n const r = b.map(v => v.sub(p)) // b relative to p\n\n d = d.normalized()\n\n const rc = r.map(v => Vec2.cross(v, d)) // cross prods\n const rd = r.map(v => Vec2.dot(v, d)) // dot prods\n\n // find foremost points on the right and on the left of the ray\n let pid = -1\n let nid = -1\n\n for (let i = 0; i < 4; ++i) {\n if (rc[i] > 0) {\n if (pid < 0 || rd[pid] < rd[i]) pid = i\n } else if (nid < 0 || rd[nid] < rd[i]) {\n nid = i\n }\n }\n\n if (nid < 0 || pid < 0)\n // no intersection, no shift\n return 0\n\n // check the order\n const id0 = rd[pid] > rd[nid] ? nid : pid\n const id1 = rd[pid] > rd[nid] ? pid : nid\n\n // simple proportion to calculate the shift\n /* eslint-disable no-mixed-operators*/\n return (\n rd[id0] +\n (Math.abs(rc[id0]) * (rd[id1] - rd[id0])) /\n (Math.abs(rc[id0]) + Math.abs(rc[id1]))\n )\n /* eslint-enable no-mixed-operators*/\n}\n\nexport default {\n tfx,\n relBox,\n shiftRayBox\n}\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\n// Visel is a shorthand for VISual ELement\n// It corresponds to a visualization (i.e. set of paths) of an atom or a bond.\nimport Box2Abs from '../../util/box2abs'\nimport Vec2 from '../../util/vec2'\n\nfunction Visel(type) {\n this.type = type\n this.paths = []\n this.boxes = []\n this.boundingBox = null\n}\n\nVisel.prototype.add = function (path, bb, ext) {\n this.paths.push(path)\n if (bb) {\n this.boxes.push(bb)\n this.boundingBox =\n this.boundingBox == null ? bb : Box2Abs.union(this.boundingBox, bb)\n }\n if (ext) this.exts.push(ext)\n}\n\nVisel.prototype.clear = function () {\n this.paths = []\n this.boxes = []\n this.exts = []\n this.boundingBox = null\n}\n\nVisel.prototype.translate = function (x, y) {\n if (arguments.length > 2)\n // TODO: replace to debug time assert\n throw new Error('One vector or two scalar arguments expected')\n if (y === undefined) {\n this.translate(x.x, x.y)\n } else {\n var delta = new Vec2(x, y)\n for (var i = 0; i < this.paths.length; ++i) this.paths[i].translateAbs(x, y)\n for (var j = 0; j < this.boxes.length; ++j)\n this.boxes[j] = this.boxes[j].translate(delta)\n if (this.boundingBox !== null)\n this.boundingBox = this.boundingBox.translate(delta)\n }\n}\n\nexport default Visel\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport Visel from './visel'\nimport scale from '../../util/scale'\n\nfunction ReObject() {}\n\nReObject.prototype.init = function (viselType) {\n this.visel = new Visel(viselType)\n\n this.highlight = false\n this.highlighting = null\n this.selected = false\n this.selectionPlate = null\n}\n\n// returns the bounding box of a ReObject in the object coordinates\nReObject.prototype.getVBoxObj = function (render) {\n var vbox = this.visel.boundingBox\n if (vbox === null) return null\n if (render.options.offset)\n vbox = vbox.translate(render.options.offset.negated())\n return vbox.transform(scale.scaled2obj, render.options)\n}\n\nReObject.prototype.setHighlight = function (highLight, render) {\n // TODO render should be field\n if (highLight) {\n let noredraw = 'highlighting' in this && this.highlighting !== null // && !this.highlighting.removed;\n if (noredraw) {\n if (this.highlighting.type === 'set') {\n if (!this.highlighting[0]) return\n noredraw = !this.highlighting[0].removed\n } else {\n noredraw = !this.highlighting.removed\n }\n }\n if (noredraw) {\n this.highlighting.show()\n } else {\n render.paper.setStart()\n this.drawHighlight(render)\n this.highlighting = render.paper.setFinish()\n }\n } else if (this.highlighting) {\n this.highlighting.hide()\n }\n\n this.highlight = highLight\n}\n\nReObject.prototype.drawHighlight = function () {\n console.assert('ReObject.drawHighlight is not overridden') // eslint-disable-line no-console\n}\n\nReObject.prototype.makeSelectionPlate = function () {\n console.assert(null, 'ReObject.makeSelectionPlate is not overridden') // eslint-disable-line no-console\n}\n\nexport default ReObject\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nconst colors = {\n // [ Standard (for sketching applications) atom colors, Old Ketcher colors ]\n H: ['#000000', '#000000'],\n He: ['#89a1a1', '#d9ffff'], // #849b9b\n Li: ['#bd77ed', '#cc80ff'], // #c87efa\n Be: ['#8fbc00', '#c2ff00'], // #82ab00\n B: ['#c18989', '#ffb5b5'], // #c38a8a\n C: ['#000000', '#000000'],\n N: ['#304ff7', '#304ff7'],\n O: ['#ff0d0d', '#ff0d0d'],\n F: ['#78bc42', '#8fe04f'], // #6dab3c\n Ne: ['#80a2af', '#b3e3f5'], // #7b9ca8\n Na: ['#ab5cf2', '#ab5cf2'],\n Mg: ['#6fcd00', '#8aff00'], // #61b400\n Al: ['#a99393', '#bfa6a6'], // #a79191\n Si: ['#b29478', '#f0c7a1'], // #b09276\n P: ['#ff8000', '#ff8000'],\n S: ['#c99a19', '#d9a61a'], // #c39517\n Cl: ['#1fd01f', '#1fd01f'], // #1dc51d\n Ar: ['#69acba', '#80d1e3'], // #63a2b0\n K: ['#8f40d4', '#8f40d4'],\n Ca: ['#38e900', '#3dff00'], // #2fc300\n Sc: ['#999999', '#e6e6e6'], // #969696\n Ti: ['#979a9e', '#bfc2c7'], // #94969a\n V: ['#99999e', '#a6a6ab'], // #96969a\n Cr: ['#8a99c7', '#8a99c7'], // #8796c3\n Mn: ['#9c7ac7', '#9c7ac7'],\n Fe: ['#e06633', '#e06633'],\n Co: ['#d37e8e', '#f08fa1'], // #db8293\n Ni: ['#4ece4e', '#4fd14f'], // #45b645\n Cu: ['#c78033', '#c78033'],\n Zn: ['#7d80b0', '#7d80b0'],\n Ga: ['#bc8b8b', '#c28f8f'], // #bd8c8c\n Ge: ['#668f8f', '#668f8f'],\n As: ['#b87ddd', '#bd80e3'], // #bd80e3\n Se: ['#e59100', '#ffa100'], // #e28f00\n Br: ['#a62929', '#a62929'],\n Kr: ['#59b1c9', '#5cb8d1'], // #53a6bc\n Rb: ['#702eb0', '#702eb0'],\n Sr: ['#00ff00', '#00ff00'], // #00d000\n Y: ['#66afaf', '#94ffff'], // #5fa4a4\n Zr: ['#71abab', '#94e0e0'], // #6ba2a2\n Nb: ['#67aeb4', '#73c2c9'], // #61a4a9\n Mo: ['#54b5b5', '#54b5b5'], // #4ea9a9\n Tc: ['#3b9e9e', '#3b9e9e'],\n Ru: ['#248f8f', '#248f8f'],\n Rh: ['#0a7d8c', '#0a7d8c'],\n Pd: ['#006985', '#006985'],\n Ag: ['#9a9a9a', '#bfbfbf'], // #969696\n Cd: ['#b29764', '#ffd98f'], // #ae9462\n In: ['#a67573', '#a67573'],\n Sn: ['#668080', '#668080'],\n Sb: ['#9e63b5', '#9e63b5'],\n Te: ['#d47a00', '#d47a00'],\n I: ['#940094', '#940094'],\n Xe: ['#429eb0', '#429eb0'],\n Cs: ['#57178f', '#57178f'],\n Ba: ['#00c900', '#00c900'],\n La: ['#5caed1', '#70d4ff'], // #57a4c5\n Ce: ['#9d9d7b', '#ffffc7'], // #989877\n Pr: ['#8ca581', '#d9ffc7'], // #869d7b\n Nd: ['#84a984', '#c7ffc7'], // #7da07d\n Pm: ['#71b18a', '#a3ffc7'], // #69a581\n Sm: ['#66b68e', '#8fffc7'], // #5ea883\n Eu: ['#4ac298', '#61ffc7'], // #43b089\n Gd: ['#37cb9e', '#45ffc7'], // #31b48d\n Tb: ['#28d1a4', '#30ffc7'], // #23b890\n Dy: ['#1bd7a8', '#1fffc7'], // #17bb92\n Ho: ['#00e98f', '#00ff9c'], // #00c578\n Er: ['#00e675', '#00e675'], // #00c765\n Tm: ['#00d452', '#00d452'], // #00c94e\n Yb: ['#00bf38', '#00bf38'],\n Lu: ['#00ab24', '#00ab24'],\n Hf: ['#47b3ec', '#4dc2ff'], // #42a8dc\n Ta: ['#4da6ff', '#4da6ff'], // #4ba2f9\n W: ['#2194d6', '#2194d6'],\n Re: ['#267dab', '#267dab'],\n Os: ['#266696', '#266696'],\n Ir: ['#175487', '#175487'],\n Pt: ['#9898a3', '#d1d1e0'], // #9595a0\n Au: ['#c19e1c', '#ffd124'], // #b9981a\n Hg: ['#9797ac', '#b8b8d1'], // #9595a9\n Tl: ['#a6544d', '#a6544d'],\n Pb: ['#575961', '#575961'],\n Bi: ['#9e4fb5', '#9e4fb5'],\n Po: ['#ab5c00', '#ab5c00'],\n At: ['#754f45', '#754f45'],\n Rn: ['#428296', '#428296'],\n Fr: ['#420066', '#420066'],\n Ra: ['#007d00', '#007d00'],\n Ac: ['#6aa2ec', '#70abfa'], // #669ce4\n Th: ['#00baff', '#00baff'], // #00b8fc\n Pa: ['#00a1ff', '#00a1ff'],\n U: ['#008fff', '#008fff'],\n Np: ['#0080ff', '#0080ff'],\n Pu: ['#006bff', '#006bff'],\n Am: ['#545cf2', '#545cf2'],\n Cm: ['#785ce3', '#785ce3'],\n Bk: ['#8a4fe3', '#8a4fe3'],\n Cf: ['#a136d4', '#a136d4'],\n Es: ['#b31fd4', '#b31fd4'],\n // Need to fix colors for the elements below (c)\n Fm: ['#000000', '#000000'],\n Md: ['#000000', '#000000'],\n No: ['#000000', '#000000'],\n Lr: ['#000000', '#000000'],\n Rf: ['#47b3ec', '#4dc2ff'],\n Db: ['#4da6ff', '#4da6ff'],\n Sg: ['#2194d6', '#2194d6'],\n Bh: ['#267dab', '#267dab'],\n Hs: ['#266696', '#266696'],\n Mt: ['#175487', '#175487'],\n Ds: ['#9898a3', '#d1d1e0'],\n Rg: ['#c19e1c', '#ffd124'],\n Cn: ['#9797ac', '#b8b8d1'],\n Nh: ['#000000', '#000000'],\n Fl: ['#000000', '#000000'],\n Mc: ['#000000', '#000000'],\n Lv: ['#000000', '#000000'],\n Ts: ['#000000', '#000000'],\n Og: ['#000000', '#000000']\n}\n\nexport const sketchingColors = Object.keys(colors).reduce((res, item) => {\n res[item] = colors[item][0]\n return res\n}, {})\n\nexport const oldColors = Object.keys(colors).reduce((res, item) => {\n res[item] = colors[item][1]\n return res\n}, {})\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport util from './util'\nimport Vec2 from '../util/vec2'\nimport Raphael from '../raphael-ext'\n\nconst tfx = util.tfx\n\nfunction rectangle(paper, pos, options) {\n return paper.rect(\n tfx(Math.min(pos[0].x, pos[1].x)),\n tfx(Math.min(pos[0].y, pos[1].y)),\n tfx(Math.abs(pos[1].x - pos[0].x)),\n tfx(Math.abs(pos[1].y - pos[0].y))\n )\n}\n\nfunction circle(paper, pos, options) {\n const rad = Vec2.dist(pos[0], pos[1])\n return paper.circle(pos[0].x, pos[0].y, rad)\n}\n\nfunction polyline(paper, pos, options) {\n let path = ['M', pos[0].x, pos[0].y]\n for (let i = 1; i < pos.length; i++) path.push('L', pos[i].x, pos[i].y)\n return paper.path(path)\n}\n\nfunction line(paper, pos, options) {\n let path = ['M', pos[0].x, pos[0].y]\n path.push('L', pos[1].x, pos[1].y)\n return paper.path(path)\n}\n\nfunction arrow(paper, a, b, options) {\n var width = 5,\n length = 7\n return paper\n .path(\n 'M{0},{1}L{2},{3}L{4},{5}M{2},{3}L{4},{6}',\n tfx(a.x),\n tfx(a.y),\n tfx(b.x),\n tfx(b.y),\n tfx(b.x - length),\n tfx(b.y - width),\n tfx(b.y + width)\n )\n .attr(options.lineattr)\n}\n\nfunction plus(paper, c, options) {\n var s = options.scale / 5\n return paper\n .path(\n 'M{0},{4}L{0},{5}M{2},{1}L{3},{1}',\n tfx(c.x),\n tfx(c.y),\n tfx(c.x - s),\n tfx(c.x + s),\n tfx(c.y - s),\n tfx(c.y + s)\n )\n .attr(options.lineattr)\n}\n\nfunction bondSingle(paper, hb1, hb2, options) {\n var a = hb1.p,\n b = hb2.p\n return paper.path(makeStroke(a, b)).attr(options.lineattr)\n}\n\nfunction bondSingleUp(paper, a, b2, b3, options) {\n // eslint-disable-line max-params\n return paper\n .path(\n 'M{0},{1}L{2},{3}L{4},{5}Z',\n tfx(a.x),\n tfx(a.y),\n tfx(b2.x),\n tfx(b2.y),\n tfx(b3.x),\n tfx(b3.y)\n )\n .attr(options.lineattr)\n .attr({ fill: '#000' })\n}\n\nfunction bondSingleStereoBold(paper, a1, a2, a3, a4, options) {\n // eslint-disable-line max-params\n return paper\n .path(\n 'M{0},{1}L{2},{3}L{4},{5}L{6},{7}Z',\n tfx(a1.x),\n tfx(a1.y),\n tfx(a2.x),\n tfx(a2.y),\n tfx(a3.x),\n tfx(a3.y),\n tfx(a4.x),\n tfx(a4.y)\n )\n .attr(options.lineattr)\n .attr({\n stroke: '#000',\n fill: '#000'\n })\n}\n\nfunction bondDoubleStereoBold(paper, sgBondPath, b1, b2, options) {\n // eslint-disable-line max-params\n return paper.set([\n sgBondPath,\n paper\n .path('M{0},{1}L{2},{3}', tfx(b1.x), tfx(b1.y), tfx(b2.x), tfx(b2.y))\n .attr(options.lineattr)\n ])\n}\n\nfunction bondSingleDown(paper, hb1, d, nlines, step, options) {\n // eslint-disable-line max-params\n var a = hb1.p,\n n = hb1.norm\n var bsp = 0.7 * options.stereoBond\n\n var path = '',\n p,\n q,\n r\n for (var i = 0; i < nlines; ++i) {\n r = a.addScaled(d, step * i)\n p = r.addScaled(n, (bsp * (i + 0.5)) / (nlines - 0.5))\n q = r.addScaled(n, (-bsp * (i + 0.5)) / (nlines - 0.5))\n path += makeStroke(p, q)\n }\n return paper.path(path).attr(options.lineattr)\n}\n\nfunction bondSingleEither(paper, hb1, d, nlines, step, options) {\n // eslint-disable-line max-params\n var a = hb1.p,\n n = hb1.norm\n var bsp = 0.7 * options.stereoBond\n\n var path = 'M' + tfx(a.x) + ',' + tfx(a.y),\n r = a\n for (var i = 0; i < nlines; ++i) {\n r = a\n .addScaled(d, step * (i + 0.5))\n .addScaled(n, ((i & 1 ? -1 : +1) * bsp * (i + 0.5)) / (nlines - 0.5))\n path += 'L' + tfx(r.x) + ',' + tfx(r.y)\n }\n return paper.path(path).attr(options.lineattr)\n}\n\nfunction bondDouble(paper, a1, a2, b1, b2, cisTrans, options) {\n // eslint-disable-line max-params\n return paper\n .path(\n cisTrans\n ? 'M{0},{1}L{6},{7}M{4},{5}L{2},{3}'\n : 'M{0},{1}L{2},{3}M{4},{5}L{6},{7}',\n tfx(a1.x),\n tfx(a1.y),\n tfx(b1.x),\n tfx(b1.y),\n tfx(a2.x),\n tfx(a2.y),\n tfx(b2.x),\n tfx(b2.y)\n )\n .attr(options.lineattr)\n}\n\nfunction bondSingleOrDouble(paper, hb1, hb2, nSect, options) {\n // eslint-disable-line max-statements, max-params\n var a = hb1.p,\n b = hb2.p,\n n = hb1.norm\n var bsp = options.bondSpace / 2\n\n var path = '',\n pi,\n pp = a\n for (var i = 1; i <= nSect; ++i) {\n pi = Vec2.lc2(a, (nSect - i) / nSect, b, i / nSect)\n if (i & 1) {\n path += makeStroke(pp, pi)\n } else {\n path += makeStroke(pp.addScaled(n, bsp), pi.addScaled(n, bsp))\n path += makeStroke(pp.addScaled(n, -bsp), pi.addScaled(n, -bsp))\n }\n pp = pi\n }\n return paper.path(path).attr(options.lineattr)\n}\n\nfunction bondTriple(paper, hb1, hb2, options) {\n var a = hb1.p,\n b = hb2.p,\n n = hb1.norm\n var a2 = a.addScaled(n, options.bondSpace)\n var b2 = b.addScaled(n, options.bondSpace)\n var a3 = a.addScaled(n, -options.bondSpace)\n var b3 = b.addScaled(n, -options.bondSpace)\n return paper\n .path(makeStroke(a, b) + makeStroke(a2, b2) + makeStroke(a3, b3))\n .attr(options.lineattr)\n}\n\nfunction bondAromatic(paper, paths, bondShift, options) {\n var l1 = paper.path(paths[0]).attr(options.lineattr)\n var l2 = paper.path(paths[1]).attr(options.lineattr)\n if (bondShift !== undefined && bondShift !== null)\n (bondShift > 0 ? l1 : l2).attr({ 'stroke-dasharray': '- ' })\n\n return paper.set([l1, l2])\n}\n\nfunction bondAny(paper, hb1, hb2, options) {\n var a = hb1.p,\n b = hb2.p\n return paper\n .path(makeStroke(a, b))\n .attr(options.lineattr)\n .attr({ 'stroke-dasharray': '- ' })\n}\n\nfunction reactingCenter(paper, p, options) {\n var pathdesc = ''\n for (var i = 0; i < p.length / 2; ++i)\n pathdesc += makeStroke(p[2 * i], p[2 * i + 1])\n return paper.path(pathdesc).attr(options.lineattr)\n}\n\nfunction topologyMark(paper, p, mark, options) {\n var path = paper.text(p.x, p.y, mark).attr({\n font: options.font,\n 'font-size': options.fontszsub,\n fill: '#000'\n })\n var rbb = util.relBox(path.getBBox())\n recenterText(path, rbb)\n return path\n}\n\nfunction radicalCap(paper, p, options) {\n var s = options.lineWidth * 0.9\n var dw = s,\n dh = 2 * s\n return paper\n .path(\n 'M{0},{1}L{2},{3}L{4},{5}',\n tfx(p.x - dw),\n tfx(p.y + dh),\n tfx(p.x),\n tfx(p.y),\n tfx(p.x + dw),\n tfx(p.y + dh)\n )\n .attr({\n stroke: '#000',\n 'stroke-width': options.lineWidth * 0.7,\n 'stroke-linecap': 'square',\n 'stroke-linejoin': 'miter'\n })\n}\n\nfunction radicalBullet(paper, p, options) {\n return paper.circle(tfx(p.x), tfx(p.y), options.lineWidth).attr({\n stroke: null,\n fill: '#000'\n })\n}\n\nfunction bracket(paper, d, n, c, bracketWidth, bracketHeight, options) {\n // eslint-disable-line max-params\n bracketWidth = bracketWidth || 0.25\n bracketHeight = bracketHeight || 1.0\n var a0 = c.addScaled(n, -0.5 * bracketHeight)\n var a1 = c.addScaled(n, 0.5 * bracketHeight)\n var b0 = a0.addScaled(d, -bracketWidth)\n var b1 = a1.addScaled(d, -bracketWidth)\n\n return paper\n .path(\n 'M{0},{1}L{2},{3}L{4},{5}L{6},{7}',\n tfx(b0.x),\n tfx(b0.y),\n tfx(a0.x),\n tfx(a0.y),\n tfx(a1.x),\n tfx(a1.y),\n tfx(b1.x),\n tfx(b1.y)\n )\n .attr(options.sgroupBracketStyle)\n}\n\nfunction selectionRectangle(paper, p0, p1, options) {\n return paper\n .rect(\n tfx(Math.min(p0.x, p1.x)),\n tfx(Math.min(p0.y, p1.y)),\n tfx(Math.abs(p1.x - p0.x)),\n tfx(Math.abs(p1.y - p0.y))\n )\n .attr(options.lassoStyle)\n}\n\nfunction selectionPolygon(paper, r, options) {\n var v = r[r.length - 1]\n var pstr = 'M' + tfx(v.x) + ',' + tfx(v.y)\n for (var i = 0; i < r.length; ++i)\n pstr += 'L' + tfx(r[i].x) + ',' + tfx(r[i].y)\n return paper.path(pstr).attr(options.lassoStyle)\n}\n\nfunction selectionLine(paper, p0, p1, options) {\n return paper.path(makeStroke(p0, p1)).attr(options.lassoStyle)\n}\n\nfunction makeStroke(a, b) {\n return 'M' + tfx(a.x) + ',' + tfx(a.y) + 'L' + tfx(b.x) + ',' + tfx(b.y) + '\t'\n}\n\nfunction dashedPath(p0, p1, dash) {\n var t0 = 0\n var t1 = Vec2.dist(p0, p1)\n var d = Vec2.diff(p1, p0).normalized()\n var black = true\n var path = ''\n var i = 0\n\n while (t0 < t1) {\n var len = dash[i % dash.length]\n var t2 = t0 + Math.min(len, t1 - t0)\n if (black)\n path +=\n 'M ' +\n p0.addScaled(d, t0).coordStr() +\n ' L ' +\n p0.addScaled(d, t2).coordStr()\n t0 += len\n black = !black\n i++\n }\n return path\n}\n\nfunction aromaticBondPaths(a2, a3, b2, b3, mask, dash) {\n // eslint-disable-line max-params\n var l1 = dash && mask & 1 ? dashedPath(a2, b2, dash) : makeStroke(a2, b2)\n var l2 = dash && mask & 2 ? dashedPath(a3, b3, dash) : makeStroke(a3, b3)\n\n return [l1, l2]\n}\n\nfunction recenterText(path, rbb) {\n // TODO: find a better way\n if (Raphael.vml) {\n // dirty hack\n console.assert(null, \"Souldn't go here!\")\n var gap = rbb.height * 0.16\n path.translateAbs(0, gap)\n rbb.y += gap\n }\n}\n\nexport default {\n recenterText,\n arrow,\n plus,\n aromaticBondPaths,\n bondSingle,\n bondSingleUp,\n bondSingleStereoBold,\n bondDoubleStereoBold,\n bondSingleDown,\n bondSingleEither,\n bondDouble,\n bondSingleOrDouble,\n bondTriple,\n bondAromatic,\n bondAny,\n reactingCenter,\n topologyMark,\n radicalCap,\n radicalBullet,\n bracket,\n selectionRectangle,\n selectionPolygon,\n selectionLine,\n circle,\n rectangle,\n polyline,\n line\n}\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport Box2Abs from '../../util/box2abs'\nimport ReObject from './reobject'\nimport scale from '../../util/scale'\nimport element from '../../chem/element'\nimport { sketchingColors as elementColor } from '../../chem/element-color'\nimport draw from '../draw'\nimport util from '../util'\nimport Vec2 from '../../util/vec2'\nimport { Bond } from '../../chem/struct'\n\nfunction ReAtom(/* chem.Atom*/ atom) {\n this.init('atom')\n\n this.a = atom // TODO rename a to item\n this.showLabel = false\n\n this.hydrogenOnTheLeft = false\n\n this.color = '#000000'\n this.component = -1\n}\n\nReAtom.prototype = new ReObject()\nReAtom.isSelectable = function () {\n return true\n}\n\nReAtom.prototype.getVBoxObj = function (render) {\n if (this.visel.boundingBox)\n return ReObject.prototype.getVBoxObj.call(this, render)\n return new Box2Abs(this.a.pp, this.a.pp)\n}\n\nReAtom.prototype.drawHighlight = function (render) {\n var ret = this.makeHighlightPlate(render)\n render.ctab.addReObjectPath('highlighting', this.visel, ret)\n return ret\n}\n\nReAtom.prototype.makeHighlightPlate = function (render) {\n var paper = render.paper\n var options = render.options\n var ps = scale.obj2scaled(this.a.pp, options)\n return paper\n .circle(ps.x, ps.y, options.atomSelectionPlateRadius)\n .attr(options.highlightStyle)\n}\n\nReAtom.prototype.makeSelectionPlate = function (restruct, paper, styles) {\n var ps = scale.obj2scaled(this.a.pp, restruct.render.options)\n return paper\n .circle(ps.x, ps.y, styles.atomSelectionPlateRadius)\n .attr(styles.selectionStyle)\n}\n\nReAtom.prototype.show = function (restruct, aid, options) {\n // eslint-disable-line max-statements\n const render = restruct.render\n const ps = scale.obj2scaled(this.a.pp, render.options)\n\n this.hydrogenOnTheLeft = setHydrogenPos(restruct.molecule, this)\n this.showLabel = isLabelVisible(restruct, render.options, this)\n this.color = 'black' // reset colour\n if (this.showLabel) {\n var label = buildLabel(this, render.paper, ps, options)\n var delta = 0.5 * options.lineWidth\n var rightMargin = label.rbb.width / 2\n var leftMargin = -label.rbb.width / 2\n var implh = Math.floor(this.a.implicitH)\n var isHydrogen = label.text === 'H'\n restruct.addReObjectPath('data', this.visel, label.path, ps, true)\n\n var index = null\n if (options.showAtomIds) {\n index = {}\n index.text = aid.toString()\n index.path = render.paper.text(ps.x, ps.y, index.text).attr({\n font: options.font,\n 'font-size': options.fontszsub,\n fill: '#070'\n })\n index.rbb = util.relBox(index.path.getBBox())\n draw.recenterText(index.path, index.rbb)\n restruct.addReObjectPath('indices', this.visel, index.path, ps)\n }\n this.setHighlight(this.highlight, render)\n }\n\n if (this.showLabel && !this.a.alias && !this.a.pseudo) {\n var hydroIndex = null\n if (isHydrogen && implh > 0) {\n hydroIndex = showHydroIndex(this, render, implh, rightMargin)\n rightMargin += hydroIndex.rbb.width + delta\n restruct.addReObjectPath('data', this.visel, hydroIndex.path, ps, true)\n }\n\n if (this.a.radical != 0) {\n var radical = showRadical(this, render)\n restruct.addReObjectPath('data', this.visel, radical.path, ps, true)\n }\n if (this.a.isotope != 0) {\n var isotope = showIsotope(this, render, leftMargin)\n leftMargin -= isotope.rbb.width + delta\n restruct.addReObjectPath('data', this.visel, isotope.path, ps, true)\n }\n if (\n !isHydrogen &&\n implh > 0 &&\n displayHydrogen(options.showHydrogenLabels, this)\n ) {\n var data = showHydrogen(this, render, implh, {\n hydrogen: {},\n hydroIndex,\n rightMargin,\n leftMargin\n })\n var hydrogen = data.hydrogen\n hydroIndex = data.hydroIndex\n rightMargin = data.rightMargin\n leftMargin = data.leftMargin\n restruct.addReObjectPath('data', this.visel, hydrogen.path, ps, true)\n if (hydroIndex != null)\n restruct.addReObjectPath('data', this.visel, hydroIndex.path, ps, true)\n }\n\n if (this.a.charge != 0 && options.showCharge) {\n var charge = showCharge(this, render, rightMargin)\n rightMargin += charge.rbb.width + delta\n restruct.addReObjectPath('data', this.visel, charge.path, ps, true)\n }\n if (this.a.explicitValence >= 0 && options.showValence) {\n var valence = showExplicitValence(this, render, rightMargin)\n rightMargin += valence.rbb.width + delta\n restruct.addReObjectPath('data', this.visel, valence.path, ps, true)\n }\n\n if (this.a.badConn && options.showValenceWarnings) {\n var warning = showWarning(this, render, leftMargin, rightMargin)\n restruct.addReObjectPath('warnings', this.visel, warning.path, ps, true)\n }\n if (index) {\n /* eslint-disable no-mixed-operators */\n pathAndRBoxTranslate(\n index.path,\n index.rbb,\n -0.5 * label.rbb.width - 0.5 * index.rbb.width - delta,\n 0.3 * label.rbb.height\n )\n /* eslint-enable no-mixed-operators */\n }\n }\n\n if (this.a.attpnt) {\n const lsb = bisectLargestSector(this, restruct.molecule)\n showAttpnt(this, render, lsb, restruct.addReObjectPath.bind(restruct))\n }\n\n const stereoLabel = this.a.stereoLabel // Enhanced Stereo\n const aamText = getAamText(this)\n const queryAttrsText =\n !this.a.alias && !this.a.pseudo ? getQueryAttrsText(this) : ''\n\n // we render them together to avoid possible collisions\n const text =\n (stereoLabel ? `${stereoLabel}\\n` : '') +\n (queryAttrsText.length > 0 ? `${queryAttrsText}\\n` : '') +\n (aamText.length > 0 ? `.${aamText}.` : '')\n if (text.length > 0) {\n var elem = element.map[this.a.label]\n var aamPath = render.paper.text(ps.x, ps.y, text).attr({\n font: options.font,\n 'font-size': options.fontszsub,\n fill: options.atomColoring && elem ? elementColor[this.a.label] : '#000'\n })\n var aamBox = util.relBox(aamPath.getBBox())\n draw.recenterText(aamPath, aamBox)\n var dir = bisectLargestSector(this, restruct.molecule)\n var visel = this.visel\n var t = 3\n // estimate the shift to clear the atom label\n for (var i = 0; i < visel.exts.length; ++i)\n t = Math.max(t, util.shiftRayBox(ps, dir, visel.exts[i].translate(ps)))\n // estimate the shift backwards to account for the size of the aam/query text box itself\n t += util.shiftRayBox(ps, dir.negated(), Box2Abs.fromRelBox(aamBox))\n dir = dir.scaled(8 + t)\n pathAndRBoxTranslate(aamPath, aamBox, dir.x, dir.y)\n restruct.addReObjectPath('data', this.visel, aamPath, ps, true)\n }\n}\n\nfunction isLabelVisible(restruct, options, atom) {\n const visibleTerminal =\n options.showHydrogenLabels !== 'off' &&\n options.showHydrogenLabels !== 'Hetero'\n\n const neighborsLength =\n atom.a.neighbors.length === 0 ||\n (atom.a.neighbors.length < 2 && visibleTerminal)\n\n const shouldBeVisible =\n neighborsLength ||\n options.carbonExplicitly ||\n atom.a.alias ||\n atom.a.isotope !== 0 ||\n atom.a.radical !== 0 ||\n atom.a.charge !== 0 ||\n atom.a.explicitValence >= 0 ||\n atom.a.atomList !== null ||\n atom.a.rglabel !== null ||\n (atom.a.badConn && options.showValenceWarnings) ||\n atom.a.label.toLowerCase() !== 'c'\n\n if (shouldBeVisible) return true\n\n if (atom.a.neighbors.length === 2) {\n const nei1 = atom.a.neighbors[0]\n const nei2 = atom.a.neighbors[1]\n const hb1 = restruct.molecule.halfBonds.get(nei1)\n const hb2 = restruct.molecule.halfBonds.get(nei2)\n const bond1 = restruct.bonds.get(hb1.bid)\n const bond2 = restruct.bonds.get(hb2.bid)\n\n const sameNotStereo =\n bond1.b.type === bond2.b.type &&\n bond1.b.stereo === Bond.PATTERN.STEREO.NONE &&\n bond2.b.stereo === Bond.PATTERN.STEREO.NONE\n\n if (sameNotStereo && Math.abs(Vec2.cross(hb1.dir, hb2.dir)) < 0.2)\n return true\n }\n\n return false\n}\n\nfunction displayHydrogen(hydrogenLabels, atom) {\n return (\n hydrogenLabels === 'on' ||\n (hydrogenLabels === 'Terminal' && atom.a.neighbors.length < 2) ||\n (hydrogenLabels === 'Hetero' && atom.label.text.toLowerCase() !== 'c') ||\n (hydrogenLabels === 'Terminal and Hetero' &&\n (atom.a.neighbors.length < 2 || atom.label.text.toLowerCase() !== 'c'))\n )\n}\n\nfunction setHydrogenPos(struct, atom) {\n // check where should the hydrogen be put on the left of the label\n if (atom.a.neighbors.length === 0) {\n const elem = element.map[atom.a.label]\n return !elem || element[elem].leftH\n }\n\n let yl = 1\n let yr = 1\n let nl = 0\n let nr = 0\n\n atom.a.neighbors.forEach(nei => {\n const d = struct.halfBonds.get(nei).dir\n\n if (d.x <= 0) {\n yl = Math.min(yl, Math.abs(d.y))\n nl++\n } else {\n yr = Math.min(yr, Math.abs(d.y))\n nr++\n }\n })\n\n return yl < 0.51 || yr < 0.51 ? yr < yl : nr > nl\n}\n\nfunction buildLabel(atom, paper, ps, options) {\n // eslint-disable-line max-statements\n let label = {}\n label.text = getLabelText(atom.a)\n\n if (label.text === '') label = 'R#' // for structures that missed 'M RGP' tag in molfile\n\n if (label.text === atom.a.label) {\n const elem = element.map[label.text]\n if (options.atomColoring && elem)\n atom.color = elementColor[label.text] || '#000'\n }\n\n label.path = paper.text(ps.x, ps.y, label.text).attr({\n font: options.font,\n 'font-size': options.fontsz,\n fill: atom.color,\n 'font-style': atom.a.pseudo ? 'italic' : ''\n })\n\n label.rbb = util.relBox(label.path.getBBox())\n draw.recenterText(label.path, label.rbb)\n\n if (atom.a.atomList !== null)\n pathAndRBoxTranslate(\n label.path,\n label.rbb,\n ((atom.hydrogenOnTheLeft ? -1 : 1) *\n (label.rbb.width - label.rbb.height)) /\n 2,\n 0\n )\n\n atom.label = label\n return label\n}\n\nfunction getLabelText(atom) {\n if (atom.atomList !== null) return atom.atomList.label()\n\n if (atom.pseudo) return atom.pseudo\n\n if (atom.alias) return atom.alias\n\n if (atom.label === 'R#' && atom.rglabel !== null) {\n let text = ''\n\n for (let rgi = 0; rgi < 32; rgi++) {\n if (atom.rglabel & (1 << rgi))\n // eslint-disable-line max-depth\n text += 'R' + (rgi + 1).toString()\n }\n\n return text\n }\n\n return atom.label\n}\n\nfunction showHydroIndex(atom, render, implh, rightMargin) {\n var ps = scale.obj2scaled(atom.a.pp, render.options)\n var options = render.options\n var delta = 0.5 * options.lineWidth\n var hydroIndex = {}\n hydroIndex.text = (implh + 1).toString()\n hydroIndex.path = render.paper.text(ps.x, ps.y, hydroIndex.text).attr({\n font: options.font,\n 'font-size': options.fontszsub,\n fill: atom.color\n })\n hydroIndex.rbb = util.relBox(hydroIndex.path.getBBox())\n draw.recenterText(hydroIndex.path, hydroIndex.rbb)\n /* eslint-disable no-mixed-operators*/\n pathAndRBoxTranslate(\n hydroIndex.path,\n hydroIndex.rbb,\n rightMargin + 0.5 * hydroIndex.rbb.width + delta,\n 0.2 * atom.label.rbb.height\n )\n /* eslint-enable no-mixed-operators*/\n return hydroIndex\n}\n\nfunction showRadical(atom, render) {\n var ps = scale.obj2scaled(atom.a.pp, render.options)\n var options = render.options\n var paper = render.paper\n var radical = {}\n var hshift\n switch (atom.a.radical) {\n case 1:\n radical.path = paper.set()\n hshift = 1.6 * options.lineWidth\n radical.path.push(\n draw.radicalBullet(paper, ps.add(new Vec2(-hshift, 0)), options),\n draw.radicalBullet(paper, ps.add(new Vec2(hshift, 0)), options)\n )\n radical.path.attr('fill', atom.color)\n break\n case 2:\n radical.path = paper.set()\n radical.path.push(draw.radicalBullet(paper, ps, options))\n radical.path.attr('fill', atom.color)\n break\n case 3:\n radical.path = paper.set()\n hshift = 1.6 * options.lineWidth\n radical.path.push(\n draw.radicalCap(paper, ps.add(new Vec2(-hshift, 0)), options),\n draw.radicalCap(paper, ps.add(new Vec2(hshift, 0)), options)\n )\n radical.path.attr('stroke', atom.color)\n break\n default:\n break\n }\n radical.rbb = util.relBox(radical.path.getBBox())\n var vshift = -0.5 * (atom.label.rbb.height + radical.rbb.height)\n if (atom.a.radical === 3) vshift -= options.lineWidth / 2\n pathAndRBoxTranslate(radical.path, radical.rbb, 0, vshift)\n return radical\n}\n\nfunction showIsotope(atom, render, leftMargin) {\n var ps = scale.obj2scaled(atom.a.pp, render.options)\n var options = render.options\n var delta = 0.5 * options.lineWidth\n var isotope = {}\n isotope.text = atom.a.isotope.toString()\n isotope.path = render.paper.text(ps.x, ps.y, isotope.text).attr({\n font: options.font,\n 'font-size': options.fontszsub,\n fill: atom.color\n })\n isotope.rbb = util.relBox(isotope.path.getBBox())\n draw.recenterText(isotope.path, isotope.rbb)\n /* eslint-disable no-mixed-operators*/\n pathAndRBoxTranslate(\n isotope.path,\n isotope.rbb,\n leftMargin - 0.5 * isotope.rbb.width - delta,\n -0.3 * atom.label.rbb.height\n )\n /* eslint-enable no-mixed-operators*/\n return isotope\n}\n\nfunction showCharge(atom, render, rightMargin) {\n var ps = scale.obj2scaled(atom.a.pp, render.options)\n var options = render.options\n var delta = 0.5 * options.lineWidth\n var charge = {}\n charge.text = ''\n var absCharge = Math.abs(atom.a.charge)\n if (absCharge !== 1) charge.text = absCharge.toString()\n if (atom.a.charge < 0) charge.text += '\\u2013'\n else charge.text += '+'\n\n charge.path = render.paper.text(ps.x, ps.y, charge.text).attr({\n font: options.font,\n 'font-size': options.fontszsub,\n fill: atom.color\n })\n charge.rbb = util.relBox(charge.path.getBBox())\n draw.recenterText(charge.path, charge.rbb)\n /* eslint-disable no-mixed-operators*/\n pathAndRBoxTranslate(\n charge.path,\n charge.rbb,\n rightMargin + 0.5 * charge.rbb.width + delta,\n -0.3 * atom.label.rbb.height\n )\n /* eslint-enable no-mixed-operators*/\n return charge\n}\n\nfunction showExplicitValence(atom, render, rightMargin) {\n var mapValence = {\n 0: '0',\n 1: 'I',\n 2: 'II',\n 3: 'III',\n 4: 'IV',\n 5: 'V',\n 6: 'VI',\n 7: 'VII',\n 8: 'VIII',\n 9: 'IX',\n 10: 'X',\n 11: 'XI',\n 12: 'XII',\n 13: 'XIII',\n 14: 'XIV'\n }\n var ps = scale.obj2scaled(atom.a.pp, render.options)\n var options = render.options\n var delta = 0.5 * options.lineWidth\n var valence = {}\n valence.text = mapValence[atom.a.explicitValence]\n if (!valence.text)\n throw new Error('invalid valence ' + atom.a.explicitValence.toString())\n valence.text = '(' + valence.text + ')'\n valence.path = render.paper.text(ps.x, ps.y, valence.text).attr({\n font: options.font,\n 'font-size': options.fontszsub,\n fill: atom.color\n })\n valence.rbb = util.relBox(valence.path.getBBox())\n draw.recenterText(valence.path, valence.rbb)\n /* eslint-disable no-mixed-operators*/\n pathAndRBoxTranslate(\n valence.path,\n valence.rbb,\n rightMargin + 0.5 * valence.rbb.width + delta,\n -0.3 * atom.label.rbb.height\n )\n /* eslint-enable no-mixed-operators*/\n return valence\n}\n\nfunction showHydrogen(atom, render, implh, data) {\n // eslint-disable-line max-statements\n var hydroIndex = data.hydroIndex\n var hydrogenLeft = atom.hydrogenOnTheLeft\n var ps = scale.obj2scaled(atom.a.pp, render.options)\n var options = render.options\n var delta = 0.5 * options.lineWidth\n var hydrogen = data.hydrogen\n hydrogen.text = 'H'\n hydrogen.path = render.paper.text(ps.x, ps.y, hydrogen.text).attr({\n font: options.font,\n 'font-size': options.fontsz,\n fill: atom.color\n })\n hydrogen.rbb = util.relBox(hydrogen.path.getBBox())\n draw.recenterText(hydrogen.path, hydrogen.rbb)\n if (!hydrogenLeft) {\n pathAndRBoxTranslate(\n hydrogen.path,\n hydrogen.rbb,\n data.rightMargin + 0.5 * hydrogen.rbb.width + delta,\n 0\n )\n data.rightMargin += hydrogen.rbb.width + delta\n }\n if (implh > 1) {\n hydroIndex = {}\n hydroIndex.text = implh.toString()\n hydroIndex.path = render.paper.text(ps.x, ps.y, hydroIndex.text).attr({\n font: options.font,\n 'font-size': options.fontszsub,\n fill: atom.color\n })\n hydroIndex.rbb = util.relBox(hydroIndex.path.getBBox())\n draw.recenterText(hydroIndex.path, hydroIndex.rbb)\n if (!hydrogenLeft) {\n pathAndRBoxTranslate(\n hydroIndex.path,\n hydroIndex.rbb,\n data.rightMargin + 0.5 * hydroIndex.rbb.width + delta,\n 0.2 * atom.label.rbb.height\n )\n data.rightMargin += hydroIndex.rbb.width + delta\n }\n }\n if (hydrogenLeft) {\n if (hydroIndex != null) {\n pathAndRBoxTranslate(\n hydroIndex.path,\n hydroIndex.rbb,\n data.leftMargin - 0.5 * hydroIndex.rbb.width - delta,\n 0.2 * atom.label.rbb.height\n )\n data.leftMargin -= hydroIndex.rbb.width + delta\n }\n pathAndRBoxTranslate(\n hydrogen.path,\n hydrogen.rbb,\n data.leftMargin - 0.5 * hydrogen.rbb.width - delta,\n 0\n )\n data.leftMargin -= hydrogen.rbb.width + delta\n }\n return Object.assign(data, { hydrogen, hydroIndex })\n}\n\nfunction showWarning(atom, render, leftMargin, rightMargin) {\n var ps = scale.obj2scaled(atom.a.pp, render.options)\n var delta = 0.5 * render.options.lineWidth\n var tfx = util.tfx\n var warning = {}\n var y = ps.y + atom.label.rbb.height / 2 + delta\n warning.path = render.paper\n .path(\n 'M{0},{1}L{2},{3}',\n tfx(ps.x + leftMargin),\n tfx(y),\n tfx(ps.x + rightMargin),\n tfx(y)\n )\n .attr(render.options.lineattr)\n .attr({ stroke: '#F00' })\n warning.rbb = util.relBox(warning.path.getBBox())\n return warning\n}\n\nfunction showAttpnt(atom, render, lsb, addReObjectPath) {\n // eslint-disable-line max-statements\n var asterisk = '∗'\n var ps = scale.obj2scaled(atom.a.pp, render.options)\n var options = render.options\n var tfx = util.tfx\n var i, j\n for (i = 0; i < 4; ++i) {\n var attpntText = ''\n if (atom.a.attpnt & (1 << i)) {\n if (attpntText.length > 0) attpntText += ' '\n attpntText += asterisk\n for (j = 0; j < (i == 0 ? 0 : i + 1); ++j) attpntText += \"'\"\n var pos0 = new Vec2(ps)\n var pos1 = ps.addScaled(lsb, 0.7 * options.scale)\n\n var attpntPath1 = render.paper.text(pos1.x, pos1.y, attpntText).attr({\n font: options.font,\n 'font-size': options.fontsz,\n fill: atom.color\n })\n var attpntRbb = util.relBox(attpntPath1.getBBox())\n draw.recenterText(attpntPath1, attpntRbb)\n\n var lsbn = lsb.negated()\n /* eslint-disable no-mixed-operators*/\n pos1 = pos1.addScaled(\n lsbn,\n util.shiftRayBox(pos1, lsbn, Box2Abs.fromRelBox(attpntRbb)) +\n options.lineWidth / 2\n )\n /* eslint-enable no-mixed-operators*/\n pos0 = shiftBondEnd(atom, pos0, lsb, options.lineWidth)\n var n = lsb.rotateSC(1, 0)\n var arrowLeft = pos1\n .addScaled(n, 0.05 * options.scale)\n .addScaled(lsbn, 0.09 * options.scale)\n var arrowRight = pos1\n .addScaled(n, -0.05 * options.scale)\n .addScaled(lsbn, 0.09 * options.scale)\n var attpntPath = render.paper.set()\n attpntPath.push(\n attpntPath1,\n render.paper\n .path(\n 'M{0},{1}L{2},{3}M{4},{5}L{2},{3}L{6},{7}',\n tfx(pos0.x),\n tfx(pos0.y),\n tfx(pos1.x),\n tfx(pos1.y),\n tfx(arrowLeft.x),\n tfx(arrowLeft.y),\n tfx(arrowRight.x),\n tfx(arrowRight.y)\n )\n .attr(render.options.lineattr)\n .attr({ 'stroke-width': options.lineWidth / 2 })\n )\n addReObjectPath('indices', atom.visel, attpntPath, ps)\n lsb = lsb.rotate(Math.PI / 6)\n }\n }\n}\n\n// function getStereoLabelText(atom, aid, render) {\n// \tconst struct = render.ctab.molecule;\n// \tconst frag = struct.frags.get(atom.a.fragment);\n// \tconst stereo = frag.getStereoAtomMark(aid);\n// \tif (!stereo.type) return null;\n//\n// \treturn stereo.type + (stereo.number || '');\n// }\n\nfunction getAamText(atom) {\n var aamText = ''\n if (atom.a.aam > 0) aamText += atom.a.aam\n if (atom.a.invRet > 0) {\n if (aamText.length > 0) aamText += ','\n if (atom.a.invRet == 1) aamText += 'Inv'\n else if (atom.a.invRet == 2) aamText += 'Ret'\n else throw new Error('Invalid value for the invert/retain flag')\n }\n if (atom.a.exactChangeFlag > 0) {\n if (aamText.length > 0) aamText += ','\n if (atom.a.exactChangeFlag == 1) aamText += 'ext'\n else throw new Error('Invalid value for the exact change flag')\n }\n return aamText\n}\n\nfunction getQueryAttrsText(atom) {\n var queryAttrsText = ''\n if (atom.a.ringBondCount != 0) {\n if (atom.a.ringBondCount > 0)\n queryAttrsText += 'rb' + atom.a.ringBondCount.toString()\n else if (atom.a.ringBondCount == -1) queryAttrsText += 'rb0'\n else if (atom.a.ringBondCount == -2) queryAttrsText += 'rb*'\n else throw new Error('Ring bond count invalid')\n }\n if (atom.a.substitutionCount != 0) {\n if (queryAttrsText.length > 0) queryAttrsText += ','\n if (atom.a.substitutionCount > 0)\n queryAttrsText += 's' + atom.a.substitutionCount.toString()\n else if (atom.a.substitutionCount == -1) queryAttrsText += 's0'\n else if (atom.a.substitutionCount == -2) queryAttrsText += 's*'\n else throw new Error('Substitution count invalid')\n }\n if (atom.a.unsaturatedAtom > 0) {\n if (queryAttrsText.length > 0) queryAttrsText += ','\n if (atom.a.unsaturatedAtom == 1) queryAttrsText += 'u'\n else throw new Error('Unsaturated atom invalid value')\n }\n if (atom.a.hCount > 0) {\n if (queryAttrsText.length > 0) queryAttrsText += ','\n queryAttrsText += 'H' + (atom.a.hCount - 1).toString()\n }\n return queryAttrsText\n}\n\nfunction pathAndRBoxTranslate(path, rbb, x, y) {\n path.translateAbs(x, y)\n rbb.x += x\n rbb.y += y\n}\n\nfunction bisectLargestSector(atom, struct) {\n var angles = []\n atom.a.neighbors.forEach(hbid => {\n var hb = struct.halfBonds.get(hbid)\n angles.push(hb.ang)\n })\n angles = angles.sort((a, b) => a - b)\n var da = []\n for (var i = 0; i < angles.length - 1; ++i)\n da.push(angles[(i + 1) % angles.length] - angles[i])\n da.push(angles[0] - angles[angles.length - 1] + 2 * Math.PI)\n var daMax = 0\n var ang = -Math.PI / 2\n for (i = 0; i < angles.length; ++i) {\n if (da[i] > daMax) {\n daMax = da[i]\n ang = angles[i] + da[i] / 2\n }\n }\n return new Vec2(Math.cos(ang), Math.sin(ang))\n}\n\nfunction shiftBondEnd(atom, pos0, dir, margin) {\n var t = 0\n var visel = atom.visel\n for (var k = 0; k < visel.exts.length; ++k) {\n var box = visel.exts[k].translate(pos0)\n t = Math.max(t, util.shiftRayBox(pos0, dir, box))\n }\n if (t > 0) pos0 = pos0.addScaled(dir, t + margin)\n return pos0\n}\n\nexport default ReAtom\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport ReObject from './reobject'\n\nimport { Bond } from '../../chem/struct'\nimport draw from '../draw'\nimport Vec2 from '../../util/vec2'\nimport util from '../util'\nimport scale from '../../util/scale'\n\n/**\n * @param bond { Bond }\n * @constructor\n */\nfunction ReBond(bond) {\n this.init('bond')\n\n this.b = bond // TODO rename b to item\n this.doubleBondShift = 0\n}\n\nReBond.prototype = new ReObject()\nReBond.isSelectable = function () {\n return true\n}\n\nReBond.prototype.drawHighlight = function (render) {\n var ret = this.makeHighlightPlate(render)\n render.ctab.addReObjectPath('highlighting', this.visel, ret)\n return ret\n}\n\nReBond.prototype.makeHighlightPlate = function (render) {\n var options = render.options\n bondRecalc(this, render.ctab, options)\n var c = scale.obj2scaled(this.b.center, options)\n return render.paper\n .circle(c.x, c.y, 0.8 * options.atomSelectionPlateRadius)\n .attr(options.highlightStyle)\n}\n\nReBond.prototype.makeSelectionPlate = function (restruct, paper, options) {\n bondRecalc(this, restruct, options)\n var c = scale.obj2scaled(this.b.center, options)\n return paper\n .circle(c.x, c.y, 0.8 * options.atomSelectionPlateRadius)\n .attr(options.selectionStyle)\n}\n\n/**\n * @param restruct { ReStruct }\n * @param bid { number }\n * @param options { object }\n */\nReBond.prototype.show = function (restruct, bid, options) {\n // eslint-disable-line max-statements\n var render = restruct.render\n var struct = restruct.molecule\n var paper = render.paper\n var hb1 = struct.halfBonds.get(this.b.hb1),\n hb2 = struct.halfBonds.get(this.b.hb2)\n\n checkStereoBold(bid, this, restruct)\n bondRecalc(this, restruct, options)\n setDoubleBondShift(this, struct)\n\n this.path = getBondPath(restruct, this, hb1, hb2)\n\n this.rbb = util.relBox(this.path.getBBox())\n restruct.addReObjectPath('data', this.visel, this.path, null, true)\n var reactingCenter = {}\n reactingCenter.path = getReactingCenterPath(render, this, hb1, hb2)\n if (reactingCenter.path) {\n reactingCenter.rbb = util.relBox(reactingCenter.path.getBBox())\n restruct.addReObjectPath(\n 'data',\n this.visel,\n reactingCenter.path,\n null,\n true\n )\n }\n var topology = {}\n topology.path = getTopologyMark(render, this, hb1, hb2)\n if (topology.path) {\n topology.rbb = util.relBox(topology.path.getBBox())\n restruct.addReObjectPath('data', this.visel, topology.path, null, true)\n }\n this.setHighlight(this.highlight, render)\n\n var ipath = null\n var bondIdxOff = options.subFontSize * 0.6\n if (options.showBondIds) {\n ipath = getIdsPath(bid, paper, hb1, hb2, bondIdxOff, 0.5, 0.5, hb1.norm)\n restruct.addReObjectPath('indices', this.visel, ipath)\n }\n if (options.showHalfBondIds) {\n ipath = getIdsPath(\n this.b.hb1,\n paper,\n hb1,\n hb2,\n bondIdxOff,\n 0.8,\n 0.2,\n hb1.norm\n )\n restruct.addReObjectPath('indices', this.visel, ipath)\n ipath = getIdsPath(\n this.b.hb2,\n paper,\n hb1,\n hb2,\n bondIdxOff,\n 0.2,\n 0.8,\n hb2.norm\n )\n restruct.addReObjectPath('indices', this.visel, ipath)\n }\n if (options.showLoopIds && !options.showBondIds) {\n ipath = getIdsPath(\n hb1.loop,\n paper,\n hb1,\n hb2,\n bondIdxOff,\n 0.5,\n 0.5,\n hb2.norm\n )\n restruct.addReObjectPath('indices', this.visel, ipath)\n ipath = getIdsPath(\n hb2.loop,\n paper,\n hb1,\n hb2,\n bondIdxOff,\n 0.5,\n 0.5,\n hb1.norm\n )\n restruct.addReObjectPath('indices', this.visel, ipath)\n }\n}\n\nfunction findIncomingStereoUpBond(atom, bid0, includeBoldStereoBond, restruct) {\n return atom.neighbors.findIndex(hbid => {\n const hb = restruct.molecule.halfBonds.get(hbid)\n const bid = hb.bid\n if (bid === bid0) return false\n\n const neibond = restruct.bonds.get(bid)\n\n const singleUp =\n neibond.b.type === Bond.PATTERN.TYPE.SINGLE &&\n neibond.b.stereo === Bond.PATTERN.STEREO.UP\n\n if (singleUp)\n return (\n neibond.b.end === hb.begin ||\n (neibond.boldStereo && includeBoldStereoBond)\n )\n\n return !!(\n neibond.b.type === Bond.PATTERN.TYPE.DOUBLE &&\n neibond.b.stereo === Bond.PATTERN.STEREO.NONE &&\n includeBoldStereoBond &&\n neibond.boldStereo\n )\n })\n}\n\nfunction findIncomingUpBonds(bid0, bond, restruct) {\n const halfbonds = [bond.b.begin, bond.b.end].map(aid => {\n const atom = restruct.molecule.atoms.get(aid)\n const pos = findIncomingStereoUpBond(atom, bid0, true, restruct)\n return pos < 0 ? -1 : atom.neighbors[pos]\n })\n console.assert(halfbonds.length === 2)\n bond.neihbid1 = restruct.atoms.get(bond.b.begin).showLabel ? -1 : halfbonds[0]\n bond.neihbid2 = restruct.atoms.get(bond.b.end).showLabel ? -1 : halfbonds[1]\n}\n\nfunction checkStereoBold(bid0, bond, restruct) {\n var halfbonds = [bond.b.begin, bond.b.end].map(aid => {\n var atom = restruct.molecule.atoms.get(aid)\n var pos = findIncomingStereoUpBond(atom, bid0, false, restruct)\n return pos < 0 ? -1 : atom.neighbors[pos]\n })\n console.assert(halfbonds.length === 2)\n bond.boldStereo = halfbonds[0] >= 0 && halfbonds[1] >= 0\n}\n\n/**\n * @param restruct { ReStruct }\n * @param bond { ReBond }\n * @param hb1 { HalfBond }\n * @param hb2 { HalfBond }\n * @return {*}\n */\nfunction getBondPath(restruct, bond, hb1, hb2) {\n var path = null\n var render = restruct.render\n var struct = restruct.molecule\n var shiftA = !restruct.atoms.get(hb1.begin).showLabel\n var shiftB = !restruct.atoms.get(hb2.begin).showLabel\n\n switch (bond.b.type) {\n case Bond.PATTERN.TYPE.SINGLE:\n switch (bond.b.stereo) {\n case Bond.PATTERN.STEREO.UP:\n findIncomingUpBonds(hb1.bid, bond, restruct)\n if (bond.boldStereo && bond.neihbid1 >= 0 && bond.neihbid2 >= 0)\n path = getBondSingleStereoBoldPath(render, hb1, hb2, bond, struct)\n else path = getBondSingleUpPath(render, hb1, hb2, bond, struct)\n break\n case Bond.PATTERN.STEREO.DOWN:\n path = getBondSingleDownPath(render, hb1, hb2)\n break\n case Bond.PATTERN.STEREO.EITHER:\n path = getBondSingleEitherPath(render, hb1, hb2)\n break\n default:\n path = draw.bondSingle(render.paper, hb1, hb2, render.options)\n break\n }\n break\n case Bond.PATTERN.TYPE.DOUBLE:\n findIncomingUpBonds(hb1.bid, bond, restruct)\n if (\n bond.b.stereo === Bond.PATTERN.STEREO.NONE &&\n bond.boldStereo &&\n bond.neihbid1 >= 0 &&\n bond.neihbid2 >= 0\n )\n path = getBondDoubleStereoBoldPath(\n render,\n hb1,\n hb2,\n bond,\n struct,\n shiftA,\n shiftB\n )\n else path = getBondDoublePath(render, hb1, hb2, bond, shiftA, shiftB)\n break\n case Bond.PATTERN.TYPE.TRIPLE:\n path = draw.bondTriple(render.paper, hb1, hb2, render.options)\n break\n case Bond.PATTERN.TYPE.AROMATIC:\n var inAromaticLoop =\n (hb1.loop >= 0 && struct.loops.get(hb1.loop).aromatic) ||\n (hb2.loop >= 0 && struct.loops.get(hb2.loop).aromatic)\n path = inAromaticLoop\n ? draw.bondSingle(render.paper, hb1, hb2, render.options)\n : getBondAromaticPath(render, hb1, hb2, bond, shiftA, shiftB)\n break\n case Bond.PATTERN.TYPE.SINGLE_OR_DOUBLE:\n path = getSingleOrDoublePath(render, hb1, hb2)\n break\n case Bond.PATTERN.TYPE.SINGLE_OR_AROMATIC:\n path = getBondAromaticPath(render, hb1, hb2, bond, shiftA, shiftB)\n break\n case Bond.PATTERN.TYPE.DOUBLE_OR_AROMATIC:\n path = getBondAromaticPath(render, hb1, hb2, bond, shiftA, shiftB)\n break\n case Bond.PATTERN.TYPE.ANY:\n path = draw.bondAny(render.paper, hb1, hb2, render.options)\n break\n default:\n throw new Error('Bond type ' + bond.b.type + ' not supported')\n }\n return path\n}\n\n/* Get Path */\nfunction getBondSingleUpPath(render, hb1, hb2, bond, struct) {\n // eslint-disable-line max-params\n var a = hb1.p,\n b = hb2.p,\n n = hb1.norm\n var options = render.options\n var bsp = 0.7 * options.stereoBond\n var b2 = b.addScaled(n, bsp)\n var b3 = b.addScaled(n, -bsp)\n if (bond.neihbid2 >= 0) {\n // if the end is shared with another up-bond heading this way\n var coords = stereoUpBondGetCoordinates(\n hb2,\n bond.neihbid2,\n options.stereoBond,\n struct\n )\n b2 = coords[0]\n b3 = coords[1]\n }\n return draw.bondSingleUp(render.paper, a, b2, b3, options)\n}\n\nfunction getBondSingleStereoBoldPath(render, hb1, hb2, bond, struct) {\n // eslint-disable-line max-params\n var options = render.options\n var coords1 = stereoUpBondGetCoordinates(\n hb1,\n bond.neihbid1,\n options.stereoBond,\n struct\n )\n var coords2 = stereoUpBondGetCoordinates(\n hb2,\n bond.neihbid2,\n options.stereoBond,\n struct\n )\n var a1 = coords1[0]\n var a2 = coords1[1]\n var a3 = coords2[0]\n var a4 = coords2[1]\n return draw.bondSingleStereoBold(render.paper, a1, a2, a3, a4, options)\n}\n\nfunction getBondDoubleStereoBoldPath(\n render,\n hb1,\n hb2,\n bond,\n struct,\n shiftA,\n shiftB\n) {\n // eslint-disable-line max-params\n var a = hb1.p,\n b = hb2.p,\n n = hb1.norm,\n shift = bond.doubleBondShift\n var bsp = 1.5 * render.options.stereoBond\n var b1 = a.addScaled(n, bsp * shift)\n var b2 = b.addScaled(n, bsp * shift)\n if (shift > 0) {\n if (shiftA)\n b1 = b1.addScaled(\n hb1.dir,\n bsp * getBondLineShift(hb1.rightCos, hb1.rightSin)\n )\n if (shiftB)\n b2 = b2.addScaled(\n hb1.dir,\n -bsp * getBondLineShift(hb2.leftCos, hb2.leftSin)\n )\n } else if (shift < 0) {\n if (shiftA)\n b1 = b1.addScaled(\n hb1.dir,\n bsp * getBondLineShift(hb1.leftCos, hb1.leftSin)\n )\n if (shiftB)\n b2 = b2.addScaled(\n hb1.dir,\n -bsp * getBondLineShift(hb2.rightCos, hb2.rightSin)\n )\n }\n var sgBondPath = getBondSingleStereoBoldPath(render, hb1, hb2, bond, struct)\n return draw.bondDoubleStereoBold(\n render.paper,\n sgBondPath,\n b1,\n b2,\n render.options\n )\n}\n\nfunction getBondLineShift(cos, sin) {\n if (sin < 0 || Math.abs(cos) > 0.9) return 0\n return sin / (1 - cos)\n}\n\nfunction stereoUpBondGetCoordinates(hb, neihbid, bondSpace, struct) {\n var neihb = struct.halfBonds.get(neihbid)\n var cos = Vec2.dot(hb.dir, neihb.dir)\n var sin = Vec2.cross(hb.dir, neihb.dir)\n var cosHalf = Math.sqrt(0.5 * (1 - cos))\n var biss = neihb.dir.rotateSC(\n (sin >= 0 ? -1 : 1) * cosHalf,\n Math.sqrt(0.5 * (1 + cos))\n )\n\n var denomAdd = 0.3\n var scale = 0.7\n var a1 = hb.p.addScaled(biss, (scale * bondSpace) / (cosHalf + denomAdd))\n var a2 = hb.p.addScaled(\n biss.negated(),\n (scale * bondSpace) / (cosHalf + denomAdd)\n )\n return sin > 0 ? [a1, a2] : [a2, a1]\n}\n\nfunction getBondSingleDownPath(render, hb1, hb2) {\n var a = hb1.p,\n b = hb2.p\n var options = render.options\n var d = b.sub(a)\n var len = d.length() + 0.2\n d = d.normalized()\n var interval = 1.2 * options.lineWidth\n var nlines =\n Math.max(\n Math.floor((len - options.lineWidth) / (options.lineWidth + interval)),\n 0\n ) + 2\n var step = len / (nlines - 1)\n return draw.bondSingleDown(render.paper, hb1, d, nlines, step, options)\n}\n\nfunction getBondSingleEitherPath(render, hb1, hb2) {\n var a = hb1.p,\n b = hb2.p\n var options = render.options\n var d = b.sub(a)\n var len = d.length()\n d = d.normalized()\n var interval = 0.6 * options.lineWidth\n var nlines =\n Math.max(\n Math.floor((len - options.lineWidth) / (options.lineWidth + interval)),\n 0\n ) + 2\n var step = len / (nlines - 0.5)\n return draw.bondSingleEither(render.paper, hb1, d, nlines, step, options)\n}\n\nfunction getBondDoublePath(render, hb1, hb2, bond, shiftA, shiftB) {\n // eslint-disable-line max-params, max-statements\n const cisTrans = bond.b.stereo === Bond.PATTERN.STEREO.CIS_TRANS\n\n const a = hb1.p\n const b = hb2.p\n const n = hb1.norm\n const shift = cisTrans ? 0 : bond.doubleBondShift\n\n const options = render.options\n const bsp = options.bondSpace / 2\n const s1 = bsp + shift * bsp\n const s2 = -bsp + shift * bsp\n\n let a1 = a.addScaled(n, s1)\n let b1 = b.addScaled(n, s1)\n let a2 = a.addScaled(n, s2)\n let b2 = b.addScaled(n, s2)\n\n if (shift > 0) {\n if (shiftA) {\n a1 = a1.addScaled(\n hb1.dir,\n options.bondSpace * getBondLineShift(hb1.rightCos, hb1.rightSin)\n )\n }\n if (shiftB) {\n b1 = b1.addScaled(\n hb1.dir,\n -options.bondSpace * getBondLineShift(hb2.leftCos, hb2.leftSin)\n )\n }\n } else if (shift < 0) {\n if (shiftA) {\n a2 = a2.addScaled(\n hb1.dir,\n options.bondSpace * getBondLineShift(hb1.leftCos, hb1.leftSin)\n )\n }\n if (shiftB) {\n b2 = b2.addScaled(\n hb1.dir,\n -options.bondSpace * getBondLineShift(hb2.rightCos, hb2.rightSin)\n )\n }\n }\n\n return draw.bondDouble(render.paper, a1, a2, b1, b2, cisTrans, options)\n}\n\nfunction getSingleOrDoublePath(render, hb1, hb2) {\n var a = hb1.p,\n b = hb2.p\n var options = render.options\n\n var nSect =\n (Vec2.dist(a, b) / (options.bondSpace + options.lineWidth)).toFixed() - 0\n if (!(nSect & 1)) nSect += 1\n return draw.bondSingleOrDouble(render.paper, hb1, hb2, nSect, options)\n}\n\nfunction getBondAromaticPath(render, hb1, hb2, bond, shiftA, shiftB) {\n // eslint-disable-line max-params\n var dashdotPattern = [0.125, 0.125, 0.005, 0.125]\n var mark = null,\n dash = null\n var options = render.options\n var bondShift = bond.doubleBondShift\n\n if (bond.b.type === Bond.PATTERN.TYPE.SINGLE_OR_AROMATIC) {\n mark = bondShift > 0 ? 1 : 2\n dash = dashdotPattern.map(v => v * options.scale)\n }\n if (bond.b.type === Bond.PATTERN.TYPE.DOUBLE_OR_AROMATIC) {\n mark = 3\n dash = dashdotPattern.map(v => v * options.scale)\n }\n var paths = getAromaticBondPaths(\n hb1,\n hb2,\n bondShift,\n shiftA,\n shiftB,\n options.bondSpace,\n mark,\n dash\n )\n return draw.bondAromatic(render.paper, paths, bondShift, options)\n}\n\nfunction getAromaticBondPaths(\n hb1,\n hb2,\n shift,\n shiftA,\n shiftB,\n bondSpace,\n mask,\n dash\n) {\n // eslint-disable-line max-params, max-statements\n var a = hb1.p,\n b = hb2.p,\n n = hb1.norm\n var bsp = bondSpace / 2\n var s1 = bsp + shift * bsp,\n s2 = -bsp + shift * bsp\n var a2 = a.addScaled(n, s1)\n var b2 = b.addScaled(n, s1)\n var a3 = a.addScaled(n, s2)\n var b3 = b.addScaled(n, s2)\n if (shift > 0) {\n if (shiftA) {\n a2 = a2.addScaled(\n hb1.dir,\n bondSpace * getBondLineShift(hb1.rightCos, hb1.rightSin)\n )\n }\n if (shiftB) {\n b2 = b2.addScaled(\n hb1.dir,\n -bondSpace * getBondLineShift(hb2.leftCos, hb2.leftSin)\n )\n }\n } else if (shift < 0) {\n if (shiftA) {\n a3 = a3.addScaled(\n hb1.dir,\n bondSpace * getBondLineShift(hb1.leftCos, hb1.leftSin)\n )\n }\n if (shiftB) {\n b3 = b3.addScaled(\n hb1.dir,\n -bondSpace * getBondLineShift(hb2.rightCos, hb2.rightSin)\n )\n }\n }\n return draw.aromaticBondPaths(a2, a3, b2, b3, mask, dash)\n}\n\nfunction getReactingCenterPath(render, bond, hb1, hb2) {\n // eslint-disable-line max-statements\n var a = hb1.p,\n b = hb2.p\n var c = b.add(a).scaled(0.5)\n var d = b.sub(a).normalized()\n var n = d.rotateSC(1, 0)\n\n var p = []\n\n var lw = render.options.lineWidth,\n bs = render.options.bondSpace / 2\n var alongIntRc = lw, // half interval along for CENTER\n alongIntMadeBroken = 2 * lw, // half interval between along for MADE_OR_BROKEN\n alongSz = 1.5 * bs, // half size along for CENTER\n acrossInt = 1.5 * bs, // half interval across for CENTER\n acrossSz = 3.0 * bs, // half size across for all\n tiltTan = 0.2 // tangent of the tilt angle\n\n switch (bond.b.reactingCenterStatus) {\n case Bond.PATTERN.REACTING_CENTER.NOT_CENTER: // X\n p.push(c.addScaled(n, acrossSz).addScaled(d, tiltTan * acrossSz))\n p.push(c.addScaled(n, -acrossSz).addScaled(d, -tiltTan * acrossSz))\n p.push(c.addScaled(n, acrossSz).addScaled(d, -tiltTan * acrossSz))\n p.push(c.addScaled(n, -acrossSz).addScaled(d, tiltTan * acrossSz))\n break\n case Bond.PATTERN.REACTING_CENTER.CENTER: // #\n p.push(\n c\n .addScaled(n, acrossSz)\n .addScaled(d, tiltTan * acrossSz)\n .addScaled(d, alongIntRc)\n )\n p.push(\n c\n .addScaled(n, -acrossSz)\n .addScaled(d, -tiltTan * acrossSz)\n .addScaled(d, alongIntRc)\n )\n p.push(\n c\n .addScaled(n, acrossSz)\n .addScaled(d, tiltTan * acrossSz)\n .addScaled(d, -alongIntRc)\n )\n p.push(\n c\n .addScaled(n, -acrossSz)\n .addScaled(d, -tiltTan * acrossSz)\n .addScaled(d, -alongIntRc)\n )\n p.push(c.addScaled(d, alongSz).addScaled(n, acrossInt))\n p.push(c.addScaled(d, -alongSz).addScaled(n, acrossInt))\n p.push(c.addScaled(d, alongSz).addScaled(n, -acrossInt))\n p.push(c.addScaled(d, -alongSz).addScaled(n, -acrossInt))\n break\n // case Bond.PATTERN.REACTING_CENTER.UNCHANGED: draw a circle\n case Bond.PATTERN.REACTING_CENTER.MADE_OR_BROKEN:\n p.push(c.addScaled(n, acrossSz).addScaled(d, alongIntMadeBroken))\n p.push(c.addScaled(n, -acrossSz).addScaled(d, alongIntMadeBroken))\n p.push(c.addScaled(n, acrossSz).addScaled(d, -alongIntMadeBroken))\n p.push(c.addScaled(n, -acrossSz).addScaled(d, -alongIntMadeBroken))\n break\n case Bond.PATTERN.REACTING_CENTER.ORDER_CHANGED:\n p.push(c.addScaled(n, acrossSz))\n p.push(c.addScaled(n, -acrossSz))\n break\n case Bond.PATTERN.REACTING_CENTER.MADE_OR_BROKEN_AND_CHANGED:\n p.push(c.addScaled(n, acrossSz).addScaled(d, alongIntMadeBroken))\n p.push(c.addScaled(n, -acrossSz).addScaled(d, alongIntMadeBroken))\n p.push(c.addScaled(n, acrossSz).addScaled(d, -alongIntMadeBroken))\n p.push(c.addScaled(n, -acrossSz).addScaled(d, -alongIntMadeBroken))\n p.push(c.addScaled(n, acrossSz))\n p.push(c.addScaled(n, -acrossSz))\n break\n default:\n return null\n }\n return draw.reactingCenter(render.paper, p, render.options)\n}\n\nfunction getTopologyMark(render, bond, hb1, hb2) {\n // eslint-disable-line max-statements\n var options = render.options\n var mark = null\n\n if (bond.b.topology === Bond.PATTERN.TOPOLOGY.RING) mark = 'rng'\n else if (bond.b.topology === Bond.PATTERN.TOPOLOGY.CHAIN) mark = 'chn'\n else return null\n\n var a = hb1.p,\n b = hb2.p\n var c = b.add(a).scaled(0.5)\n var d = b.sub(a).normalized()\n var n = d.rotateSC(1, 0)\n var fixed = options.lineWidth\n if (bond.doubleBondShift > 0) n = n.scaled(-bond.doubleBondShift)\n else if (bond.doubleBondShift == 0) fixed += options.bondSpace / 2\n\n var s = new Vec2(2, 1).scaled(options.bondSpace)\n if (bond.b.type == Bond.PATTERN.TYPE.TRIPLE) fixed += options.bondSpace\n var p = c.add(new Vec2(n.x * (s.x + fixed), n.y * (s.y + fixed)))\n\n return draw.topologyMark(render.paper, p, mark, options)\n}\n\nfunction getIdsPath(bid, paper, hb1, hb2, bondIdxOff, param1, param2, norm) {\n // eslint-disable-line max-params\n var pb = Vec2.lc(hb1.p, param1, hb2.p, param2, norm, bondIdxOff)\n var ipath = paper.text(pb.x, pb.y, bid.toString())\n var irbb = util.relBox(ipath.getBBox())\n draw.recenterText(ipath, irbb)\n return ipath\n}\n/* ----- */\n\nfunction setDoubleBondShift(bond, struct) {\n var loop1, loop2\n loop1 = struct.halfBonds.get(bond.b.hb1).loop\n loop2 = struct.halfBonds.get(bond.b.hb2).loop\n if (loop1 >= 0 && loop2 >= 0) {\n var d1 = struct.loops.get(loop1).dblBonds\n var d2 = struct.loops.get(loop2).dblBonds\n var n1 = struct.loops.get(loop1).hbs.length\n var n2 = struct.loops.get(loop2).hbs.length\n bond.doubleBondShift = selectDoubleBondShift(n1, n2, d1, d2)\n } else if (loop1 >= 0) {\n bond.doubleBondShift = -1\n } else if (loop2 >= 0) {\n bond.doubleBondShift = 1\n } else {\n bond.doubleBondShift = selectDoubleBondShiftChain(struct, bond)\n }\n}\n\nfunction bondRecalc(bond, restruct, options) {\n var render = restruct.render\n var atom1 = restruct.atoms.get(bond.b.begin)\n var atom2 = restruct.atoms.get(bond.b.end)\n var p1 = scale.obj2scaled(atom1.a.pp, render.options)\n var p2 = scale.obj2scaled(atom2.a.pp, render.options)\n var hb1 = restruct.molecule.halfBonds.get(bond.b.hb1)\n var hb2 = restruct.molecule.halfBonds.get(bond.b.hb2)\n hb1.p = shiftBondEnd(atom1, p1, hb1.dir, 2 * options.lineWidth)\n hb2.p = shiftBondEnd(atom2, p2, hb2.dir, 2 * options.lineWidth)\n bond.b.center = Vec2.lc2(atom1.a.pp, 0.5, atom2.a.pp, 0.5)\n bond.b.len = Vec2.dist(p1, p2)\n bond.b.sb = options.lineWidth * 5\n /* eslint-disable no-mixed-operators*/\n bond.b.sa = Math.max(bond.b.sb, bond.b.len / 2 - options.lineWidth * 2)\n /* eslint-enable no-mixed-operators*/\n bond.b.angle = (Math.atan2(hb1.dir.y, hb1.dir.x) * 180) / Math.PI\n}\n\nfunction shiftBondEnd(atom, pos0, dir, margin) {\n var t = 0\n var visel = atom.visel\n for (var k = 0; k < visel.exts.length; ++k) {\n var box = visel.exts[k].translate(pos0)\n t = Math.max(t, util.shiftRayBox(pos0, dir, box))\n }\n if (t > 0) pos0 = pos0.addScaled(dir, t + margin)\n return pos0\n}\n\nfunction selectDoubleBondShift(n1, n2, d1, d2) {\n if (n1 == 6 && n2 != 6 && (d1 > 1 || d2 == 1)) return -1\n if (n2 == 6 && n1 != 6 && (d2 > 1 || d1 == 1)) return 1\n if (n2 * d1 > n1 * d2) return -1\n if (n2 * d1 < n1 * d2) return 1\n if (n2 > n1) return -1\n return 1\n}\n\nfunction selectDoubleBondShiftChain(struct, bond) {\n var hb1 = struct.halfBonds.get(bond.b.hb1)\n var hb2 = struct.halfBonds.get(bond.b.hb2)\n var nLeft = (hb1.leftSin > 0.3 ? 1 : 0) + (hb2.rightSin > 0.3 ? 1 : 0)\n var nRight = (hb2.leftSin > 0.3 ? 1 : 0) + (hb1.rightSin > 0.3 ? 1 : 0)\n if (nLeft > nRight) return -1\n if (nLeft < nRight) return 1\n if ((hb1.leftSin > 0.3 ? 1 : 0) + (hb1.rightSin > 0.3 ? 1 : 0) == 1) return 1\n return 0\n}\n\nexport default ReBond\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport ReObject from './reobject'\nimport Box2Abs from '../../util/box2abs'\nimport draw from '../draw'\nimport util from '../util'\nimport scale from '../../util/scale'\n\nfunction ReRxnPlus(/* chem.RxnPlus*/ plus) {\n this.init('rxnPlus')\n\n this.item = plus\n}\nReRxnPlus.prototype = new ReObject()\nReRxnPlus.isSelectable = function () {\n return true\n}\n\nReRxnPlus.prototype.highlightPath = function (render) {\n var p = scale.obj2scaled(this.item.pp, render.options)\n var s = render.options.scale\n /* eslint-disable no-mixed-operators*/\n return render.paper.rect(p.x - s / 4, p.y - s / 4, s / 2, s / 2, s / 8)\n /* eslint-enable no-mixed-operators*/\n}\n\nReRxnPlus.prototype.drawHighlight = function (render) {\n var ret = this.highlightPath(render).attr(render.options.highlightStyle)\n render.ctab.addReObjectPath('highlighting', this.visel, ret)\n return ret\n}\n\nReRxnPlus.prototype.makeSelectionPlate = function (restruct, paper, styles) {\n // TODO [MK] review parameters\n return this.highlightPath(restruct.render).attr(styles.selectionStyle)\n}\n\nReRxnPlus.prototype.show = function (restruct, id, options) {\n var render = restruct.render\n var centre = scale.obj2scaled(this.item.pp, options)\n var path = draw.plus(render.paper, centre, options)\n var offset = options.offset\n if (offset != null) path.translateAbs(offset.x, offset.y)\n this.visel.add(path, Box2Abs.fromRelBox(util.relBox(path.getBBox())))\n}\n\nexport default ReRxnPlus\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport ReObject from './reobject'\nimport Box2Abs from '../../util/box2abs'\nimport Vec2 from '../../util/vec2'\nimport draw from '../draw'\nimport util from '../util'\nimport scale from '../../util/scale'\n\nfunction ReRxnArrow(/* chem.RxnArrow*/ arrow) {\n this.init('rxnArrow')\n\n this.item = arrow\n}\nReRxnArrow.prototype = new ReObject()\nReRxnArrow.isSelectable = function () {\n return true\n}\n\nReRxnArrow.prototype.highlightPath = function (render) {\n var p = scale.obj2scaled(this.item.pp, render.options)\n var s = render.options.scale\n return render.paper.rect(p.x - s, p.y - s / 4, 2 * s, s / 2, s / 8) // eslint-disable-line no-mixed-operators\n}\n\nReRxnArrow.prototype.drawHighlight = function (render) {\n var ret = this.highlightPath(render).attr(render.options.highlightStyle)\n render.ctab.addReObjectPath('highlighting', this.visel, ret)\n return ret\n}\n\nReRxnArrow.prototype.makeSelectionPlate = function (restruct, paper, styles) {\n return this.highlightPath(restruct.render).attr(styles.selectionStyle)\n}\n\nReRxnArrow.prototype.show = function (restruct, id, options) {\n var render = restruct.render\n var centre = scale.obj2scaled(this.item.pp, options)\n var path = draw.arrow(\n render.paper,\n new Vec2(centre.x - options.scale, centre.y),\n new Vec2(centre.x + options.scale, centre.y),\n options\n )\n var offset = options.offset\n if (offset != null) path.translateAbs(offset.x, offset.y)\n this.visel.add(path, Box2Abs.fromRelBox(util.relBox(path.getBBox())))\n}\n\nexport default ReRxnArrow\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport Box2Abs from '../../util/box2abs'\nimport Vec2 from '../../util/vec2'\nimport ReObject from './reobject'\nimport scale from '../../util/scale'\n\nfunction ReFrag(/* Struct.Fragment */ frag) {\n this.init('frag')\n this.item = frag\n}\n\nReFrag.prototype = new ReObject()\n\nReFrag.isSelectable = function () {\n return false\n}\n\nReFrag.prototype.fragGetAtoms = function (restruct, fid) {\n return Array.from(restruct.atoms.keys()).filter(\n aid => restruct.atoms.get(aid).a.fragment === fid\n )\n}\n\nReFrag.prototype.fragGetBonds = function (restruct, fid) {\n return Array.from(restruct.bonds.keys()).filter(bid => {\n const bond = restruct.bonds.get(bid).b\n\n const firstFrag = restruct.atoms.get(bond.begin).a.fragment\n const secondFrag = restruct.atoms.get(bond.end).a.fragment\n\n return firstFrag === fid && secondFrag === fid\n })\n}\n\nReFrag.prototype.calcBBox = function (restruct, fid, render) {\n // TODO need to review parameter list\n var ret\n restruct.atoms.forEach(atom => {\n if (atom.a.fragment !== fid) return\n\n // TODO ReObject.calcBBox to be used instead\n let bba = atom.visel.boundingBox\n if (!bba) {\n bba = new Box2Abs(atom.a.pp, atom.a.pp)\n const ext = new Vec2(0.05 * 3, 0.05 * 3)\n bba = bba.extend(ext, ext)\n } else {\n if (!render) render = global._ui_editor.render // eslint-disable-line\n bba = bba\n .translate((render.options.offset || new Vec2()).negated())\n .transform(scale.scaled2obj, render.options)\n }\n ret = ret ? Box2Abs.union(ret, bba) : bba\n })\n\n return ret\n}\n\n// TODO need to review parameter list\nReFrag.prototype._draw = function (render, fid, attrs) {\n // eslint-disable-line no-underscore-dangle\n const bb = this.calcBBox(render.ctab, fid, render)\n\n if (bb) {\n const p0 = scale.obj2scaled(new Vec2(bb.p0.x, bb.p0.y), render.options)\n const p1 = scale.obj2scaled(new Vec2(bb.p1.x, bb.p1.y), render.options)\n return render.paper\n .rect(p0.x, p0.y, p1.x - p0.x, p1.y - p0.y, 0)\n .attr(attrs)\n }\n\n // TODO abnormal situation, empty fragments must be destroyed by tools\n return console.assert(null, 'Empty fragment')\n}\n\nReFrag.prototype.draw = function (render) {\n // eslint-disable-line no-unused-vars\n return null // this._draw(render, fid, { 'stroke' : 'lightgray' }); // [RB] for debugging only\n}\n\nReFrag.prototype.drawHighlight = function (render) {\n // eslint-disable-line no-unused-vars\n // Do nothing. This method shouldn't actually be called.\n}\n\nReFrag.prototype.setHighlight = function (highLight, render) {\n let fid = render.ctab.frags.keyOf(this)\n\n if (!fid && fid !== 0) {\n console.warn('Fragment does not belong to the render')\n return\n }\n\n fid = parseInt(fid, 10)\n\n render.ctab.atoms.forEach(atom => {\n if (atom.a.fragment === fid) atom.setHighlight(highLight, render)\n })\n\n render.ctab.bonds.forEach(bond => {\n if (render.ctab.atoms.get(bond.b.begin).a.fragment === fid)\n bond.setHighlight(highLight, render)\n })\n}\n\nexport default ReFrag\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport Box2Abs from '../../util/box2abs'\nimport Vec2 from '../../util/vec2'\nimport util from '../util'\nimport draw from '../draw'\nimport scale from '../../util/scale'\n\nimport ReObject from './reobject'\n\nvar BORDER_EXT = new Vec2(0.05 * 3, 0.05 * 3)\n\nfunction ReRGroup(/* RGroup*/ rgroup) {\n this.init('rgroup')\n\n this.labelBox = null\n this.item = rgroup\n}\nReRGroup.prototype = new ReObject()\nReRGroup.isSelectable = function () {\n return false\n}\n\nReRGroup.prototype.getAtoms = function (render) {\n var ret = []\n this.item.frags.forEach(fid => {\n ret = ret.concat(render.ctab.frags.get(fid).fragGetAtoms(render.ctab, fid))\n })\n return ret\n}\n\nReRGroup.prototype.getBonds = function (render) {\n var ret = []\n this.item.frags.forEach(fid => {\n ret = ret.concat(render.ctab.frags.get(fid).fragGetBonds(render.ctab, fid))\n })\n return ret\n}\n\nReRGroup.prototype.calcBBox = function (render) {\n let ret = null\n this.item.frags.forEach(fid => {\n const bbf = render.ctab.frags.get(fid).calcBBox(render.ctab, fid, render)\n if (bbf) ret = ret ? Box2Abs.union(ret, bbf) : bbf\n })\n\n if (ret) ret = ret.extend(BORDER_EXT, BORDER_EXT)\n\n return ret\n}\n\nfunction rGroupdrawBrackets(set, render, bb, d) {\n d = scale.obj2scaled(d || new Vec2(1, 0), render.options)\n var bracketWidth = Math.min(0.25, bb.sz().x * 0.3)\n var bracketHeight = bb.p1.y - bb.p0.y\n var cy = 0.5 * (bb.p1.y + bb.p0.y)\n\n var leftBracket = draw.bracket(\n render.paper,\n d.negated(),\n d.negated().rotateSC(1, 0),\n scale.obj2scaled(new Vec2(bb.p0.x, cy), render.options),\n bracketWidth,\n bracketHeight,\n render.options\n )\n\n var rightBracket = draw.bracket(\n render.paper,\n d,\n d.rotateSC(1, 0),\n scale.obj2scaled(new Vec2(bb.p1.x, cy), render.options),\n bracketWidth,\n bracketHeight,\n render.options\n )\n\n return set.push(leftBracket, rightBracket)\n}\n\n// TODO need to review parameter list\nReRGroup.prototype.draw = function (render, options) {\n // eslint-disable-line max-statements\n const bb = this.calcBBox(render)\n\n if (!bb) {\n console.error(\n 'Abnormal situation, empty fragments must be destroyed by tools'\n )\n return {}\n }\n\n const ret = { data: [] }\n const p0 = scale.obj2scaled(bb.p0, options)\n const p1 = scale.obj2scaled(bb.p1, options)\n const brackets = render.paper.set()\n\n rGroupdrawBrackets(brackets, render, bb) // eslint-disable-line new-cap\n\n ret.data.push(brackets)\n const key = render.ctab.rgroups.keyOf(this)\n const labelSet = render.paper.set()\n const label = render.paper\n .text(p0.x, (p0.y + p1.y) / 2, 'R' + key + '=')\n .attr({\n font: options.font,\n 'font-size': options.fontRLabel,\n fill: 'black'\n })\n\n const labelBox = util.relBox(label.getBBox())\n label.translateAbs(-labelBox.width / 2 - options.lineWidth, 0)\n\n labelSet.push(label)\n const logicStyle = {\n font: options.font,\n 'font-size': options.fontRLogic,\n fill: 'black'\n }\n\n const logic = [rLogicToString(key, this.item)]\n\n let shift = labelBox.height / 2 + options.lineWidth / 2\n for (let i = 0; i < logic.length; ++i) {\n const logicPath = render.paper\n .text(p0.x, (p0.y + p1.y) / 2, logic[i])\n .attr(logicStyle)\n const logicBox = util.relBox(logicPath.getBBox())\n shift += logicBox.height / 2\n logicPath.translateAbs(-logicBox.width / 2 - 6 * options.lineWidth, shift)\n shift += logicBox.height / 2 + options.lineWidth / 2\n ret.data.push(logicPath)\n labelSet.push(logicPath)\n }\n\n ret.data.push(label)\n this.labelBox = Box2Abs.fromRelBox(labelSet.getBBox()).transform(\n scale.scaled2obj,\n render.options\n )\n return ret\n}\n\nfunction rLogicToString(id, rLogic) {\n const ifThen = rLogic.ifthen > 0 ? 'IF ' : ''\n\n const rangeExists =\n rLogic.range.startsWith('>') ||\n rLogic.range.startsWith('<') ||\n rLogic.range.startsWith('=')\n\n let range = null\n if (rLogic.range.length > 0)\n range = rangeExists ? rLogic.range : '=' + rLogic.range\n else range = '>0'\n\n const restH = rLogic.resth ? ' (RestH)' : ''\n const nextRg = rLogic.ifthen > 0 ? '\\nTHEN R' + rLogic.ifthen.toString() : ''\n\n return `${ifThen}R${id.toString()}${range}${restH}${nextRg}`\n}\n\n// TODO need to review parameter list\nReRGroup.prototype._draw = function (render, rgid, attrs) {\n // eslint-disable-line no-underscore-dangle\n const bb = this.getVBoxObj(render).extend(BORDER_EXT, BORDER_EXT) // eslint-disable-line no-underscore-dangle\n\n if (!bb) return null\n\n const p0 = scale.obj2scaled(bb.p0, render.options)\n const p1 = scale.obj2scaled(bb.p1, render.options)\n return render.paper.rect(p0.x, p0.y, p1.x - p0.x, p1.y - p0.y, 0).attr(attrs)\n}\n\nReRGroup.prototype.drawHighlight = function (render) {\n const rgid = render.ctab.rgroups.keyOf(this)\n\n if (!rgid) {\n console.error('Abnormal situation, fragment does not belong to the render')\n return null\n }\n\n const ret = this._draw(\n render,\n rgid,\n render.options.highlightStyle /* { 'fill' : 'red' }*/\n ) // eslint-disable-line no-underscore-dangle\n render.ctab.addReObjectPath('highlighting', this.visel, ret)\n\n this.item.frags.forEach((fnum, fid) => {\n render.ctab.frags.get(fid).drawHighlight(render)\n })\n\n return ret\n}\n\nReRGroup.prototype.show = function (restruct, id, options) {\n const drawing = this.draw(restruct.render, options)\n\n Object.keys(drawing).forEach(group => {\n while (drawing[group].length > 0)\n restruct.addReObjectPath(\n group,\n this.visel,\n drawing[group].shift(),\n null,\n true\n )\n })\n // TODO rgroup selection & highlighting\n}\n\nexport default ReRGroup\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport ReObject from './reobject'\nimport scale from '../../util/scale'\n\nfunction ReDataSGroupData(sgroup) {\n this.init('sgroupData')\n\n this.sgroup = sgroup\n}\n\nReDataSGroupData.prototype = new ReObject()\nReDataSGroupData.isSelectable = function () {\n return true\n}\n\nReDataSGroupData.prototype.highlightPath = function (render) {\n var box = this.sgroup.dataArea\n var p0 = scale.obj2scaled(box.p0, render.options)\n var sz = scale.obj2scaled(box.p1, render.options).sub(p0)\n return render.paper.rect(p0.x, p0.y, sz.x, sz.y)\n}\n\nReDataSGroupData.prototype.drawHighlight = function (render) {\n var ret = this.highlightPath(render).attr(render.options.highlightStyle)\n render.ctab.addReObjectPath('highlighting', this.visel, ret)\n return ret\n}\n\nReDataSGroupData.prototype.makeSelectionPlate = function (\n restruct,\n paper,\n styles\n) {\n // TODO [MK] review parameters\n return this.highlightPath(restruct.render).attr(styles.selectionStyle)\n}\n\nexport default ReDataSGroupData\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport Box2Abs from '../../util/box2abs'\nimport Vec2 from '../../util/vec2'\nimport scale from '../../util/scale'\nimport ReObject from './reobject'\nimport { Fragment } from '../../chem/struct'\n\nfunction ReEnhancedFlag(flag, pos) {\n this.init('enhancedFlag')\n\n this.flag = flag\n this.pp = pos\n}\nReEnhancedFlag.prototype = new ReObject()\nReEnhancedFlag.isSelectable = function () {\n return true\n}\n\nReEnhancedFlag.prototype.highlightPath = function (render) {\n var box = Box2Abs.fromRelBox(this.path.getBBox())\n var sz = box.p1.sub(box.p0)\n var p0 = box.p0.sub(render.options.offset)\n return render.paper.rect(p0.x, p0.y, sz.x, sz.y)\n}\n\nReEnhancedFlag.prototype.drawHighlight = function (render) {\n if (!this.path) return null\n var ret = this.highlightPath(render).attr(render.options.highlightStyle)\n render.ctab.addReObjectPath('highlighting', this.visel, ret)\n return ret\n}\n\nReEnhancedFlag.prototype.makeSelectionPlate = function (\n restruct,\n paper,\n options\n) {\n if (!this.path) return null\n return this.highlightPath(restruct.render).attr(options.selectionStyle)\n}\n\nReEnhancedFlag.prototype.show = function (restruct, id, options) {\n const render = restruct.render\n if (!this.flag) return\n\n if (!this.pp) {\n const bb = restruct.molecule.getFragment(id).getCoordBoundingBox()\n this.pp = new Vec2(bb.max.x, bb.min.y - 1)\n }\n\n const paper = render.paper\n const ps = scale.obj2scaled(this.pp, options)\n this.path = paper\n .text(ps.x, ps.y, Fragment.STEREO_FLAG[this.flag] || '')\n .attr({\n font: options.font,\n 'font-size': options.fontsz,\n fill: '#000'\n })\n render.ctab.addReObjectPath('data', this.visel, this.path, null, true)\n}\n\nexport default ReEnhancedFlag\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport Box2Abs from '../../util/box2abs'\nimport Vec2 from '../../util/vec2'\nimport Pile from '../../util/pile'\nimport util from '../util'\nimport scale from '../../util/scale'\n\nimport { SGroup } from '../../chem/struct'\nimport draw from '../draw'\n\nimport ReDataSGroupData from './redatasgroupdata'\nimport ReObject from './reobject'\n\nconst tfx = util.tfx\n\nfunction ReSGroup(sgroup) {\n this.init('sgroup')\n\n this.item = sgroup\n}\nReSGroup.prototype = new ReObject()\nReSGroup.isSelectable = function () {\n return false\n}\n\nReSGroup.prototype.draw = function (remol, sgroup) {\n var render = remol.render\n var set = render.paper.set()\n var inBonds = [],\n xBonds = []\n var atomSet = new Pile(sgroup.atoms)\n SGroup.getCrossBonds(inBonds, xBonds, remol.molecule, atomSet)\n bracketPos(sgroup, render, remol.molecule, xBonds)\n var bb = sgroup.bracketBox\n var d = sgroup.bracketDir\n sgroup.areas = [bb]\n\n switch (sgroup.type) {\n case 'MUL':\n SGroupdrawBrackets(\n set,\n render,\n sgroup,\n xBonds,\n atomSet,\n bb,\n d,\n sgroup.data.mul\n )\n break\n case 'SRU':\n var connectivity = sgroup.data.connectivity || 'eu'\n if (connectivity === 'ht') connectivity = ''\n var subscript = sgroup.data.subscript || 'n'\n SGroupdrawBrackets(\n set,\n render,\n sgroup,\n xBonds,\n atomSet,\n bb,\n d,\n subscript,\n connectivity\n )\n break\n case 'SUP':\n SGroupdrawBrackets(\n set,\n render,\n sgroup,\n xBonds,\n atomSet,\n bb,\n d,\n sgroup.data.name,\n null,\n { 'font-style': 'italic' }\n )\n break\n case 'GEN':\n SGroupdrawBrackets(set, render, sgroup, xBonds, atomSet, bb, d)\n break\n case 'DAT':\n set = drawGroupDat(remol, sgroup)\n break\n default:\n break\n }\n return set\n}\n\nfunction SGroupdrawBrackets(\n set,\n render,\n sg,\n xbonds,\n atomSet,\n bb,\n d,\n lowerIndexText,\n upperIndexText,\n indexAttribute\n) {\n // eslint-disable-line max-params\n var brackets = getBracketParameters(\n render.ctab.molecule,\n xbonds,\n atomSet,\n bb,\n d,\n render,\n sg.id\n )\n var ir = -1\n for (var i = 0; i < brackets.length; ++i) {\n var bracket = brackets[i]\n var path = draw.bracket(\n render.paper,\n scale.obj2scaled(bracket.d, render.options),\n scale.obj2scaled(bracket.n, render.options),\n scale.obj2scaled(bracket.c, render.options),\n bracket.w,\n bracket.h,\n render.options\n )\n set.push(path)\n if (\n ir < 0 ||\n brackets[ir].d.x < bracket.d.x ||\n (brackets[ir].d.x == bracket.d.x && brackets[ir].d.y > bracket.d.y)\n )\n ir = i\n }\n var bracketR = brackets[ir]\n function renderIndex(text, shift) {\n var indexPos = scale.obj2scaled(\n bracketR.c.addScaled(bracketR.n, shift * bracketR.h),\n render.options\n )\n var indexPath = render.paper.text(indexPos.x, indexPos.y, text).attr({\n font: render.options.font,\n 'font-size': render.options.fontszsub\n })\n if (indexAttribute) indexPath.attr(indexAttribute)\n var indexBox = Box2Abs.fromRelBox(util.relBox(indexPath.getBBox()))\n var t =\n Math.max(util.shiftRayBox(indexPos, bracketR.d.negated(), indexBox), 3) +\n 2\n indexPath.translateAbs(t * bracketR.d.x, t * bracketR.d.y)\n set.push(indexPath)\n }\n if (lowerIndexText) renderIndex(lowerIndexText, 0.5)\n if (upperIndexText) renderIndex(upperIndexText, -0.5)\n}\n\nfunction showValue(paper, pos, sg, options) {\n var text = paper.text(pos.x, pos.y, sg.data.fieldValue).attr({\n font: options.font,\n 'font-size': options.fontsz\n })\n var box = text.getBBox()\n var rect = paper.rect(\n box.x - 1,\n box.y - 1,\n box.width + 2,\n box.height + 2,\n 3,\n 3\n )\n rect = sg.selected\n ? rect.attr(options.selectionStyle)\n : rect.attr({ fill: '#fff', stroke: '#fff' })\n var st = paper.set()\n st.push(rect, text.toFront())\n return st\n}\n\nfunction drawGroupDat(restruct, sgroup) {\n const render = restruct.render\n\n // NB: we did not pass xbonds parameter to the backetPos method above,\n // so the result will be in the regular coordinate system\n\n bracketPos(sgroup, render, restruct.molecule)\n sgroup.areas = sgroup.bracketBox ? [sgroup.bracketBox] : []\n\n if (sgroup.pp === null) sgroup.pp = definePP(restruct, sgroup)\n\n return sgroup.data.attached\n ? drawAttachedDat(restruct, sgroup)\n : drawAbsoluteDat(restruct, sgroup)\n}\n\nfunction definePP(restruct, sgroup) {\n let topLeftPoint = sgroup.bracketBox.p1.add(new Vec2(0.5, 0.5))\n const sgroups = Array.from(restruct.molecule.sgroups.values())\n for (let i = 0; i < restruct.molecule.sgroups.size; ++i) {\n if (!descriptorIntersects(sgroups, topLeftPoint)) break\n\n topLeftPoint = topLeftPoint.add(new Vec2(0, 0.5))\n }\n\n return topLeftPoint\n}\n\nfunction descriptorIntersects(sgroups, topLeftPoint) {\n return sgroups.some(sg => {\n if (!sg.pp) return false\n\n const sgBottomRightPoint = sg.pp.add(new Vec2(0.5, 0.5))\n const bottomRightPoint = topLeftPoint.add(new Vec2(0.5, 0.5))\n\n return Box2Abs.segmentIntersection(\n sg.pp,\n sgBottomRightPoint,\n topLeftPoint,\n bottomRightPoint\n )\n })\n}\n\nfunction drawAbsoluteDat(restruct, sgroup) {\n const render = restruct.render\n const options = render.options\n const paper = render.paper\n const set = paper.set()\n\n const ps = sgroup.pp.scaled(options.scale)\n const name = showValue(paper, ps, sgroup, options)\n const box = util.relBox(name.getBBox())\n\n name.translateAbs(0.5 * box.width, -0.5 * box.height)\n set.push(name)\n\n const sbox = Box2Abs.fromRelBox(util.relBox(name.getBBox()))\n sgroup.dataArea = sbox.transform(scale.scaled2obj, render.options)\n\n if (!restruct.sgroupData.has(sgroup.id))\n restruct.sgroupData.set(sgroup.id, new ReDataSGroupData(sgroup))\n\n return set\n}\n\nfunction drawAttachedDat(restruct, sgroup) {\n const render = restruct.render\n const options = render.options\n const paper = render.paper\n const set = paper.set()\n\n SGroup.getAtoms(restruct, sgroup).forEach(aid => {\n const atom = restruct.atoms.get(aid)\n const p = scale.obj2scaled(atom.a.pp, options)\n const bb = atom.visel.boundingBox\n\n if (bb !== null) p.x = Math.max(p.x, bb.p1.x)\n\n p.x += options.lineWidth // shift a bit to the right\n\n const nameI = showValue(paper, p, sgroup, options)\n const boxI = util.relBox(nameI.getBBox())\n\n nameI.translateAbs(0.5 * boxI.width, -0.3 * boxI.height)\n set.push(nameI)\n\n let sboxI = Box2Abs.fromRelBox(util.relBox(nameI.getBBox()))\n sboxI = sboxI.transform(scale.scaled2obj, render.options)\n sgroup.areas.push(sboxI)\n })\n\n return set\n}\n\nfunction bracketPos(sg, render, mol, xbonds) {\n // eslint-disable-line max-statements\n var atoms = sg.atoms\n\n if (!xbonds || xbonds.length !== 2) {\n sg.bracketDir = new Vec2(1, 0)\n } else {\n var p1 = mol.bonds.get(xbonds[0]).getCenter(mol)\n var p2 = mol.bonds.get(xbonds[1]).getCenter(mol)\n sg.bracketDir = Vec2.diff(p2, p1).normalized()\n }\n var d = sg.bracketDir\n\n var bb = null\n var contentBoxes = []\n\n atoms.forEach(aid => {\n var atom = mol.atoms.get(aid)\n var bba = render ? render.ctab.atoms.get(aid).visel.boundingBox : null\n if (!bba) {\n var pos = new Vec2(atom.pp)\n var ext = new Vec2(0.05 * 3, 0.05 * 3)\n bba = new Box2Abs(pos, pos).extend(ext, ext)\n } else {\n bba = bba\n .translate((render.options.offset || new Vec2()).negated())\n .transform(scale.scaled2obj, render.options)\n }\n contentBoxes.push(bba)\n })\n mol.sGroupForest.children.get(sg.id).forEach(sgid => {\n var bba = render.ctab.sgroups.get(sgid).visel.boundingBox\n bba = bba\n .translate((render.options.offset || new Vec2()).negated())\n .transform(scale.scaled2obj, render.options)\n contentBoxes.push(bba)\n })\n contentBoxes.forEach(bba => {\n var bbb = null\n ;[bba.p0.x, bba.p1.x].forEach(x => {\n ;[bba.p0.y, bba.p1.y].forEach(y => {\n var v = new Vec2(x, y)\n var p = new Vec2(Vec2.dot(v, d), Vec2.dot(v, d.rotateSC(1, 0)))\n bbb = bbb === null ? new Box2Abs(p, p) : bbb.include(p)\n })\n })\n bb = bb === null ? bbb : Box2Abs.union(bb, bbb)\n })\n var vext = new Vec2(0.2, 0.4)\n if (bb !== null) bb = bb.extend(vext, vext)\n sg.bracketBox = bb\n}\n\nfunction getBracketParameters(mol, xbonds, atomSet, bb, d, render, id) {\n // eslint-disable-line max-params\n function BracketParams(c, d, w, h) {\n this.c = c\n this.d = d\n this.n = d.rotateSC(1, 0)\n this.w = w\n this.h = h\n }\n var brackets = []\n var n = d.rotateSC(1, 0)\n if (xbonds.length < 2) {\n ;(function () {\n d = d || new Vec2(1, 0)\n n = n || d.rotateSC(1, 0)\n var bracketWidth = Math.min(0.25, bb.sz().x * 0.3)\n var cl = Vec2.lc2(d, bb.p0.x, n, 0.5 * (bb.p0.y + bb.p1.y))\n var cr = Vec2.lc2(d, bb.p1.x, n, 0.5 * (bb.p0.y + bb.p1.y))\n var bracketHeight = bb.sz().y\n\n brackets.push(\n new BracketParams(cl, d.negated(), bracketWidth, bracketHeight),\n new BracketParams(cr, d, bracketWidth, bracketHeight)\n )\n })()\n } else if (xbonds.length === 2) {\n ;(function () {\n // eslint-disable-line max-statements\n var b1 = mol.bonds.get(xbonds[0])\n var b2 = mol.bonds.get(xbonds[1])\n var cl0 = b1.getCenter(mol)\n var cr0 = b2.getCenter(mol)\n var tl = -1\n var tr = -1\n var tt = -1\n var tb = -1\n var cc = Vec2.centre(cl0, cr0)\n var dr = Vec2.diff(cr0, cl0).normalized()\n var dl = dr.negated()\n var dt = dr.rotateSC(1, 0)\n var db = dt.negated()\n\n mol.sGroupForest.children.get(id).forEach(sgid => {\n var bba = render.ctab.sgroups.get(sgid).visel.boundingBox\n bba = bba\n .translate((render.options.offset || new Vec2()).negated())\n .transform(scale.scaled2obj, render.options)\n tl = Math.max(tl, util.shiftRayBox(cl0, dl, bba))\n tr = Math.max(tr, util.shiftRayBox(cr0, dr, bba))\n tt = Math.max(tt, util.shiftRayBox(cc, dt, bba))\n tb = Math.max(tb, util.shiftRayBox(cc, db, bba))\n }, this)\n tl = Math.max(tl + 0.2, 0)\n tr = Math.max(tr + 0.2, 0)\n tt = Math.max(Math.max(tt, tb) + 0.1, 0)\n var bracketWidth = 0.25\n var bracketHeight = 1.5 + tt\n brackets.push(\n new BracketParams(\n cl0.addScaled(dl, tl),\n dl,\n bracketWidth,\n bracketHeight\n ),\n new BracketParams(\n cr0.addScaled(dr, tr),\n dr,\n bracketWidth,\n bracketHeight\n )\n )\n })()\n } else {\n ;(function () {\n for (var i = 0; i < xbonds.length; ++i) {\n var b = mol.bonds.get(xbonds[i])\n var c = b.getCenter(mol)\n var d = atomSet.has(b.begin) ? b.getDir(mol) : b.getDir(mol).negated()\n brackets.push(new BracketParams(c, d, 0.2, 1.0))\n }\n })()\n }\n return brackets\n}\n\nReSGroup.prototype.drawHighlight = function (render) {\n // eslint-disable-line max-statements\n var options = render.options\n var paper = render.paper\n var sg = this.item\n var bb = sg.bracketBox.transform(scale.obj2scaled, options)\n var lw = options.lineWidth\n var vext = new Vec2(lw * 4, lw * 6)\n bb = bb.extend(vext, vext)\n var d = sg.bracketDir,\n n = d.rotateSC(1, 0)\n var a0 = Vec2.lc2(d, bb.p0.x, n, bb.p0.y)\n var a1 = Vec2.lc2(d, bb.p0.x, n, bb.p1.y)\n var b0 = Vec2.lc2(d, bb.p1.x, n, bb.p0.y)\n var b1 = Vec2.lc2(d, bb.p1.x, n, bb.p1.y)\n\n var set = paper.set()\n sg.highlighting = paper\n .path(\n 'M{0},{1}L{2},{3}L{4},{5}L{6},{7}L{0},{1}',\n tfx(a0.x),\n tfx(a0.y),\n tfx(a1.x),\n tfx(a1.y),\n tfx(b1.x),\n tfx(b1.y),\n tfx(b0.x),\n tfx(b0.y)\n )\n .attr(options.highlightStyle)\n set.push(sg.highlighting)\n\n SGroup.getAtoms(render.ctab.molecule, sg).forEach(aid => {\n set.push(render.ctab.atoms.get(aid).makeHighlightPlate(render))\n }, this)\n SGroup.getBonds(render.ctab.molecule, sg).forEach(bid => {\n set.push(render.ctab.bonds.get(bid).makeHighlightPlate(render))\n }, this)\n render.ctab.addReObjectPath('highlighting', this.visel, set)\n}\n\nReSGroup.prototype.show = function (restruct) {\n var render = restruct.render\n var sgroup = this.item\n if (sgroup.data.fieldName !== 'MRV_IMPLICIT_H') {\n var remol = render.ctab\n var path = this.draw(remol, sgroup)\n restruct.addReObjectPath('data', this.visel, path, null, true)\n this.setHighlight(this.highlight, render) // TODO: fix this\n }\n}\n\nexport default ReSGroup\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport Vec2 from '../../util/vec2'\nimport Visel from './visel'\nimport ReObject from './reobject'\nimport scale from '../../util/scale'\nimport util from '../util'\nimport { Bond } from '../../chem/struct'\n\nconst tfx = util.tfx\n\nfunction ReLoop(loop) {\n this.loop = loop\n this.visel = new Visel('loop')\n this.centre = new Vec2()\n this.radius = new Vec2()\n}\nReLoop.prototype = new ReObject()\nReLoop.isSelectable = function () {\n return false\n}\n\nReLoop.prototype.show = function (restruct, rlid, options) {\n // eslint-disable-line max-statements\n var render = restruct.render\n var paper = render.paper\n var molecule = restruct.molecule\n var loop = this.loop\n this.centre = new Vec2()\n loop.hbs.forEach(hbid => {\n var hb = molecule.halfBonds.get(hbid)\n var bond = restruct.bonds.get(hb.bid)\n var apos = scale.obj2scaled(restruct.atoms.get(hb.begin).a.pp, options)\n if (bond.b.type !== Bond.PATTERN.TYPE.AROMATIC) loop.aromatic = false\n this.centre.add_(apos) // eslint-disable-line no-underscore-dangle\n })\n loop.convex = true\n for (var k = 0; k < this.loop.hbs.length; ++k) {\n var hba = molecule.halfBonds.get(loop.hbs[k])\n var hbb = molecule.halfBonds.get(loop.hbs[(k + 1) % loop.hbs.length])\n var angle = Math.atan2(\n Vec2.cross(hba.dir, hbb.dir),\n Vec2.dot(hba.dir, hbb.dir)\n )\n if (angle > 0) loop.convex = false\n }\n\n this.centre = this.centre.scaled(1.0 / loop.hbs.length)\n this.radius = -1\n loop.hbs.forEach(hbid => {\n var hb = molecule.halfBonds.get(hbid)\n var apos = scale.obj2scaled(restruct.atoms.get(hb.begin).a.pp, options)\n var bpos = scale.obj2scaled(restruct.atoms.get(hb.end).a.pp, options)\n var n = Vec2.diff(bpos, apos).rotateSC(1, 0).normalized()\n var dist = Vec2.dot(Vec2.diff(apos, this.centre), n)\n this.radius = this.radius < 0 ? dist : Math.min(this.radius, dist)\n })\n this.radius *= 0.7\n if (!loop.aromatic) return\n var path = null\n if (loop.convex && options.aromaticCircle) {\n path = paper.circle(this.centre.x, this.centre.y, this.radius).attr({\n stroke: '#000',\n 'stroke-width': options.lineattr['stroke-width']\n })\n } else {\n var pathStr = ''\n for (k = 0; k < loop.hbs.length; ++k) {\n hba = molecule.halfBonds.get(loop.hbs[k])\n hbb = molecule.halfBonds.get(loop.hbs[(k + 1) % loop.hbs.length])\n angle = Math.atan2(\n Vec2.cross(hba.dir, hbb.dir),\n Vec2.dot(hba.dir, hbb.dir)\n )\n var halfAngle = (Math.PI - angle) / 2\n var dir = hbb.dir.rotate(halfAngle)\n var pi = scale.obj2scaled(restruct.atoms.get(hbb.begin).a.pp, options)\n var sin = Math.sin(halfAngle)\n var minSin = 0.1\n if (Math.abs(sin) < minSin) sin = (sin * minSin) / Math.abs(sin)\n var offset = options.bondSpace / sin\n var qi = pi.addScaled(dir, -offset)\n pathStr += k === 0 ? 'M' : 'L'\n pathStr += tfx(qi.x) + ',' + tfx(qi.y)\n }\n pathStr += 'Z'\n path = paper.path(pathStr).attr({\n stroke: '#000',\n 'stroke-width': options.lineattr['stroke-width'],\n 'stroke-dasharray': '- '\n })\n }\n restruct.addReObjectPath('data', this.visel, path, null, true)\n}\n\nReLoop.prototype.isValid = function (struct, rlid) {\n const halfBonds = struct.halfBonds\n return this.loop.hbs.every(\n hbid => halfBonds.has(hbid) && halfBonds.get(hbid).loop === rlid\n )\n}\n\nexport default ReLoop\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport ReObject from './reobject'\nimport Box2Abs from '../../util/box2abs'\nimport draw from '../draw'\nimport util from '../util'\nimport scale from '../../util/scale'\nimport Vec2 from 'src/script/util/vec2'\n\nconst tfx = util.tfx\n\nfunction ReSimpleObject(simpleObject) {\n this.init('simpleObject')\n\n this.item = simpleObject\n}\nReSimpleObject.prototype = new ReObject()\nReSimpleObject.isSelectable = function () {\n return true\n}\nReSimpleObject.prototype.calcDistance = function (p, s) {\n const point = new Vec2(p.x, p.y)\n let dist = null\n let distRef = null\n const item = this.item\n const mode = item.mode\n const pos = item.pos\n\n switch (mode) {\n case 'circle': {\n const dist1 = Vec2.dist(point, pos[0])\n const dist2 = Vec2.dist(pos[0], pos[1])\n dist = Math.max(dist1, dist2) - Math.min(dist1, dist2)\n break\n }\n case 'rectangle': {\n const topX = Math.min(pos[0].x, pos[1].x)\n const topY = Math.min(pos[0].y, pos[1].y)\n const bottomX = Math.max(pos[0].x, pos[1].x)\n const bottomY = Math.max(pos[0].y, pos[1].y)\n\n const distances = []\n\n if (point.x >= topX && point.x <= bottomX) {\n if (point.y < topY) {\n distances.push(topY - point.y)\n } else if (point.y > bottomY) {\n distances.push(point.y - bottomY)\n } else {\n distances.push(point.y - topY, bottomY - point.y)\n }\n }\n if (point.x < topX && point.y < topY) {\n distances.push(Vec2.dist(new Vec2(topX, topY), point))\n }\n if (point.x > bottomX && point.y > bottomY) {\n distances.push(Vec2.dist(new Vec2(bottomX, bottomY), point))\n }\n if (point.x < topX && point.y > bottomY) {\n distances.push(Vec2.dist(new Vec2(topX, bottomY), point))\n }\n if (point.x > bottomX && point.y < topY) {\n distances.push(Vec2.dist(new Vec2(bottomX, topY), point))\n }\n if (point.y >= topY && point.y <= bottomY) {\n if (point.x < topX) {\n distances.push(topX - point.x)\n } else if (point.x > bottomX) {\n distances.push(point.x - bottomX)\n } else {\n distances.push(point.x - topX, bottomX - point.x)\n }\n }\n dist = Math.min(...distances)\n break\n }\n case 'line': {\n if (\n (point.x < Math.min(pos[0].x, pos[1].x) ||\n point.x > Math.max(pos[0].x, pos[1].x)) &&\n (point.y < Math.min(pos[0].y, pos[1].y) ||\n point.y > Math.max(pos[0].y, pos[1].y))\n )\n dist = Math.min(Vec2.dist(pos[0], point), Vec2.dist(pos[1], point))\n else {\n const a = Vec2.dist(pos[0], pos[1])\n const b = Vec2.dist(pos[0], point)\n const c = Vec2.dist(pos[1], point)\n const per = (a + b + c) / 2\n dist = (2 / a) * Math.sqrt(per * (per - a) * (per - b) * (per - c))\n }\n break\n }\n\n default: {\n throw new Error('Unsupported shape type')\n }\n }\n\n distRef = this.getReferencePointDistance(p)\n const refPoint = distRef.minDist <= 8 / s ? distRef.refPoint : null\n\n return { minDist: dist, refPoint: refPoint }\n}\n\nReSimpleObject.prototype.getReferencePointDistance = function (p) {\n let dist = []\n const refPoints = this.getReferencePoints()\n refPoints.forEach(rp => {\n dist.push({ minDist: Math.abs(Vec2.dist(p, rp)), refPoint: rp })\n })\n\n const minDist = dist.reduce(\n (acc, current) =>\n !acc ? current : acc.minDist < current.minDist ? acc : current,\n null\n )\n\n return minDist\n}\n\nReSimpleObject.prototype.getReferencePoints = function () {\n const refPoints = []\n switch (this.item.mode) {\n case 'circle': {\n const p0 = this.item.pos[0]\n const rad = Vec2.dist(this.item.pos[0], this.item.pos[1])\n refPoints.push(\n new Vec2(p0.x - rad, p0.y),\n new Vec2(p0.x, p0.y - rad),\n new Vec2(p0.x + rad, p0.y),\n new Vec2(p0.x, p0.y + rad)\n )\n\n break\n }\n case 'rectangle': {\n const p0 = new Vec2(\n tfx(Math.min(this.item.pos[0].x, this.item.pos[1].x)),\n tfx(Math.min(this.item.pos[0].y, this.item.pos[1].y))\n )\n const w = Math.abs(Vec2.diff(this.item.pos[0], this.item.pos[1]).x)\n const h = Math.abs(Vec2.diff(this.item.pos[0], this.item.pos[1]).y)\n\n refPoints.push(\n p0,\n new Vec2(p0.x + 0.5 * w, p0.y),\n new Vec2(p0.x + w, p0.y),\n new Vec2(p0.x + w, p0.y + 0.5 * h),\n new Vec2(p0.x + w, p0.y + h),\n new Vec2(p0.x + 0.5 * w, p0.y + h),\n new Vec2(p0.x, p0.y + h),\n new Vec2(p0.x, p0.y + 0.5 * h)\n )\n break\n }\n case 'line': {\n this.item.pos.forEach(i => refPoints.push(i))\n break\n }\n\n default: {\n throw new Error('Unsupported shape type')\n }\n }\n return refPoints\n}\n\nReSimpleObject.prototype.highlightPath = function (render) {\n const point = []\n\n this.item.pos.forEach((p, index) => {\n point[index] = scale.obj2scaled(p, render.options)\n })\n const s = render.options.scale\n\n const path = []\n\n //TODO: It seems that inheritance will be the better approach here\n switch (this.item.mode) {\n case 'circle': {\n const rad = Vec2.dist(point[0], point[1])\n path.push(\n render.paper.circle(point[0].x, point[0].y, rad + s / 8),\n render.paper.circle(point[0].x, point[0].y, rad - s / 8)\n )\n break\n }\n\n case 'rectangle': {\n path.push(\n render.paper.rect(\n tfx(Math.min(point[0].x, point[1].x) - s / 8),\n tfx(Math.min(point[0].y, point[1].y) - s / 8),\n tfx(\n Math.max(point[0].x, point[1].x) -\n Math.min(point[0].x, point[1].x) +\n s / 4\n ),\n tfx(\n Math.max(point[0].y, point[1].y) -\n Math.min(point[0].y, point[1].y) +\n s / 4\n )\n )\n )\n\n path.push(\n render.paper.rect(\n tfx(Math.min(point[0].x, point[1].x) + s / 8),\n tfx(Math.min(point[0].y, point[1].y) + s / 8),\n tfx(\n Math.max(point[0].x, point[1].x) -\n Math.min(point[0].x, point[1].x) -\n s / 4\n ),\n tfx(\n Math.max(point[0].y, point[1].y) -\n Math.min(point[0].y, point[1].y) -\n s / 4\n )\n )\n )\n\n break\n }\n case 'line': {\n //TODO: reuse this code for polyline\n const poly = []\n\n let angle = Math.atan(\n (point[1].y - point[0].y) / (point[1].x - point[0].x)\n )\n\n const p0 = { x: 0, y: 0 }\n const p1 = { x: 0, y: 0 }\n\n const k = point[0].x > point[1].x ? -1 : 1\n\n p0.x = point[0].x - k * ((s / 8) * Math.cos(angle))\n p0.y = point[0].y - k * ((s / 8) * Math.sin(angle))\n p1.x = point[1].x + k * ((s / 8) * Math.cos(angle))\n p1.y = point[1].y + k * ((s / 8) * Math.sin(angle))\n\n poly.push(\n 'M',\n p0.x + ((k * s) / 8) * Math.sin(angle),\n p0.y - ((k * s) / 8) * Math.cos(angle)\n )\n poly.push(\n 'L',\n p1.x + ((k * s) / 8) * Math.sin(angle),\n p1.y - ((k * s) / 8) * Math.cos(angle)\n )\n poly.push(\n 'L',\n p1.x - ((k * s) / 8) * Math.sin(angle),\n p1.y + ((k * s) / 8) * Math.cos(angle)\n )\n poly.push(\n 'L',\n p0.x - ((k * s) / 8) * Math.sin(angle),\n p0.y + ((k * s) / 8) * Math.cos(angle)\n )\n poly.push(\n 'L',\n p0.x + ((k * s) / 8) * Math.sin(angle),\n p0.y - ((k * s) / 8) * Math.cos(angle)\n )\n\n path.push(render.paper.path(poly))\n break\n }\n default: {\n throw new Error('Unsupported shape type')\n }\n }\n\n const enhPaths = path.map(p => {\n return { path: p, stylesApplied: false }\n })\n\n const refPoints = this.getReferencePoints()\n\n refPoints.forEach(rp => {\n const scaledRP = scale.obj2scaled(rp, render.options)\n enhPaths.push({\n path: render.paper\n .circle(scaledRP.x, scaledRP.y, s / 8)\n .attr({ fill: 'black' }),\n stylesApplied: true\n })\n })\n\n return enhPaths\n}\n\nReSimpleObject.prototype.drawHighlight = function (render) {\n const paths = this.highlightPath(render).map(enhPath => {\n if (!enhPath.stylesApplied) {\n return enhPath.path.attr(render.options.highlightStyle)\n }\n return enhPath.path\n })\n\n render.ctab.addReObjectPath('highlighting', this.visel, paths)\n return paths\n}\n\nReSimpleObject.prototype.makeSelectionPlate = function (\n restruct,\n paper,\n styles\n) {\n const pos = this.item.pos.map(p => {\n return scale.obj2scaled(p, restruct.render.options) || new Vec2()\n })\n\n const path = generatePath(this.item.mode, paper, pos)\n\n return path.attr(styles.highlightStyleSimpleObject)\n}\n\nReSimpleObject.prototype.show = function (restruct, id, options) {\n const render = restruct.render\n const pos = this.item.pos.map((p, index) => {\n return scale.obj2scaled(p, options) || new Vec2()\n })\n\n const path = generatePath(this.item.mode, render.paper, pos, options)\n\n var offset = options.offset\n if (offset != null) path.translateAbs(offset.x, offset.y)\n this.visel.add(path, Box2Abs.fromRelBox(util.relBox(path.getBBox())))\n}\n\nfunction generatePath(mode, paper, pos, options) {\n let path = null\n switch (mode) {\n case 'circle': {\n path = draw.circle(paper, pos, options)\n break\n }\n case 'rectangle': {\n path = draw.rectangle(paper, pos, options)\n break\n }\n case 'line': {\n path = draw.line(paper, pos, options)\n break\n }\n default: {\n throw new Error('Unsupported shape type')\n }\n }\n\n return path\n}\n\nexport default ReSimpleObject\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\n/* eslint-disable guard-for-in,no-prototype-builtins */ // todo\n\n// ReStruct is to store all the auxiliary information for\n// Struct while rendering\nimport Box2Abs from '../../util/box2abs'\nimport Pool from '../../util/pool'\nimport Pile from '../../util/pile'\nimport Vec2 from '../../util/vec2'\n\nimport util from '../util'\n\nimport Struct from '../../chem/struct'\n\nimport ReAtom from './reatom'\nimport ReBond from './rebond'\nimport ReRxnPlus from './rerxnplus'\nimport ReRxnArrow from './rerxnarrow'\nimport ReFrag from './refrag'\nimport ReRGroup from './rergroup'\nimport ReDataSGroupData from './redatasgroupdata'\nimport ReEnhancedFlag from './reenhancedflag'\nimport ReSGroup from './resgroup'\nimport ReLoop from './reloop'\nimport ReSimpleObject from './resimpleobject'\n\nvar LAYER_MAP = {\n background: 0,\n selectionPlate: 1,\n highlighting: 2,\n warnings: 3,\n data: 4,\n indices: 5\n}\n\nfunction ReStruct(molecule, render) {\n // eslint-disable-line max-statements\n this.render = render\n this.atoms = new Map()\n this.bonds = new Map()\n this.reloops = new Map()\n this.rxnPluses = new Map()\n this.rxnArrows = new Map()\n this.frags = new Pool()\n this.rgroups = new Pool()\n this.sgroups = new Map()\n this.sgroupData = new Map()\n this.enhancedFlags = new Map()\n this.simpleObjects = new Map()\n this.molecule = molecule || new Struct()\n this.initialized = false\n this.layers = []\n this.initLayers()\n\n this.connectedComponents = new Pool()\n this.ccFragmentType = new Pool()\n\n this.clearMarks()\n\n this.structChanged = false\n\n // TODO: eachItem ?\n\n molecule.atoms.forEach((atom, aid) => {\n this.atoms.set(aid, new ReAtom(atom))\n })\n\n molecule.bonds.forEach((bond, bid) => {\n this.bonds.set(bid, new ReBond(bond))\n })\n\n molecule.loops.forEach((loop, lid) => {\n this.reloops.set(lid, new ReLoop(loop))\n })\n\n molecule.rxnPluses.forEach((item, id) => {\n this.rxnPluses.set(id, new ReRxnPlus(item))\n })\n\n molecule.rxnArrows.forEach((item, id) => {\n this.rxnArrows.set(id, new ReRxnArrow(item))\n })\n\n molecule.simpleObjects.forEach((item, id) => {\n this.simpleObjects.set(id, new ReSimpleObject(item))\n })\n\n molecule.frags.forEach((item, id) => {\n this.frags.set(id, new ReFrag(item))\n const bb = molecule.getFragment(id).getCoordBoundingBox()\n if (item)\n this.enhancedFlags.set(\n id,\n new ReEnhancedFlag(\n item.enhancedStereoFlag || null,\n new Vec2(bb.max.x, bb.min.y - 1)\n )\n )\n })\n\n molecule.rgroups.forEach((item, id) => {\n this.rgroups.set(id, new ReRGroup(item))\n })\n\n molecule.sgroups.forEach((item, id) => {\n this.sgroups.set(id, new ReSGroup(item))\n if (item.type === 'DAT' && !item.data.attached)\n this.sgroupData.set(id, new ReDataSGroupData(item)) // [MK] sort of a hack, we use the SGroup id for the data field id\n })\n}\n\n/**\n * @param aid { number }\n * @param atom { Atom }\n */\nReStruct.prototype.connectedComponentRemoveAtom = function (aid, atom = null) {\n atom = atom || this.atoms.get(aid)\n if (atom.component < 0) return\n var cc = this.connectedComponents.get(atom.component)\n\n cc.delete(aid)\n if (cc.size < 1) this.connectedComponents.delete(atom.component)\n\n atom.component = -1\n}\n\nReStruct.prototype.clearConnectedComponents = function () {\n this.connectedComponents.clear()\n this.atoms.forEach(atom => {\n atom.component = -1\n })\n}\n\n/**\n * @param aid { Array|number }\n * @param adjacentComponents { Pile }\n * @returns { Pile }\n */\nReStruct.prototype.getConnectedComponent = function (aid, adjacentComponents) {\n const list = Array.isArray(aid) ? Array.from(aid) : [aid]\n const ids = new Pile()\n\n while (list.length > 0) {\n const aid = list.pop()\n ids.add(aid)\n const atom = this.atoms.get(aid)\n\n if (atom.component >= 0) adjacentComponents.add(atom.component)\n\n atom.a.neighbors.forEach(neighbor => {\n const neiId = this.molecule.halfBonds.get(neighbor).end\n if (!ids.has(neiId)) list.push(neiId)\n })\n }\n\n return ids\n}\n\n/**\n * @param idSet { Pile }\n * @returns { number }\n */\nReStruct.prototype.addConnectedComponent = function (idSet) {\n const compId = this.connectedComponents.add(idSet)\n const adjacentComponents = new Pile()\n const aidSet = this.getConnectedComponent(\n Array.from(idSet),\n adjacentComponents\n )\n\n adjacentComponents.delete(compId)\n\n let type = -1\n aidSet.forEach(aid => {\n const atom = this.atoms.get(aid)\n atom.component = compId\n if (atom.a.rxnFragmentType !== -1) type = atom.a.rxnFragmentType\n })\n\n this.ccFragmentType.set(compId, type)\n return compId\n}\n\n/**\n * @param ccid { number }\n * @returns { number }\n */\nReStruct.prototype.removeConnectedComponent = function (ccid) {\n this.connectedComponents.get(ccid).forEach(aid => {\n this.atoms.get(aid).component = -1\n })\n\n return this.connectedComponents.delete(ccid)\n}\n\nReStruct.prototype.assignConnectedComponents = function () {\n this.atoms.forEach((atom, aid) => {\n if (atom.component >= 0) return\n\n const adjacentComponents = new Pile()\n const idSet = this.getConnectedComponent(aid, adjacentComponents)\n adjacentComponents.forEach(ccid => {\n this.removeConnectedComponent(ccid)\n })\n\n this.addConnectedComponent(idSet)\n })\n}\n\nReStruct.prototype.initLayers = function () {\n for (const group in LAYER_MAP) {\n this.layers[LAYER_MAP[group]] = this.render.paper\n .rect(0, 0, 10, 10)\n .attr({\n class: group + 'Layer',\n fill: '#000',\n opacity: '0.0'\n })\n .toFront()\n }\n}\n\nReStruct.prototype.addReObjectPath = function (\n group,\n visel,\n path,\n pos,\n visible\n) {\n // eslint-disable-line max-params\n if (!path || !this.layers[LAYER_MAP[group]].node.parentNode) return\n\n const paths = Array.isArray(path) ? path : [path]\n\n paths.forEach(path => {\n const offset = this.render.options.offset\n let bb = visible ? Box2Abs.fromRelBox(util.relBox(path.getBBox())) : null\n const ext = pos && bb ? bb.translate(pos.negated()) : null\n if (offset !== null) {\n path.translateAbs(offset.x, offset.y)\n bb = bb ? bb.translate(offset) : null\n }\n visel.add(path, bb, ext)\n path.insertBefore(this.layers[LAYER_MAP[group]])\n })\n}\n\nReStruct.prototype.clearMarks = function () {\n Object.keys(ReStruct.maps).forEach(map => {\n this[map + 'Changed'] = new Map()\n })\n\n this.structChanged = false\n}\n\nReStruct.prototype.markItemRemoved = function () {\n this.structChanged = true\n}\n\nReStruct.prototype.markBond = function (bid, mark) {\n this.markItem('bonds', bid, mark)\n}\n\nReStruct.prototype.markAtom = function (aid, mark) {\n this.markItem('atoms', aid, mark)\n}\n\nReStruct.prototype.markItem = function (map, id, mark) {\n const mapChanged = this[map + 'Changed']\n\n const value = mapChanged.has(id) ? Math.max(mark, mapChanged.get(id)) : mark\n\n mapChanged.set(id, value)\n\n // console.log(\"??????????\", map + 'Changed', mapChanged);\n\n if (this[map].has(id)) this.clearVisel(this[map].get(id).visel)\n}\n\nReStruct.prototype.clearVisel = function (visel) {\n visel.paths.forEach(path => {\n path.remove()\n })\n visel.clear()\n}\n\nReStruct.prototype.eachItem = function (func) {\n Object.keys(ReStruct.maps).forEach(map => {\n this[map].forEach(func)\n })\n}\n\nReStruct.prototype.getVBoxObj = function (selection) {\n selection = selection || {}\n\n if (isSelectionEmpty(selection)) {\n Object.keys(ReStruct.maps).forEach(map => {\n selection[map] = Array.from(this[map].keys())\n })\n }\n\n let vbox = null\n Object.keys(ReStruct.maps).forEach(map => {\n if (!selection[map]) return\n\n selection[map].forEach(id => {\n const box = this[map].get(id).getVBoxObj(this.render)\n if (box) vbox = vbox ? Box2Abs.union(vbox, box) : box.clone()\n })\n })\n\n vbox = vbox || new Box2Abs(0, 0, 0, 0)\n return vbox\n}\n\nfunction isSelectionEmpty(selection) {\n if (!selection) return true\n\n const anySelection = Object.keys(ReStruct.maps).some(\n map => selection[map] && selection[map].length > 0\n )\n\n return !anySelection\n}\n\nReStruct.prototype.translate = function (d) {\n this.eachItem(item => item.visel.translate(d))\n}\n\nReStruct.prototype.scale = function (s) {\n // NOTE: bounding boxes are not valid after scaling\n this.eachItem(item => scaleVisel(item.visel, s))\n}\n\nfunction scaleRPath(path, s) {\n if (path.type == 'set') {\n // TODO: rework scaling\n for (var i = 0; i < path.length; ++i) scaleRPath(path[i], s)\n } else {\n if (!(typeof path.attrs === 'undefined')) {\n if ('font-size' in path.attrs)\n path.attr('font-size', path.attrs['font-size'] * s)\n else if ('stroke-width' in path.attrs)\n path.attr('stroke-width', path.attrs['stroke-width'] * s)\n }\n path.scale(s, s, 0, 0)\n }\n}\n\nfunction scaleVisel(visel, s) {\n for (let i = 0; i < visel.paths.length; ++i) scaleRPath(visel.paths[i], s)\n}\n\nReStruct.prototype.clearVisels = function () {\n this.eachItem(item => this.clearVisel(item.visel))\n}\n\nReStruct.prototype.update = function (force) {\n // eslint-disable-line max-statements\n force = force || !this.initialized\n\n // check items to update\n Object.keys(ReStruct.maps).forEach(map => {\n const mapChanged = this[map + 'Changed']\n // console.log(map + 'Changed', mapChanged);\n if (force) {\n this[map].forEach((item, id) => mapChanged.set(id, 1))\n } else {\n // check if some of the items marked are already gone\n mapChanged.forEach((value, id) => {\n if (!this[map].has(id)) mapChanged.delete(id)\n })\n }\n })\n\n this.atomsChanged.forEach((value, aid) =>\n this.connectedComponentRemoveAtom(aid)\n )\n\n // clean up empty fragments\n // TODO: fragment removal should be triggered by the action responsible for the fragment contents removal and form an operation of its own\n const emptyFrags = this.frags.filter(\n (fid, frag) => !frag.calcBBox(this.render.ctab, fid, this.render)\n )\n\n emptyFrags.forEach((frag, fid) => {\n this.clearVisel(frag.visel)\n this.frags.delete(fid)\n this.molecule.frags.delete(fid)\n })\n\n Object.keys(ReStruct.maps).forEach(map => {\n const mapChanged = this[map + 'Changed']\n\n mapChanged.forEach((value, id) => {\n this.clearVisel(this[map].get(id).visel)\n this.structChanged |= mapChanged.get(id) > 0\n })\n })\n\n // TODO: when to update sgroup?\n this.sgroups.forEach(sgroup => {\n this.clearVisel(sgroup.visel)\n sgroup.highlighting = null\n sgroup.selectionPlate = null\n })\n\n // TODO [RB] need to implement update-on-demand for fragments and r-groups\n this.frags.forEach(frag => {\n this.clearVisel(frag.visel)\n })\n\n this.rgroups.forEach(rgroup => {\n this.clearVisel(rgroup.visel)\n })\n\n if (force) {\n // clear and recreate all half-bonds\n this.clearConnectedComponents()\n this.molecule.initHalfBonds()\n this.molecule.initNeighbors()\n }\n\n // only update half-bonds adjacent to atoms that have moved\n const atomsChangedArray = Array.from(this.atomsChanged.keys())\n this.molecule.updateHalfBonds(atomsChangedArray)\n this.molecule.sortNeighbors(atomsChangedArray)\n\n this.assignConnectedComponents()\n this.initialized = true\n\n this.verifyLoops()\n const updLoops = force || this.structChanged\n if (updLoops) this.updateLoops()\n this.setImplicitHydrogen()\n this.showLabels()\n this.showBonds()\n if (updLoops) this.showLoops()\n this.showReactionSymbols()\n this.showSGroups()\n\n this.showFragments()\n this.showRGroups()\n this.showEnhancedFlags()\n this.showSimpleObjects()\n this.clearMarks()\n\n return true\n}\n\nReStruct.prototype.updateLoops = function () {\n this.reloops.forEach(reloop => {\n this.clearVisel(reloop.visel)\n })\n const ret = this.molecule.findLoops()\n ret.bondsToMark.forEach(bid => {\n this.markBond(bid, 1)\n })\n ret.newLoops.forEach(loopId => {\n this.reloops.set(loopId, new ReLoop(this.molecule.loops.get(loopId)))\n })\n}\n\nReStruct.prototype.showLoops = function () {\n const options = this.render.options\n this.reloops.forEach((reloop, rlid) => {\n reloop.show(this, rlid, options)\n })\n}\n\nReStruct.prototype.showSimpleObjects = function () {\n const options = this.render.options\n\n this.simpleObjectsChanged.forEach((value, id) => {\n const simpleObject = this.simpleObjects.get(id)\n simpleObject.show(this, id, options)\n })\n}\n\nReStruct.prototype.showReactionSymbols = function () {\n const options = this.render.options\n\n this.rxnArrowsChanged.forEach((value, id) => {\n const arrow = this.rxnArrows.get(id)\n arrow.show(this, id, options)\n })\n\n this.rxnPlusesChanged.forEach((value, id) => {\n const plus = this.rxnPluses.get(id)\n plus.show(this, id, options)\n })\n}\n\nReStruct.prototype.showSGroups = function () {\n const options = this.render.options\n\n this.molecule.sGroupForest\n .getSGroupsBFS()\n .reverse()\n .forEach(id => {\n const resgroup = this.sgroups.get(id)\n resgroup.show(this, id, options)\n })\n}\n\nReStruct.prototype.showFragments = function () {\n this.frags.forEach((frag, id) => {\n const path = frag.draw(this.render, id)\n if (path) this.addReObjectPath('data', frag.visel, path, null, true)\n // TODO fragment selection & highlighting\n })\n}\n\nReStruct.prototype.showRGroups = function () {\n const options = this.render.options\n this.rgroups.forEach((rgroup, id) => {\n rgroup.show(this, id, options)\n })\n}\n\nReStruct.prototype.setImplicitHydrogen = function () {\n // calculate implicit hydrogens for atoms that have been modified\n this.molecule.setImplicitHydrogen(Array.from(this.atomsChanged.keys()))\n}\n\nReStruct.prototype.loopRemove = function (loopId) {\n if (!this.reloops.has(loopId)) return\n\n const reloop = this.reloops.get(loopId)\n this.clearVisel(reloop.visel)\n\n const bondlist = []\n\n reloop.loop.hbs.forEach(hbid => {\n if (!this.molecule.halfBonds.has(hbid)) return\n\n const hb = this.molecule.halfBonds.get(hbid)\n hb.loop = -1\n this.markBond(hb.bid, 1)\n this.markAtom(hb.begin, 1)\n bondlist.push(hb.bid)\n })\n\n this.reloops.delete(loopId)\n this.molecule.loops.delete(loopId)\n}\n\nReStruct.prototype.verifyLoops = function () {\n this.reloops.forEach((reloop, rlid) => {\n if (!reloop.isValid(this.molecule, rlid)) this.loopRemove(rlid)\n })\n}\n\nReStruct.prototype.showLabels = function () {\n // eslint-disable-line max-statements\n const options = this.render.options\n\n this.atomsChanged.forEach((value, aid) => {\n const atom = this.atoms.get(aid)\n atom.show(this, aid, options)\n })\n}\n\nReStruct.prototype.showEnhancedFlags = function () {\n const options = this.render.options\n\n // console.log(\"!!\", this.enhancedFlagsChanged);\n\n this.enhancedFlagsChanged.forEach((value, chid) => {\n const flag = this.enhancedFlags.get(chid)\n flag.show(this, chid, options)\n })\n}\n\nReStruct.prototype.showBonds = function () {\n // eslint-disable-line max-statements\n const options = this.render.options\n\n this.bondsChanged.forEach((value, bid) => {\n const bond = this.bonds.get(bid)\n bond.show(this, bid, options)\n })\n}\n\nReStruct.prototype.setSelection = function (selection) {\n const redraw = arguments.length === 0 // render.update only\n\n Object.keys(ReStruct.maps).forEach(map => {\n if (ReStruct.maps[map].isSelectable()) {\n this[map].forEach((item, id) => {\n const selected = redraw\n ? item.selected\n : selection && selection[map] && selection[map].indexOf(id) > -1\n\n this.showItemSelection(item, selected)\n })\n }\n })\n}\n\nReStruct.prototype.showItemSelection = function (item, selected) {\n var exists = item.selectionPlate !== null && !item.selectionPlate.removed\n // TODO: simplify me, who sets `removed`?\n item.selected = selected\n if (item instanceof ReDataSGroupData) item.sgroup.selected = selected\n if (selected) {\n if (!exists) {\n var render = this.render\n var options = render.options\n var paper = render.paper\n\n item.selectionPlate = item.makeSelectionPlate(this, paper, options)\n this.addReObjectPath('selectionPlate', item.visel, item.selectionPlate)\n }\n if (item.selectionPlate) item.selectionPlate.show() // TODO [RB] review\n } else if (exists && item.selectionPlate) {\n item.selectionPlate.hide() // TODO [RB] review\n }\n}\n\nReStruct.maps = {\n atoms: ReAtom,\n bonds: ReBond,\n rxnPluses: ReRxnPlus,\n rxnArrows: ReRxnArrow,\n frags: ReFrag,\n rgroups: ReRGroup,\n sgroupData: ReDataSGroupData,\n enhancedFlags: ReEnhancedFlag,\n sgroups: ReSGroup,\n reloops: ReLoop,\n simpleObjects: ReSimpleObject\n}\n\nexport default ReStruct\nexport {\n ReAtom,\n ReBond,\n ReRxnPlus,\n ReRxnArrow,\n ReFrag,\n ReRGroup,\n ReEnhancedFlag,\n ReSGroup,\n ReSimpleObject\n}\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport { inRange } from 'lodash'\nimport Vec2 from '../../util/vec2'\n\nlet FRAC = Math.PI / 12 // '15º'\n\nfunction setFracAngle(angle) {\n FRAC = (Math.PI / 180) * angle\n}\n\nfunction calcAngle(pos0, pos1) {\n const v = Vec2.diff(pos1, pos0)\n return Math.atan2(v.y, v.x)\n}\n\nfunction fracAngle(angle, angle2) {\n if (angle2) angle = calcAngle(angle, angle2)\n return Math.round(angle / FRAC) * FRAC\n}\n\nfunction calcNewAtomPos(pos0, pos1, ctrlKey) {\n const v = new Vec2(1, 0).rotate(\n ctrlKey ? calcAngle(pos0, pos1) : fracAngle(pos0, pos1)\n )\n v.add_(pos0) // eslint-disable-line no-underscore-dangle\n return v\n}\n\nfunction degrees(angle) {\n let degree = Math.round((angle / Math.PI) * 180)\n if (degree > 180) degree -= 360\n else if (degree <= -180) degree += 360\n return degree\n}\n\nconst BONDS_MERGE_ANGLE = 10 // 'º'\nconst BONDS_MERGE_SCALE = 0.2\n\nfunction mergeBondsParams(struct1, bond1, struct2, bond2) {\n const begin1 = struct1.atoms.get(bond1.begin)\n const begin2 = struct2.atoms.get(bond2.begin)\n const end1 = struct1.atoms.get(bond1.end)\n const end2 = struct2.atoms.get(bond2.end)\n\n const angle = calcAngle(begin1.pp, end1.pp) - calcAngle(begin2.pp, end2.pp)\n const mergeAngle = Math.abs(degrees(angle) % 180)\n\n const scale = Vec2.dist(begin1.pp, end1.pp) / Vec2.dist(begin2.pp, end2.pp)\n\n const merged =\n !inRange(mergeAngle, BONDS_MERGE_ANGLE, 180 - BONDS_MERGE_ANGLE) &&\n inRange(scale, 1 - BONDS_MERGE_SCALE, 1 + BONDS_MERGE_SCALE)\n\n return { merged, angle, scale, cross: Math.abs(degrees(angle)) > 90 }\n}\n\nexport default {\n calcAngle,\n fracAngle,\n calcNewAtomPos,\n degrees,\n setFracAngle,\n mergeBondsParams\n}\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport Raphael from '../raphael-ext'\nimport Box2Abs from '../util/box2abs'\nimport Vec2 from '../util/vec2'\nimport scale from '../util/scale'\n\nimport Struct from '../chem/struct'\nimport ReStruct from './restruct'\n\nimport defaultOptions from './options'\n\nvar DEBUG = { debug: false, logcnt: 0, logmouse: false, hl: false }\nDEBUG.logMethod = function () {}\n// DEBUG.logMethod = function (method) {addionalAtoms(\"METHOD: \" + method);\n\nfunction Render(clientArea, opt) {\n let renderWidth = clientArea.clientWidth - 10\n let renderHeight = clientArea.clientHeight - 10\n renderWidth = renderWidth > 0 ? renderWidth : 0\n renderHeight = renderHeight > 0 ? renderHeight : 0\n\n this.userOpts = opt\n this.clientArea = clientArea\n this.paper = new Raphael(clientArea, renderWidth, renderHeight)\n this.sz = Vec2.ZERO\n this.ctab = new ReStruct(new Struct(), this)\n this.options = defaultOptions(this.userOpts)\n}\n\nRender.prototype.view2obj = function (p, isRelative) {\n var scroll = this.scrollPos()\n if (!this.useOldZoom) {\n p = p.scaled(1 / this.options.zoom)\n scroll = scroll.scaled(1 / this.options.zoom)\n }\n p = isRelative ? p : p.add(scroll).sub(this.options.offset)\n return scale.scaled2obj(p, this.options)\n}\n\nRender.prototype.obj2view = function (v, isRelative) {\n var p = scale.obj2scaled(v, this.options)\n p = isRelative\n ? p\n : p\n .add(this.options.offset)\n .sub(this.scrollPos().scaled(1 / this.options.zoom))\n if (!this.useOldZoom) p = p.scaled(this.options.zoom)\n return p\n}\n\nRender.prototype.scrollPos = function () {\n return new Vec2(this.clientArea.scrollLeft, this.clientArea.scrollTop)\n}\n\nfunction cumulativeOffset(el) {\n var curtop = 0\n var curleft = 0\n if (el.parentNode) {\n do {\n curtop += el.offsetTop || 0\n curleft += el.offsetLeft || 0\n el = el.offsetParent\n } while (el)\n }\n return { left: curleft, top: curtop }\n}\n\nRender.prototype.page2obj = function (pagePos) {\n var offset = cumulativeOffset(this.clientArea)\n var pp = new Vec2(pagePos.pageX - offset.left, pagePos.pageY - offset.top)\n return this.view2obj(pp)\n}\n\nRender.prototype.setPaperSize = function (sz) {\n DEBUG.logMethod('setPaperSize')\n this.sz = sz\n this.paper.setSize(sz.x * this.options.zoom, sz.y * this.options.zoom)\n this.setViewBox(this.options.zoom)\n}\n\nRender.prototype.setOffset = function (newoffset) {\n DEBUG.logMethod('setOffset')\n var delta = new Vec2(\n newoffset.x - this.options.offset.x,\n newoffset.y - this.options.offset.y\n )\n this.clientArea.scrollLeft += delta.x\n this.clientArea.scrollTop += delta.y\n this.options.offset = newoffset\n}\n\nRender.prototype.setZoom = function (zoom) {\n // when scaling the canvas down it may happen that the scaled canvas is smaller than the view window\n // don't forget to call setScrollOffset after zooming (or use extendCanvas directly)\n console.info('set zoom', zoom)\n this.options.zoom = zoom\n this.paper.setSize(this.sz.x * zoom, this.sz.y * zoom)\n this.setViewBox(zoom)\n}\n\nfunction calcExtend(sSz, x0, y0, x1, y1) {\n // eslint-disable-line max-params\n var ex = x0 < 0 ? -x0 : 0\n var ey = y0 < 0 ? -y0 : 0\n\n if (sSz.x < x1) ex += x1 - sSz.x\n if (sSz.y < y1) ey += y1 - sSz.y\n return new Vec2(ex, ey)\n}\n\nRender.prototype.setScrollOffset = function (x, y) {\n var clientArea = this.clientArea\n var cx = clientArea.clientWidth\n var cy = clientArea.clientHeight\n var e = calcExtend(\n this.sz.scaled(this.options.zoom),\n x,\n y,\n cx + x,\n cy + y\n ).scaled(1 / this.options.zoom)\n if (e.x > 0 || e.y > 0) {\n this.setPaperSize(this.sz.add(e))\n var d = new Vec2(x < 0 ? -x : 0, y < 0 ? -y : 0).scaled(\n 1 / this.options.zoom\n )\n if (d.x > 0 || d.y > 0) {\n this.ctab.translate(d)\n this.setOffset(this.options.offset.add(d))\n }\n }\n clientArea.scrollLeft = x\n clientArea.scrollTop = y\n // TODO: store drag position in scaled systems\n // scrollLeft = clientArea.scrollLeft;\n // scrollTop = clientArea.scrollTop;\n this.update(false)\n}\n\nRender.prototype.setScale = function (z) {\n if (this.options.offset)\n this.options.offset = this.options.offset.scaled(1 / z).scaled(z)\n this.userOpts.scale *= z\n this.options = null\n this.update(true)\n}\n\nRender.prototype.setViewBox = function (z) {\n if (!this.useOldZoom)\n this.paper.canvas.setAttribute(\n 'viewBox',\n '0 0 ' + this.sz.x + ' ' + this.sz.y\n )\n else this.setScale(z)\n}\n\nRender.prototype.setMolecule = function (ctab) {\n DEBUG.logMethod('setMolecule')\n this.paper.clear()\n this.ctab = new ReStruct(ctab, this)\n this.options.offset = new Vec2()\n this.update(false)\n}\n\nRender.prototype.update = function (force, viewSz) {\n // eslint-disable-line max-statements\n viewSz =\n viewSz ||\n new Vec2(\n this.clientArea.clientWidth || 100,\n this.clientArea.clientHeight || 100\n )\n\n var changes = this.ctab.update(force)\n this.ctab.setSelection() // [MK] redraw the selection bits where necessary\n if (changes) {\n var sf = this.options.scale\n var bb = this.ctab\n .getVBoxObj()\n .transform(scale.obj2scaled, this.options)\n .translate(this.options.offset || new Vec2())\n\n if (!this.options.autoScale) {\n var ext = Vec2.UNIT.scaled(sf)\n var eb = bb.sz().length() > 0 ? bb.extend(ext, ext) : bb\n var vb = new Box2Abs(\n this.scrollPos(),\n viewSz.scaled(1 / this.options.zoom).sub(Vec2.UNIT.scaled(20))\n )\n var cb = Box2Abs.union(vb, eb)\n if (!this.oldCb) this.oldCb = new Box2Abs()\n\n var sz = cb.sz().floor()\n var delta = this.oldCb.p0.sub(cb.p0).ceil()\n this.oldBb = bb\n if (!this.sz || sz.x != this.sz.x || sz.y != this.sz.y)\n this.setPaperSize(sz)\n\n this.options.offset = this.options.offset || new Vec2()\n if (delta.x != 0 || delta.y != 0) {\n this.setOffset(this.options.offset.add(delta))\n this.ctab.translate(delta)\n }\n } else {\n var sz1 = bb.sz()\n var marg = this.options.autoScaleMargin\n var mv = new Vec2(marg, marg)\n var csz = viewSz\n if (csz.x < 2 * marg + 1 || csz.y < 2 * marg + 1)\n throw new Error('View box too small for the given margin')\n var rescale = Math.max(\n sz1.x / (csz.x - 2 * marg),\n sz1.y / (csz.y - 2 * marg)\n )\n if (this.options.maxBondLength / rescale > 1.0) rescale = 1.0\n var sz2 = sz1.add(mv.scaled(2 * rescale))\n /* eslint-disable no-mixed-operators*/\n this.paper.setViewBox(\n bb.pos().x - marg * rescale - (csz.x * rescale - sz2.x) / 2,\n bb.pos().y - marg * rescale - (csz.y * rescale - sz2.y) / 2,\n csz.x * rescale,\n csz.y * rescale\n )\n /* eslint-enable no-mixed-operators*/\n }\n }\n}\n\nexport default Render\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport utils from '../editor/shared/utils'\nimport Vec2 from '../util/vec2'\n\nfunction defaultOptions(opt) {\n const scaleFactor = opt.scale || 100\n\n if (opt.rotationStep) utils.setFracAngle(opt.rotationStep)\n\n const labelFontSize = Math.ceil(1.9 * (scaleFactor / 6))\n const subFontSize = Math.ceil(0.7 * labelFontSize)\n\n const defaultOptions = {\n // flags for debugging\n showAtomIds: false,\n showBondIds: false,\n showHalfBondIds: false,\n showLoopIds: false,\n // rendering customization flags\n // TODO: hide enhanced flags opts\n showValenceWarnings: true,\n autoScale: false, // scale structure to fit into the given view box, used in view mode\n autoScaleMargin: 0,\n maxBondLength: 0, // 0 stands for \"not specified\"\n atomColoring: true,\n hideImplicitHydrogen: false,\n hideTerminalLabels: false,\n // atoms\n carbonExplicitly: false,\n showCharge: true,\n showHydrogenLabels: 'on',\n showValence: true,\n // bonds\n aromaticCircle: true,\n\n scale: scaleFactor,\n zoom: 1.0,\n offset: new Vec2(),\n\n lineWidth: scaleFactor / 20,\n bondSpace: opt.doubleBondWidth || scaleFactor / 7,\n stereoBond: opt.stereoBondWidth || scaleFactor / 7,\n subFontSize,\n font: '30px Arial',\n fontsz: labelFontSize,\n fontszsub: subFontSize,\n fontRLabel: labelFontSize * 1.2,\n fontRLogic: labelFontSize * 0.7,\n\n /* styles */\n lineattr: {\n stroke: '#000',\n 'stroke-width': opt.bondThickness || scaleFactor / 20,\n 'stroke-linecap': 'round',\n 'stroke-linejoin': 'round'\n },\n /* eslint-enable quote-props */\n selectionStyle: {\n fill: '#7f7',\n stroke: 'none'\n },\n highlightStyle: {\n stroke: '#0c0',\n 'stroke-width': (0.6 * scaleFactor) / 20\n },\n sgroupBracketStyle: {\n stroke: 'darkgray',\n 'stroke-width': (0.5 * scaleFactor) / 20\n },\n lassoStyle: {\n stroke: 'gray',\n 'stroke-width': '1px'\n },\n highlightStyleSimpleObject: {\n stroke: '#0c0',\n 'stroke-width': scaleFactor / 4,\n 'stroke-linecap': 'round',\n 'stroke-opacity': 0.6\n },\n atomSelectionPlateRadius: labelFontSize * 1.2\n }\n\n return Object.assign({}, defaultOptions, opt)\n}\n\nexport default defaultOptions\n","function Base() {\n this.type = 'OpBase'\n\n // assert here?\n this.execute = function () {\n throw new Error('Operation.execute() is not implemented')\n }\n\n this.invert = function () {\n throw new Error('Operation.invert() is not implemented')\n }\n\n this.perform = function (restruct) {\n this.execute(restruct)\n /* eslint-disable no-underscore-dangle */\n if (!this._inverted) {\n this._inverted = this.invert()\n this._inverted._inverted = this\n }\n return this._inverted\n }\n\n this.isDummy = function (restruct) {\n return this._isDummy ? this._isDummy(restruct) : false\n /* eslint-enable no-underscore-dangle */\n }\n}\n\nexport function invalidateAtom(restruct, aid, level) {\n const atom = restruct.atoms.get(aid)\n\n restruct.markAtom(aid, level ? 1 : 0)\n\n const hbs = restruct.molecule.halfBonds\n\n atom.a.neighbors.forEach(hbid => {\n if (!hbs.has(hbid)) return\n\n const hb = hbs.get(hbid)\n restruct.markBond(hb.bid, 1)\n restruct.markAtom(hb.end, 0)\n\n if (level) invalidateLoop(restruct, hb.bid)\n })\n}\n\nexport function invalidateLoop(restruct, bid) {\n const bond = restruct.bonds.get(bid)\n const lid1 = restruct.molecule.halfBonds.get(bond.b.hb1).loop\n const lid2 = restruct.molecule.halfBonds.get(bond.b.hb2).loop\n\n if (lid1 >= 0) restruct.loopRemove(lid1)\n\n if (lid2 >= 0) restruct.loopRemove(lid2)\n}\n\nexport function invalidateBond(restruct, bid) {\n const bond = restruct.bonds.get(bid)\n invalidateLoop(restruct, bid)\n invalidateAtom(restruct, bond.b.begin, 0)\n invalidateAtom(restruct, bond.b.end, 0)\n}\n\nexport function invalidateItem(restruct, map, id, level) {\n if (map === 'atoms') {\n invalidateAtom(restruct, id, level)\n } else if (map === 'bonds') {\n invalidateBond(restruct, id)\n if (level > 0) invalidateLoop(restruct, id)\n } else {\n restruct.markItem(map, id, level)\n }\n}\n\nexport default Base\n","import Vec2 from '../../util/vec2'\nimport { Fragment } from '../../chem/struct'\nimport { ReFrag, ReEnhancedFlag } from '../../render/restruct'\n\nimport Base, { invalidateItem } from './base'\n\nfunction FragmentAdd(frid) {\n this.frid = typeof frid === 'undefined' ? null : frid\n\n this.execute = function (restruct) {\n const struct = restruct.molecule\n const frag = new Fragment()\n\n if (this.frid === null) this.frid = struct.frags.add(frag)\n else struct.frags.set(this.frid, frag)\n\n restruct.frags.set(this.frid, new ReFrag(frag)) // TODO add ReStruct.notifyFragmentAdded\n restruct.enhancedFlags.set(this.frid, new ReEnhancedFlag(null, null))\n }\n\n this.invert = function () {\n return new FragmentDelete(this.frid)\n }\n}\nFragmentAdd.prototype = new Base()\n\nfunction FragmentDelete(frid) {\n this.frid = frid\n\n this.execute = function (restruct) {\n const struct = restruct.molecule\n if (!struct.frags.get(this.frid)) return\n invalidateItem(restruct, 'frags', this.frid, 1)\n restruct.frags.delete(this.frid)\n struct.frags.delete(this.frid) // TODO add ReStruct.notifyFragmentRemoved\n\n restruct.clearVisel(restruct.enhancedFlags.get(this.frid).visel)\n restruct.enhancedFlags.delete(this.frid)\n }\n\n this.invert = function () {\n return new FragmentAdd(this.frid)\n }\n}\nFragmentDelete.prototype = new Base()\n\nfunction FragmentStereoFlag(frid, flag = false) {\n this.frid = frid\n this.flag = flag\n this.invert_flag = null\n\n this.execute = function (restruct) {\n const struct = restruct.molecule\n\n const frag = struct.frags.get(this.frid)\n if (!this.invert_flag) this.invert_flag = frag.enhancedStereoFlag\n frag.updateStereoFlag(struct, this.flag)\n\n invalidateEnhancedFlag(restruct, this.frid, frag.enhancedStereoFlag)\n }\n\n this.invert = function () {\n const ret = new FragmentStereoFlag(this.frid)\n ret.flag = this.invert_flag\n ret.invert_flag = this.flag\n return ret\n }\n}\nFragmentStereoFlag.prototype = new Base()\n\n// todo : merge add and delete stereo atom\nfunction FragmentAddStereoAtom(frid, aid) {\n this.data = { frid, aid }\n\n this.execute = function (restruct) {\n const frag = restruct.molecule.frags.get(this.data.frid)\n frag.updateStereoAtom(restruct.molecule, this.data.aid, true)\n\n invalidateEnhancedFlag(restruct, this.data.frid, frag.enhancedStereoFlag)\n }\n\n this.invert = function () {\n return new FragmentDeleteStereoAtom(this.data.frid, this.data.aid)\n }\n}\nFragmentAddStereoAtom.prototype = new Base()\n\nfunction FragmentDeleteStereoAtom(frid, aid) {\n this.data = { frid, aid }\n\n this.execute = function (restruct) {\n const frag = restruct.molecule.frags.get(this.data.frid)\n frag.updateStereoAtom(restruct.molecule, this.data.aid, false)\n\n invalidateEnhancedFlag(restruct, this.data.frid, frag.enhancedStereoFlag)\n }\n\n this.invert = function () {\n return new FragmentAddStereoAtom(this.data.frid, this.data.aid)\n }\n}\nFragmentDeleteStereoAtom.prototype = new Base()\n\nfunction invalidateEnhancedFlag(restruct, frid, flag) {\n const reEnhancedFlag = restruct.enhancedFlags.get(frid)\n if (reEnhancedFlag.flag === flag) return\n\n reEnhancedFlag.flag = flag\n invalidateItem(restruct, 'enhancedFlags', frid, 1)\n}\n\nfunction EnhancedFlagMove(frid, p) {\n this.data = { frid, p }\n\n this.execute = function (restruct) {\n if (!this.data.p) {\n const bb = restruct.molecule\n .getFragment(this.data.frid)\n .getCoordBoundingBox()\n this.data.p = new Vec2(bb.max.x, bb.min.y - 1)\n }\n const enhancedFlag = restruct.enhancedFlags.get(this.data.frid)\n if (enhancedFlag?.pp) {\n enhancedFlag.pp.add_(this.data.p)\n }\n\n this.data.p = this.data.p.negated()\n invalidateItem(restruct, 'enhancedFlags', this.data.frid, 1)\n }\n\n this.invert = function () {\n const ret = new EnhancedFlagMove()\n ret.data = this.data\n return ret\n }\n}\nEnhancedFlagMove.prototype = new Base()\n\nexport {\n FragmentAdd,\n FragmentDelete,\n FragmentStereoFlag,\n FragmentAddStereoAtom,\n FragmentDeleteStereoAtom,\n EnhancedFlagMove\n}\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\n/* eslint-disable no-shadow */\n\nimport Vec2 from '../../util/vec2'\nimport scale from '../../util/scale'\nimport Pile from '../../util/pile'\nimport util from '../../render/util'\nimport {\n Atom,\n Bond,\n RGroup,\n RxnArrow,\n RxnPlus,\n SGroup,\n SimpleObject\n} from '../../chem/struct'\nimport {\n ReAtom,\n ReBond,\n ReRxnPlus,\n ReRxnArrow,\n ReRGroup,\n ReSGroup,\n ReSimpleObject\n} from '../../render/restruct'\n\nimport Base, {\n invalidateAtom,\n invalidateBond,\n invalidateItem,\n invalidateLoop\n} from './base'\nimport {\n FragmentAdd,\n FragmentDelete,\n FragmentStereoFlag,\n FragmentAddStereoAtom,\n FragmentDeleteStereoAtom,\n EnhancedFlagMove\n} from './op-frag'\n\nconst tfx = util.tfx\n\nfunction AtomAdd(atom, pos) {\n this.data = { atom, pos, aid: null }\n\n this.execute = function (restruct) {\n const struct = restruct.molecule\n\n const pp = {}\n if (this.data.atom)\n Object.keys(this.data.atom).forEach(p => {\n pp[p] = this.data.atom[p]\n })\n\n pp.label = pp.label || 'C'\n\n if (!(typeof this.data.aid === 'number'))\n this.data.aid = struct.atoms.add(new Atom(pp))\n else struct.atoms.set(this.data.aid, new Atom(pp))\n\n // notifyAtomAdded\n const atomData = new ReAtom(struct.atoms.get(this.data.aid))\n\n atomData.component = restruct.connectedComponents.add(\n new Pile([this.data.aid])\n )\n restruct.atoms.set(this.data.aid, atomData)\n restruct.markAtom(this.data.aid, 1)\n\n struct.atomSetPos(this.data.aid, new Vec2(this.data.pos))\n\n const arrow = struct.rxnArrows.get(0)\n if (arrow) {\n const atom = struct.atoms.get(this.data.aid)\n atom.rxnFragmentType = struct.defineRxnFragmentTypeForAtomset(\n new Pile([this.data.aid]),\n arrow.pp.x\n ) // eslint-disable-line\n }\n }\n\n this.invert = function () {\n const ret = new AtomDelete()\n ret.data = this.data\n return ret\n }\n}\nAtomAdd.prototype = new Base()\n\nfunction AtomDelete(aid) {\n this.data = { aid, atom: null, pos: null }\n\n this.execute = function (restruct) {\n const struct = restruct.molecule\n if (!this.data.atom) {\n this.data.atom = struct.atoms.get(this.data.aid)\n this.data.pos = this.data.atom.pp\n }\n\n // notifyAtomRemoved(this.data.aid);\n const atom = restruct.atoms.get(this.data.aid)\n const set = restruct.connectedComponents.get(atom.component)\n set.delete(this.data.aid)\n if (set.size === 0) restruct.connectedComponents.delete(atom.component)\n restruct.clearVisel(atom.visel)\n restruct.atoms.delete(this.data.aid)\n restruct.markItemRemoved()\n struct.atoms.delete(this.data.aid)\n }\n\n this.invert = function () {\n const ret = new AtomAdd()\n ret.data = this.data\n return ret\n }\n}\nAtomDelete.prototype = new Base()\n\nfunction AtomAttr(aid, attribute, value) {\n this.data = { aid, attribute, value }\n this.data2 = null\n\n this.execute = function (restruct) {\n const atom = restruct.molecule.atoms.get(this.data.aid)\n if (!this.data2) {\n this.data2 = {\n aid: this.data.aid,\n attribute: this.data.attribute,\n value: atom[this.data.attribute]\n }\n }\n\n // TODO: - here\n\n atom[this.data.attribute] = this.data.value\n invalidateAtom(restruct, this.data.aid)\n }\n\n this._isDummy = function (restruct) {\n // eslint-disable-line no-underscore-dangle\n return (\n restruct.molecule.atoms.get(this.data.aid)[this.data.attribute] ===\n this.data.value\n )\n }\n\n this.invert = function () {\n const ret = new AtomAttr()\n ret.data = this.data2\n ret.data2 = this.data\n return ret\n }\n}\nAtomAttr.prototype = new Base()\n\nfunction AtomMove(aid, d, noinvalidate) {\n this.data = { aid, d, noinvalidate }\n\n this.execute = function (restruct) {\n const struct = restruct.molecule\n const aid = this.data.aid\n const d = this.data.d\n struct.atoms.get(aid).pp.add_(d) // eslint-disable-line no-underscore-dangle\n restruct.atoms\n .get(aid)\n .visel.translate(scale.obj2scaled(d, restruct.render.options))\n\n this.data.d = d.negated()\n\n if (!this.data.noinvalidate) invalidateAtom(restruct, aid, 1)\n }\n\n this._isDummy = function () {\n return this.data.d.x === 0 && this.data.d.y === 0\n }\n\n this.invert = function () {\n const ret = new AtomMove()\n ret.data = this.data\n return ret\n }\n}\nAtomMove.prototype = new Base()\n\nfunction BondMove(bid, d) {\n this.data = { bid, d }\n\n this.execute = function (restruct) {\n restruct.bonds\n .get(this.data.bid)\n .visel.translate(scale.obj2scaled(this.data.d, restruct.render.options))\n this.data.d = this.data.d.negated()\n }\n\n this.invert = function () {\n const ret = new BondMove()\n ret.data = this.data\n return ret\n }\n}\nBondMove.prototype = new Base()\n\nfunction LoopMove(id, d) {\n this.data = { id, d }\n\n this.execute = function (restruct) {\n // not sure if there should be an action to move a loop in the first place\n // but we have to somehow move the aromatic ring,\n // which is associated with the loop, rather than with any of the bonds\n if (\n restruct.reloops.get(this.data.id) &&\n restruct.reloops.get(this.data.id).visel\n ) {\n restruct.reloops\n .get(this.data.id)\n .visel.translate(scale.obj2scaled(this.data.d, restruct.render.options))\n }\n this.data.d = this.data.d.negated()\n }\n\n this.invert = function () {\n const ret = new LoopMove()\n ret.data = this.data\n return ret\n }\n}\nLoopMove.prototype = new Base()\n\nfunction SGroupAtomAdd(sgid, aid) {\n this.type = 'OpSGroupAtomAdd'\n this.data = { sgid, aid }\n\n this.execute = function (restruct) {\n const struct = restruct.molecule\n const aid = this.data.aid\n const sgid = this.data.sgid\n const atom = struct.atoms.get(aid)\n const sg = struct.sgroups.get(sgid)\n\n if (sg.atoms.indexOf(aid) >= 0)\n throw new Error(\n 'The same atom cannot be added to an S-group more than once'\n )\n\n if (!atom) throw new Error('OpSGroupAtomAdd: Atom ' + aid + ' not found')\n\n struct.atomAddToSGroup(sgid, aid)\n invalidateAtom(restruct, aid)\n }\n\n this.invert = function () {\n const ret = new SGroupAtomRemove()\n ret.data = this.data\n return ret\n }\n}\nSGroupAtomAdd.prototype = new Base()\n\nfunction SGroupAtomRemove(sgid, aid) {\n this.type = 'OpSGroupAtomRemove'\n this.data = { sgid, aid }\n\n this.execute = function (restruct) {\n const aid = this.data.aid\n const sgid = this.data.sgid\n const struct = restruct.molecule\n const atom = struct.atoms.get(aid)\n const sg = struct.sgroups.get(sgid)\n\n SGroup.removeAtom(sg, aid)\n atom.sgs.delete(sgid)\n invalidateAtom(restruct, aid)\n }\n\n this.invert = function () {\n const ret = new SGroupAtomAdd()\n ret.data = this.data\n return ret\n }\n}\nSGroupAtomRemove.prototype = new Base()\n\nfunction SGroupAttr(sgid, attr, value) {\n this.type = 'OpSGroupAttr'\n this.data = { sgid, attr, value }\n\n this.execute = function (restruct) {\n const struct = restruct.molecule\n const sgid = this.data.sgid\n const sg = struct.sgroups.get(sgid)\n\n if (sg.type === 'DAT' && restruct.sgroupData.has(sgid)) {\n // clean the stuff here, else it might be left behind if the sgroups is set to \"attached\"\n restruct.clearVisel(restruct.sgroupData.get(sgid).visel)\n restruct.sgroupData.delete(sgid)\n }\n\n this.data.value = sg.setAttr(this.data.attr, this.data.value)\n }\n\n this.invert = function () {\n const ret = new SGroupAttr()\n ret.data = this.data\n return ret\n }\n}\nSGroupAttr.prototype = new Base()\n\nfunction SGroupCreate(sgid, type, pp) {\n this.type = 'OpSGroupCreate'\n this.data = { sgid, type, pp }\n\n this.execute = function (restruct) {\n const struct = restruct.molecule\n const sg = new SGroup(this.data.type)\n const sgid = this.data.sgid\n\n sg.id = sgid\n struct.sgroups.set(sgid, sg)\n\n if (this.data.pp) struct.sgroups.get(sgid).pp = new Vec2(this.data.pp)\n\n restruct.sgroups.set(sgid, new ReSGroup(struct.sgroups.get(sgid)))\n this.data.sgid = sgid\n }\n\n this.invert = function () {\n const ret = new SGroupDelete()\n ret.data = this.data\n return ret\n }\n}\nSGroupCreate.prototype = new Base()\n\nfunction SGroupDelete(sgid) {\n this.type = 'OpSGroupDelete'\n this.data = { sgid }\n\n this.execute = function (restruct) {\n const struct = restruct.molecule\n const sgid = this.data.sgid\n const sg = restruct.sgroups.get(sgid)\n\n this.data.type = sg.item.type\n this.data.pp = sg.item.pp\n\n if (sg.item.type === 'DAT' && restruct.sgroupData.has(sgid)) {\n restruct.clearVisel(restruct.sgroupData.get(sgid).visel)\n restruct.sgroupData.delete(sgid)\n }\n\n restruct.clearVisel(sg.visel)\n if (sg.item.atoms.length !== 0) throw new Error('S-Group not empty!')\n\n restruct.sgroups.delete(sgid)\n struct.sgroups.delete(sgid)\n }\n\n this.invert = function () {\n const ret = new SGroupCreate()\n ret.data = this.data\n return ret\n }\n}\nSGroupDelete.prototype = new Base()\n\nfunction SGroupAddToHierarchy(sgid, parent, children) {\n this.type = 'OpSGroupAddToHierarchy'\n this.data = { sgid, parent, children }\n\n this.execute = function (restruct) {\n const struct = restruct.molecule\n const sg = struct.sgroups.get(this.data.sgid)\n const relations = struct.sGroupForest.insert(sg, parent, children)\n\n this.data.parent = relations.parent\n this.data.children = relations.children\n }\n\n this.invert = function () {\n const ret = new SGroupRemoveFromHierarchy()\n ret.data = this.data\n return ret\n }\n}\nSGroupAddToHierarchy.prototype = new Base()\n\nfunction SGroupRemoveFromHierarchy(sgid) {\n this.type = 'OpSGroupRemoveFromHierarchy'\n this.data = { sgid }\n\n this.execute = function (restruct) {\n const struct = restruct.molecule\n const sgid = this.data.sgid\n\n this.data.parent = struct.sGroupForest.parent.get(sgid)\n this.data.children = struct.sGroupForest.children.get(sgid)\n struct.sGroupForest.remove(sgid)\n }\n\n this.invert = function () {\n const ret = new SGroupAddToHierarchy()\n ret.data = this.data\n return ret\n }\n}\nSGroupRemoveFromHierarchy.prototype = new Base()\n\nfunction BondAdd(begin, end, bond) {\n this.data = { bond, begin, end, bid: null }\n\n this.execute = function (restruct) {\n // eslint-disable-line max-statements\n const struct = restruct.molecule\n\n if (this.data.begin === this.data.end)\n throw new Error('Distinct atoms expected')\n\n invalidateAtom(restruct, this.data.begin, 1)\n invalidateAtom(restruct, this.data.end, 1)\n\n const pp = {}\n if (this.data.bond) {\n Object.keys(this.data.bond).forEach(p => {\n pp[p] = this.data.bond[p]\n })\n }\n\n pp.type = pp.type || Bond.PATTERN.TYPE.SINGLE\n pp.begin = this.data.begin\n pp.end = this.data.end\n\n if (!(typeof this.data.bid === 'number'))\n this.data.bid = struct.bonds.add(new Bond(pp))\n else struct.bonds.set(this.data.bid, new Bond(pp))\n\n struct.bondInitHalfBonds(this.data.bid)\n struct.atomAddNeighbor(struct.bonds.get(this.data.bid).hb1)\n struct.atomAddNeighbor(struct.bonds.get(this.data.bid).hb2)\n\n // notifyBondAdded\n restruct.bonds.set(\n this.data.bid,\n new ReBond(struct.bonds.get(this.data.bid))\n )\n restruct.markBond(this.data.bid, 1)\n }\n\n this.invert = function () {\n const ret = new BondDelete()\n ret.data = this.data\n return ret\n }\n}\nBondAdd.prototype = new Base()\n\nfunction BondDelete(bid) {\n this.data = { bid, bond: null, begin: null, end: null }\n\n this.execute = function (restruct) {\n // eslint-disable-line max-statements\n const struct = restruct.molecule\n if (!this.data.bond) {\n this.data.bond = struct.bonds.get(this.data.bid)\n this.data.begin = this.data.bond.begin\n this.data.end = this.data.bond.end\n }\n\n invalidateBond(restruct, this.data.bid)\n\n // notifyBondRemoved\n const rebond = restruct.bonds.get(this.data.bid)\n ;[rebond.b.hb1, rebond.b.hb2].forEach(hbid => {\n const hb = restruct.molecule.halfBonds.get(hbid)\n if (hb.loop >= 0) restruct.loopRemove(hb.loop)\n }, restruct)\n restruct.clearVisel(rebond.visel)\n restruct.bonds.delete(this.data.bid)\n restruct.markItemRemoved()\n\n const bond = struct.bonds.get(this.data.bid)\n ;[bond.hb1, bond.hb2].forEach(hbid => {\n const hb = struct.halfBonds.get(hbid)\n const atom = struct.atoms.get(hb.begin)\n const pos = atom.neighbors.indexOf(hbid)\n const prev = (pos + atom.neighbors.length - 1) % atom.neighbors.length\n const next = (pos + 1) % atom.neighbors.length\n struct.setHbNext(atom.neighbors[prev], atom.neighbors[next])\n atom.neighbors.splice(pos, 1)\n })\n struct.halfBonds.delete(bond.hb1)\n struct.halfBonds.delete(bond.hb2)\n\n struct.bonds.delete(this.data.bid)\n }\n\n this.invert = function () {\n const ret = new BondAdd()\n ret.data = this.data\n return ret\n }\n}\nBondDelete.prototype = new Base()\n\nfunction BondAttr(bid, attribute, value) {\n this.data = { bid, attribute, value }\n this.data2 = null\n\n this.execute = function (restruct) {\n const bond = restruct.molecule.bonds.get(this.data.bid)\n\n if (!this.data2) {\n this.data2 = {\n bid: this.data.bid,\n attribute: this.data.attribute,\n value: bond[this.data.attribute]\n }\n }\n\n bond[this.data.attribute] = this.data.value\n\n invalidateBond(restruct, this.data.bid)\n if (this.data.attribute === 'type') invalidateLoop(restruct, this.data.bid)\n }\n\n this._isDummy = function (restruct) {\n // eslint-disable-line no-underscore-dangle\n return (\n restruct.molecule.bonds.get(this.data.bid)[this.data.attribute] ===\n this.data.value\n )\n }\n\n this.invert = function () {\n const ret = new BondAttr()\n ret.data = this.data2\n ret.data2 = this.data\n return ret\n }\n}\nBondAttr.prototype = new Base()\n\nfunction RGroupAttr(rgid, attribute, value) {\n this.data = { rgid, attribute, value }\n this.data2 = null\n\n this.execute = function (restruct) {\n const rgp = restruct.molecule.rgroups.get(this.data.rgid)\n if (!this.data2) {\n this.data2 = {\n rgid: this.data.rgid,\n attribute: this.data.attribute,\n value: rgp[this.data.attribute]\n }\n }\n\n rgp[this.data.attribute] = this.data.value\n\n invalidateItem(restruct, 'rgroups', this.data.rgid)\n }\n\n this._isDummy = function (restruct) {\n // eslint-disable-line no-underscore-dangle\n return (\n restruct.molecule.rgroups.get(this.data.rgid)[this.data.attribute] ===\n this.data.value\n )\n }\n\n this.invert = function () {\n const ret = new RGroupAttr()\n ret.data = this.data2\n ret.data2 = this.data\n return ret\n }\n}\nRGroupAttr.prototype = new Base()\n\nfunction RGroupFragment(rgid, frid, rg) {\n this.type = 'OpAddOrDeleteRGFragment'\n this.rgid_new = rgid\n this.rg_new = rg\n this.rgid_old = null\n this.rg_old = null\n this.frid = frid\n\n this.execute = function (restruct) {\n // eslint-disable-line max-statements\n const struct = restruct.molecule\n this.rgid_old =\n this.rgid_old || RGroup.findRGroupByFragment(struct.rgroups, this.frid)\n this.rg_old = this.rgid_old ? struct.rgroups.get(this.rgid_old) : null\n\n if (this.rg_old) {\n this.rg_old.frags.delete(this.frid)\n restruct.clearVisel(restruct.rgroups.get(this.rgid_old).visel)\n\n if (this.rg_old.frags.size === 0) {\n restruct.rgroups.delete(this.rgid_old)\n struct.rgroups.delete(this.rgid_old)\n restruct.markItemRemoved()\n } else {\n restruct.markItem('rgroups', this.rgid_old, 1)\n }\n }\n\n if (this.rgid_new) {\n let rgNew = struct.rgroups.get(this.rgid_new)\n if (!rgNew) {\n rgNew = this.rg_new || new RGroup()\n struct.rgroups.set(this.rgid_new, rgNew)\n restruct.rgroups.set(this.rgid_new, new ReRGroup(rgNew))\n } else {\n restruct.markItem('rgroups', this.rgid_new, 1)\n }\n rgNew.frags.add(this.frid)\n }\n }\n\n this.invert = function () {\n return new RGroupFragment(this.rgid_old, this.frid, this.rg_old)\n }\n}\nRGroupFragment.prototype = new Base()\n\nfunction UpdateIfThen(rgNew, rgOld, skipRgids = []) {\n this.type = 'OpUpdateIfThenValues'\n this.rgid_new = rgNew\n this.rgid_old = rgOld\n this.ifThenHistory = new Map()\n\n this.execute = function (restruct) {\n const struct = restruct.molecule\n\n struct.rgroups.forEach((rg, rgid) => {\n if (rg.ifthen === this.rgid_old && !skipRgids.includes(rgid)) {\n rg.ifthen = this.rgid_new\n this.ifThenHistory.set(rgid, this.rgid_old)\n struct.rgroups.set(rgid, rg)\n }\n })\n }\n\n this.invert = function () {\n return new RestoreIfThen(this.rgid_new, this.rgid_old, this.ifThenHistory)\n }\n}\nUpdateIfThen.prototype = new Base()\n\nfunction RestoreIfThen(rgNew, rgOld, history) {\n this.type = 'OpRestoreIfThenValues'\n this.rgid_new = rgNew\n this.rgid_old = rgOld\n this.ifThenHistory = history || new Map()\n\n this.execute = function (restruct) {\n const struct = restruct.molecule\n\n this.ifThenHistory.forEach((rg, rgid) => {\n const rgValue = struct.rgroups.get(rgid)\n rgValue.ifthen = rg\n struct.rgroups.set(rgid, rgValue)\n })\n }\n\n this.invert = function () {\n return new UpdateIfThen(this.rgid_old, this.rgid_new)\n }\n}\nRestoreIfThen.prototype = new Base()\n\nfunction RxnArrowAdd(pos) {\n this.data = { pos, arid: null }\n\n this.execute = function (restruct) {\n const struct = restruct.molecule\n\n if (!(typeof this.data.arid === 'number'))\n this.data.arid = struct.rxnArrows.add(new RxnArrow())\n else struct.rxnArrows.set(this.data.arid, new RxnArrow())\n\n // notifyRxnArrowAdded\n restruct.rxnArrows.set(\n this.data.arid,\n new ReRxnArrow(struct.rxnArrows.get(this.data.arid))\n )\n\n struct.rxnArrowSetPos(this.data.arid, new Vec2(this.data.pos))\n\n let { reactants, products } = struct.getComponents()\n\n reactants = reactants.reduce((acc, item) => acc.concat(...item), [])\n products = products.reduce((acc, item) => acc.concat(...item), [])\n\n reactants.forEach(aid => {\n const atom = struct.atoms.get(aid)\n atom.rxnFragmentType = 1\n })\n\n products.forEach(aid => {\n const atom = struct.atoms.get(aid)\n atom.rxnFragmentType = 2\n })\n\n invalidateItem(restruct, 'rxnArrows', this.data.arid, 1)\n }\n\n this.invert = function () {\n const ret = new RxnArrowDelete()\n ret.data = this.data\n return ret\n }\n}\nRxnArrowAdd.prototype = new Base()\n\nfunction RxnArrowDelete(arid) {\n this.data = { arid, pos: null }\n\n this.execute = function (restruct) {\n const struct = restruct.molecule\n\n if (!this.data.pos) this.data.pos = struct.rxnArrows.get(this.data.arid).pp\n\n // notifyRxnArrowRemoved\n restruct.markItemRemoved()\n restruct.clearVisel(restruct.rxnArrows.get(this.data.arid).visel)\n restruct.rxnArrows.delete(this.data.arid)\n\n struct.rxnArrows.delete(this.data.arid)\n\n struct.atoms.forEach(atom => {\n atom.rxnFragmentType = -1\n })\n }\n\n this.invert = function () {\n const ret = new RxnArrowAdd()\n ret.data = this.data\n return ret\n }\n}\nRxnArrowDelete.prototype = new Base()\n\nfunction RxnArrowMove(id, d, noinvalidate) {\n this.data = { id, d, noinvalidate }\n\n this.execute = function (restruct) {\n const struct = restruct.molecule\n const id = this.data.id\n const d = this.data.d\n struct.rxnArrows.get(id).pp.add_(d) // eslint-disable-line no-underscore-dangle\n restruct.rxnArrows\n .get(id)\n .visel.translate(scale.obj2scaled(d, restruct.render.options))\n this.data.d = d.negated()\n if (!this.data.noinvalidate) invalidateItem(restruct, 'rxnArrows', id, 1)\n }\n\n this.invert = function () {\n const ret = new RxnArrowMove()\n ret.data = this.data\n return ret\n }\n}\nRxnArrowMove.prototype = new Base()\n\nfunction RxnPlusAdd(pos) {\n this.data = { plid: null, pos }\n\n this.execute = function (restruct) {\n const struct = restruct.molecule\n if (!(typeof this.data.plid === 'number'))\n this.data.plid = struct.rxnPluses.add(new RxnPlus())\n else struct.rxnPluses.set(this.data.plid, new RxnPlus())\n\n // notifyRxnPlusAdded\n restruct.rxnPluses.set(\n this.data.plid,\n new ReRxnPlus(struct.rxnPluses.get(this.data.plid))\n )\n\n struct.rxnPlusSetPos(this.data.plid, new Vec2(this.data.pos))\n\n invalidateItem(restruct, 'rxnPluses', this.data.plid, 1)\n }\n\n this.invert = function () {\n const ret = new RxnPlusDelete()\n ret.data = this.data\n return ret\n }\n}\nRxnPlusAdd.prototype = new Base()\n\nfunction RxnPlusDelete(plid) {\n this.data = { plid, pos: null }\n\n this.execute = function (restruct) {\n const struct = restruct.molecule\n if (!this.data.pos) this.data.pos = struct.rxnPluses.get(this.data.plid).pp\n\n // notifyRxnPlusRemoved\n restruct.markItemRemoved()\n restruct.clearVisel(restruct.rxnPluses.get(this.data.plid).visel)\n restruct.rxnPluses.delete(this.data.plid)\n\n struct.rxnPluses.delete(this.data.plid)\n }\n\n this.invert = function () {\n const ret = new RxnPlusAdd()\n ret.data = this.data\n return ret\n }\n}\nRxnPlusDelete.prototype = new Base()\n\nfunction RxnPlusMove(id, d, noinvalidate) {\n this.data = { id, d, noinvalidate }\n\n this.execute = function (restruct) {\n const struct = restruct.molecule\n const id = this.data.id\n const d = this.data.d\n struct.rxnPluses.get(id).pp.add_(d) // eslint-disable-line no-underscore-dangle\n restruct.rxnPluses\n .get(id)\n .visel.translate(scale.obj2scaled(d, restruct.render.options))\n this.data.d = d.negated()\n if (!this.data.noinvalidate) invalidateItem(restruct, 'rxnPluses', id, 1)\n }\n\n this.invert = function () {\n const ret = new RxnPlusMove()\n ret.data = this.data\n return ret\n }\n}\nRxnPlusMove.prototype = new Base()\n\nfunction SGroupDataMove(id, d) {\n this.data = { id, d }\n\n this.execute = function (restruct) {\n const { sgroups } = restruct.molecule\n sgroups.get(this.data.id).pp.add_(this.data.d) // eslint-disable-line no-underscore-dangle\n this.data.d = this.data.d.negated()\n invalidateItem(restruct, 'sgroupData', this.data.id, 1) // [MK] this currently does nothing since the DataSGroupData Visel only contains the highlighting/selection and SGroups are redrawn every time anyway\n }\n\n this.invert = function () {\n const ret = new SGroupDataMove()\n ret.data = this.data\n return ret\n }\n}\nSGroupDataMove.prototype = new Base()\n\nfunction CanvasLoad(struct) {\n this.data = { struct }\n\n this.execute = function (restruct) {\n const oldStruct = restruct.molecule\n restruct.clearVisels() // TODO: What is it?\n restruct.render.setMolecule(this.data.struct)\n this.data.struct = oldStruct\n }\n\n this.invert = function () {\n const ret = new CanvasLoad()\n ret.data = this.data\n return ret\n }\n}\nCanvasLoad.prototype = new Base()\n\nfunction AlignDescriptors() {\n this.type = 'OpAlignDescriptors'\n this.history = {}\n\n this.execute = function (restruct) {\n const sgroups = Array.from(restruct.molecule.sgroups.values()).reverse()\n\n const structBox = restruct.molecule.getCoordBoundingBoxObj()\n let alignPoint = new Vec2(structBox.max.x, structBox.min.y).add(\n new Vec2(2.0, -1.0)\n )\n\n sgroups.forEach(sg => {\n this.history[sg.id] = new Vec2(sg.pp)\n alignPoint = alignPoint.add(new Vec2(0.0, 0.5))\n sg.pp = alignPoint\n restruct.molecule.sgroups.set(sg.id, sg)\n invalidateItem(restruct, 'sgroupData', sg.id, 1)\n })\n }\n\n this.invert = function () {\n return new RestoreDescriptorsPosition(this.history)\n }\n}\nAlignDescriptors.prototype = new Base()\n\nfunction RestoreDescriptorsPosition(history) {\n this.type = 'OpRestoreDescriptorsPosition'\n this.history = history\n\n this.execute = function (restruct) {\n const sgroups = Array.from(restruct.molecule.sgroups.values())\n\n sgroups.forEach(sg => {\n sg.pp = this.history[sg.id]\n restruct.molecule.sgroups.set(sg.id, sg)\n invalidateItem(restruct, 'sgroupData', sg.id, 1)\n })\n }\n\n this.invert = function () {\n return new AlignDescriptors()\n }\n}\nRestoreDescriptorsPosition.prototype = new Base()\n\nfunction SimpleObjectAdd(pos, mode) {\n this.data = { id: null, pos, mode }\n\n let performed = false\n this.execute = function (restruct) {\n const struct = restruct.molecule\n if (!performed) {\n this.data.id = struct.simpleObjects.add(new SimpleObject({ mode }))\n performed = true\n } else {\n struct.simpleObjects.set(this.data.id, new SimpleObject({ mode }))\n }\n\n restruct.simpleObjects.set(\n this.data.id,\n new ReSimpleObject(struct.simpleObjects.get(this.data.id))\n )\n\n struct.simpleObjectSetPos(\n this.data.id,\n this.data.pos.map(p => new Vec2(p))\n )\n\n invalidateItem(restruct, 'simpleObjects', this.data.id, 1)\n }\n\n this.invert = function () {\n const ret = new SimpleObjectDelete()\n ret.data = this.data\n return ret\n }\n}\nSimpleObjectAdd.prototype = new Base()\n\nfunction SimpleObjectDelete(id) {\n this.data = { id, pos: null, item: null }\n let performed = false\n this.execute = function (restruct) {\n const struct = restruct.molecule\n if (!performed) {\n const item = struct.simpleObjects.get(this.data.id)\n this.data.pos = item.pos\n this.data.mode = item.mode\n }\n\n // notifyRxnPlusRemoved\n restruct.markItemRemoved()\n restruct.clearVisel(restruct.simpleObjects.get(this.data.id).visel)\n restruct.simpleObjects.delete(this.data.id)\n\n struct.simpleObjects.delete(this.data.id)\n }\n\n this.invert = function () {\n const ret = new SimpleObjectAdd()\n ret.data = this.data\n return ret\n }\n}\nSimpleObjectDelete.prototype = new Base()\n\nfunction SimpleObjectMove(id, d, noinvalidate) {\n this.data = { id, d, noinvalidate }\n\n this.execute = function (restruct) {\n const struct = restruct.molecule\n const id = this.data.id\n const d = this.data.d\n const item = struct.simpleObjects.get(id)\n item.pos.forEach(p => p.add_(d))\n restruct.simpleObjects\n .get(id)\n .visel.translate(scale.obj2scaled(d, restruct.render.options))\n this.data.d = d.negated()\n if (!this.data.noinvalidate)\n invalidateItem(restruct, 'simpleObjects', id, 1)\n }\n\n this.invert = function () {\n const ret = new SimpleObjectMove()\n ret.data = this.data\n return ret\n }\n}\nSimpleObjectMove.prototype = new Base()\n\nfunction SimpleObjectResize(id, d, current, anchor, noinvalidate) {\n this.data = { id, d, current, anchor, noinvalidate }\n this.execute = function (restruct) {\n const struct = restruct.molecule\n const id = this.data.id\n const d = this.data.d\n const current = this.data.current\n const item = struct.simpleObjects.get(id)\n const anchor = this.data.anchor\n\n if (item.mode === 'circle') {\n const previousPos1 = item.pos[1].get_xy0()\n item.pos[1].x = current.x\n item.pos[1].y = current.y\n this.data.current = previousPos1\n } else if (item.mode === 'line' && anchor) {\n const previousPos1 = anchor.get_xy0()\n anchor.x = current.x\n anchor.y = current.y\n this.data.current = previousPos1\n } else if (item.mode === 'rectangle' && anchor) {\n const previousPos0 = item.pos[0].get_xy0()\n const previousPos1 = item.pos[1].get_xy0()\n\n if (tfx(anchor.x) === tfx(item.pos[1].x)) {\n item.pos[1].x = anchor.x = current.x\n this.data.current.x = previousPos1.x\n }\n if (tfx(anchor.y) === tfx(item.pos[1].y)) {\n item.pos[1].y = anchor.y = current.y\n this.data.current.y = previousPos1.y\n }\n if (tfx(anchor.x) === tfx(item.pos[0].x)) {\n item.pos[0].x = anchor.x = current.x\n this.data.current.x = previousPos0.x\n }\n if (tfx(anchor.y) === tfx(item.pos[0].y)) {\n item.pos[0].y = anchor.y = current.y\n this.data.current.y = previousPos0.y\n }\n } else item.pos[1].add_(d)\n\n restruct.simpleObjects\n .get(id)\n .visel.translate(scale.obj2scaled(d, restruct.render.options))\n this.data.d = d.negated()\n if (!this.data.noinvalidate)\n invalidateItem(restruct, 'simpleObjects', id, 1)\n }\n\n this.invert = function () {\n const ret = new SimpleObjectResize()\n ret.data = this.data\n return ret\n }\n}\nSimpleObjectResize.prototype = new Base()\n\nconst operations = {\n AtomAdd,\n AtomDelete,\n AtomAttr,\n AtomMove,\n BondMove,\n LoopMove,\n SGroupAtomAdd,\n SGroupAtomRemove,\n SGroupAttr,\n SGroupCreate,\n SGroupDelete,\n SGroupAddToHierarchy,\n SGroupRemoveFromHierarchy,\n BondAdd,\n BondDelete,\n BondAttr,\n RGroupAttr,\n RGroupFragment,\n RxnArrowAdd,\n RxnArrowDelete,\n RxnArrowMove,\n RxnPlusAdd,\n RxnPlusDelete,\n RxnPlusMove,\n SGroupDataMove,\n CanvasLoad,\n UpdateIfThen,\n AlignDescriptors,\n\n FragmentAdd,\n FragmentDelete,\n FragmentStereoFlag,\n FragmentAddStereoAtom,\n FragmentDeleteStereoAtom,\n EnhancedFlagMove,\n\n SimpleObjectAdd,\n SimpleObjectDelete,\n SimpleObjectMove,\n SimpleObjectResize\n}\n\nexport default operations\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\n//\n// Undo/redo actions\n//\nfunction Action() {\n this.operations = []\n}\n\nAction.prototype.addOp = function (operation, restruct) {\n if (!restruct || !operation.isDummy(restruct)) this.operations.push(operation)\n\n return operation\n}\n\nAction.prototype.mergeWith = function (action) {\n this.operations = this.operations.concat(action.operations)\n return this\n}\n\n// Perform action and return inverted one\nAction.prototype.perform = function (restruct) {\n const action = new Action()\n\n this.operations.forEach(operation => {\n action.addOp(operation.perform(restruct))\n })\n\n action.operations.reverse()\n return action\n}\n\nAction.prototype.isDummy = function (restruct) {\n return (\n this.operations.find(\n // TODO [RB] the condition is always true for op.* operations\n operation => (restruct ? !operation.isDummy(restruct) : true)\n ) === undefined\n )\n}\n\nexport default Action\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport op from '../operations/op'\nimport Action from '../shared/action'\n\nexport function fromNewCanvas(restruct, struct) {\n var action = new Action()\n\n action.addOp(new op.CanvasLoad(struct))\n return action.perform(restruct)\n}\n\nexport function fromDescriptorsAlign(restruct) {\n const action = new Action()\n action.addOp(new op.AlignDescriptors(restruct))\n return action.perform(restruct)\n}\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport Vec2 from '../../util/vec2'\n\nconst SELECTION_DISTANCE_COEFFICIENT = 0.4\n\nconst findMaps = {\n atoms: findClosestAtom,\n bonds: findClosestBond,\n enhancedFlags: findClosestEnhancedFlag,\n sgroupData: findClosestDataSGroupData,\n sgroups: findClosestSGroup,\n rxnArrows: findClosestRxnArrow,\n rxnPluses: findClosestRxnPlus,\n frags: findClosestFrag,\n rgroups: findClosestRGroup,\n simpleObjects: findClosestSimpleObject\n}\n\nfunction findClosestSimpleObject(restruct, pos) {\n let minDist = null\n let refPoint = null\n let ret = null\n\n restruct.simpleObjects.forEach((simpleObject, id) => {\n const dist = simpleObject.calcDistance(pos, restruct.render.options.scale)\n\n if (dist.minDist < 0.3 && (!ret || dist.minDist < minDist)) {\n minDist = dist.minDist\n refPoint = dist.refPoint\n\n ret = { id, dist: minDist, ref: refPoint }\n }\n })\n\n return ret\n}\n\nfunction findClosestAtom(restruct, pos, skip, minDist) {\n let closestAtom = null\n const maxMinDist = SELECTION_DISTANCE_COEFFICIENT\n const skipId = skip && skip.map === 'atoms' ? skip.id : null\n\n minDist = minDist || maxMinDist\n minDist = Math.min(minDist, maxMinDist)\n\n restruct.atoms.forEach((atom, aid) => {\n if (aid === skipId) return\n\n const dist = Vec2.dist(pos, atom.a.pp)\n\n if (dist < minDist) {\n closestAtom = aid\n minDist = dist\n }\n })\n\n if (closestAtom !== null) {\n return {\n id: closestAtom,\n dist: minDist\n }\n }\n\n return null\n}\n\nfunction findClosestBond(restruct, pos, skip, minDist, scale) {\n // eslint-disable-line max-params\n let closestBond = null\n let closestBondCenter = null\n const maxMinDist = 0.8 * SELECTION_DISTANCE_COEFFICIENT\n const skipId = skip && skip.map === 'bonds' ? skip.id : null\n\n minDist = minDist || maxMinDist\n minDist = Math.min(minDist, maxMinDist)\n\n let minCDist = minDist\n\n restruct.bonds.forEach((bond, bid) => {\n if (bid === skipId) return\n\n const p1 = restruct.atoms.get(bond.b.begin).a.pp\n const p2 = restruct.atoms.get(bond.b.end).a.pp\n\n const mid = Vec2.lc2(p1, 0.5, p2, 0.5)\n const cdist = Vec2.dist(pos, mid)\n\n if (cdist < minCDist) {\n minCDist = cdist\n closestBondCenter = bid\n }\n })\n\n restruct.bonds.forEach((bond, bid) => {\n if (bid === skipId) return\n\n const hb = restruct.molecule.halfBonds.get(bond.b.hb1)\n const dir = hb.dir\n const norm = hb.norm\n\n const p1 = restruct.atoms.get(bond.b.begin).a.pp\n const p2 = restruct.atoms.get(bond.b.end).a.pp\n\n const inStripe = Vec2.dot(pos.sub(p1), dir) * Vec2.dot(pos.sub(p2), dir) < 0\n\n if (inStripe) {\n const dist = Math.abs(Vec2.dot(pos.sub(p1), norm))\n\n if (dist < minDist) {\n closestBond = bid\n minDist = dist\n }\n }\n })\n\n if (closestBondCenter !== null) {\n return {\n id: closestBondCenter,\n dist: minCDist\n }\n }\n\n if (\n closestBond !== null &&\n minDist > SELECTION_DISTANCE_COEFFICIENT * scale\n ) {\n return {\n id: closestBond,\n dist: minDist\n }\n }\n\n return null\n}\n\nfunction findClosestEnhancedFlag(restruct, pos) {\n let minDist\n let ret = null\n restruct.enhancedFlags.forEach((item, id) => {\n const p = item.pp\n if (!p || Math.abs(pos.x - p.x) >= 1.0) return\n\n const dist = Math.abs(pos.y - p.y)\n\n if (dist < 0.3 && (!ret || dist < minDist)) {\n minDist = dist\n ret = { id, dist: minDist }\n }\n })\n return ret\n}\n\nfunction findClosestDataSGroupData(restruct, pos) {\n let minDist = null\n let ret = null\n\n restruct.sgroupData.forEach((item, id) => {\n if (item.sgroup.type !== 'DAT') throw new Error('Data group expected')\n\n if (item.sgroup.data.fieldName !== 'MRV_IMPLICIT_H') {\n const box = item.sgroup.dataArea\n const inBox =\n box.p0.y < pos.y &&\n box.p1.y > pos.y &&\n box.p0.x < pos.x &&\n box.p1.x > pos.x\n const xDist = Math.min(\n Math.abs(box.p0.x - pos.x),\n Math.abs(box.p1.x - pos.x)\n )\n\n if (inBox && (ret === null || xDist < minDist)) {\n ret = { id, dist: xDist }\n minDist = xDist\n }\n }\n })\n\n return ret\n}\n\nfunction findClosestFrag(restruct, pos, skip, minDist, scale) {\n minDist = Math.min(\n minDist || SELECTION_DISTANCE_COEFFICIENT,\n SELECTION_DISTANCE_COEFFICIENT\n )\n\n const struct = restruct.molecule\n\n const closestAtom = findClosestAtom(restruct, pos, skip, minDist)\n\n if (closestAtom) {\n return {\n id: struct.atoms.get(closestAtom.id).fragment,\n dist: closestAtom.dist\n }\n }\n\n const closestBond = findClosestBond(restruct, pos, skip, minDist, scale)\n\n if (closestBond) {\n const atomId = struct.bonds.get(closestBond.id).begin\n return {\n id: struct.atoms.get(atomId).fragment,\n dist: closestBond.dist\n }\n }\n\n return null\n}\n\nfunction findClosestRGroup(restruct, pos, skip, minDist) {\n minDist = Math.min(\n minDist || SELECTION_DISTANCE_COEFFICIENT,\n SELECTION_DISTANCE_COEFFICIENT\n )\n\n let ret = null\n\n restruct.rgroups.forEach((rgroup, rgid) => {\n if (\n rgid !== skip &&\n rgroup.labelBox &&\n rgroup.labelBox.contains(pos, 0.5)\n ) {\n const dist = Vec2.dist(rgroup.labelBox.centre(), pos)\n\n if (!ret || dist < minDist) {\n minDist = dist\n ret = { id: rgid, dist: minDist }\n }\n }\n })\n\n return ret\n}\n\nfunction findClosestRxnArrow(restruct, pos) {\n let minDist = null\n let ret = null\n\n restruct.rxnArrows.forEach((arrow, id) => {\n const p = arrow.item.pp\n\n if (Math.abs(pos.x - p.x) >= 1.0) return\n\n const dist = Math.abs(pos.y - p.y)\n\n if (dist < 0.3 && (!ret || dist < minDist)) {\n minDist = dist\n ret = { id, dist: minDist }\n }\n })\n\n return ret\n}\n\nfunction findClosestRxnPlus(restruct, pos) {\n let minDist = null\n let ret = null\n\n restruct.rxnPluses.forEach((plus, id) => {\n const p = plus.item.pp\n const dist = Math.max(Math.abs(pos.x - p.x), Math.abs(pos.y - p.y))\n\n if (dist < 0.3 && (!ret || dist < minDist)) {\n minDist = dist\n ret = { id, dist: minDist }\n }\n })\n\n return ret\n}\n\nfunction findClosestSGroup(restruct, pos) {\n let ret = null\n let minDist = SELECTION_DISTANCE_COEFFICIENT\n\n restruct.molecule.sgroups.forEach((sg, sgid) => {\n const d = sg.bracketDir\n const n = d.rotateSC(1, 0)\n const pg = new Vec2(Vec2.dot(pos, d), Vec2.dot(pos, n))\n\n sg.areas.forEach(box => {\n const inBox =\n box.p0.y < pg.y && box.p1.y > pg.y && box.p0.x < pg.x && box.p1.x > pg.x\n const xDist = Math.min(\n Math.abs(box.p0.x - pg.x),\n Math.abs(box.p1.x - pg.x)\n )\n\n if (inBox && (ret === null || xDist < minDist)) {\n ret = sgid\n minDist = xDist\n }\n })\n })\n\n if (ret !== null) {\n return {\n id: ret,\n dist: minDist\n }\n }\n\n return null\n}\n\nfunction findClosestItem(restruct, pos, maps, skip, scale) {\n // eslint-disable-line max-params\n maps = maps || Object.keys(findMaps)\n\n return maps.reduce((res, mp) => {\n const minDist = res ? res.dist : null\n const item = findMaps[mp](restruct, pos, skip, minDist, scale)\n\n if (item !== null && (res === null || item.dist < res.dist)) {\n const { id, dist, ...other } = item\n return {\n map: mp,\n id: id,\n dist: dist,\n ...other\n }\n }\n\n return res\n }, null)\n}\n\n/**\n * @param restruct { ReStruct }\n * @param selected { object }\n * @param maps { Array }\n * @param scale { number }\n * @return {{\n * \t\tatoms: Map?\n * \t\tbonds: Map?\n * }}\n */\nfunction findCloseMerge(restruct, selected, maps = ['atoms', 'bonds'], scale) {\n const pos = {\n atoms: new Map(), // aid -> position\n bonds: new Map() // bid -> position\n }\n\n const struct = restruct.molecule\n\n selected.atoms.forEach(aid => {\n pos.atoms.set(aid, struct.atoms.get(aid).pp)\n })\n\n selected.bonds.forEach(bid => {\n const bond = struct.bonds.get(bid)\n pos.bonds.set(\n bid,\n Vec2.lc2(\n struct.atoms.get(bond.begin).pp,\n 0.5,\n struct.atoms.get(bond.end).pp,\n 0.5\n )\n )\n })\n\n const result = {}\n maps.forEach(mp => {\n result[mp] = Array.from(pos[mp].keys()).reduce((res, srcId) => {\n const skip = { map: mp, id: srcId }\n const item = findMaps[mp](restruct, pos[mp].get(srcId), skip, null, scale)\n\n if (item && !selected[mp].includes(item.id)) res.set(srcId, item.id)\n\n return res\n }, new Map())\n })\n\n return result\n}\n\nexport default {\n atom: findClosestAtom, // used in Actions\n item: findClosestItem,\n merge: findCloseMerge\n}\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport { difference } from 'lodash'\nimport Vec2 from '../../util/vec2'\nimport closest from '../shared/closest'\n\nexport function atomGetAttr(restruct, aid, name) {\n return restruct.molecule.atoms.get(aid)[name]\n}\n\nexport function atomGetDegree(restruct, aid) {\n return restruct.atoms.get(aid).a.neighbors.length\n}\n\nexport function atomGetNeighbors(restruct, aid) {\n return restruct.atoms.get(aid).a.neighbors.map(nei => {\n const hb = restruct.molecule.halfBonds.get(nei)\n return {\n aid: hb.end,\n bid: hb.bid\n }\n })\n}\n\nexport function atomGetSGroups(restruct, aid) {\n return Array.from(restruct.atoms.get(aid).a.sgs)\n}\n\nexport function atomGetPos(restruct, id) {\n return restruct.molecule.atoms.get(id).pp\n}\n\nexport function findStereoAtoms(struct, aids) {\n return aids.filter(aid => struct.atoms.get(aid).stereoLabel !== null)\n}\n\nexport function structSelection(struct) {\n return [\n 'atoms',\n 'bonds',\n 'frags',\n 'sgroups',\n 'rgroups',\n 'rxnArrows',\n 'rxnPluses',\n 'simpleObjects'\n ].reduce((res, key) => {\n res[key] = Array.from(struct[key].keys())\n return res\n }, {})\n}\n\n// Get new atom id/label and pos for bond being added to existing atom\nexport function atomForNewBond(restruct, id) {\n // eslint-disable-line max-statements\n const neighbours = []\n const pos = atomGetPos(restruct, id)\n\n atomGetNeighbors(restruct, id).forEach(nei => {\n const neiPos = atomGetPos(restruct, nei.aid)\n\n if (Vec2.dist(pos, neiPos) < 0.1) return\n\n neighbours.push({ id: nei.aid, v: Vec2.diff(neiPos, pos) })\n })\n\n neighbours.sort(\n (nei1, nei2) =>\n Math.atan2(nei1.v.y, nei1.v.x) - Math.atan2(nei2.v.y, nei2.v.x)\n )\n\n var i\n var maxI = 0\n var angle\n var maxAngle = 0\n\n // TODO: impove layout: tree, ...\n\n for (i = 0; i < neighbours.length; i++) {\n angle = Vec2.angle(\n neighbours[i].v,\n neighbours[(i + 1) % neighbours.length].v\n )\n\n if (angle < 0) angle += 2 * Math.PI\n\n if (angle > maxAngle) {\n maxI = i\n maxAngle = angle\n }\n }\n\n let v = new Vec2(1, 0)\n\n if (neighbours.length > 0) {\n if (neighbours.length === 1) {\n maxAngle = -((4 * Math.PI) / 3)\n\n // zig-zag\n const nei = atomGetNeighbors(restruct, id)[0]\n if (atomGetDegree(restruct, nei.aid) > 1) {\n const neiNeighbours = []\n const neiPos = atomGetPos(restruct, nei.aid)\n const neiV = Vec2.diff(pos, neiPos)\n const neiAngle = Math.atan2(neiV.y, neiV.x)\n\n atomGetNeighbors(restruct, nei.aid).forEach(neiNei => {\n const neiNeiPos = atomGetPos(restruct, neiNei.aid)\n\n if (neiNei.bid === nei.bid || Vec2.dist(neiPos, neiNeiPos) < 0.1)\n return\n\n const vDiff = Vec2.diff(neiNeiPos, neiPos)\n let ang = Math.atan2(vDiff.y, vDiff.x) - neiAngle\n\n if (ang < 0) ang += 2 * Math.PI\n\n neiNeighbours.push(ang)\n })\n neiNeighbours.sort((nei1, nei2) => nei1 - nei2)\n\n if (\n neiNeighbours[0] <= Math.PI * 1.01 &&\n neiNeighbours[neiNeighbours.length - 1] <= 1.01 * Math.PI\n )\n maxAngle *= -1\n }\n }\n\n angle =\n maxAngle / 2 + Math.atan2(neighbours[maxI].v.y, neighbours[maxI].v.x)\n\n v = v.rotate(angle)\n }\n\n v.add_(pos) // eslint-disable-line no-underscore-dangle\n\n let a = closest.atom(restruct, v, null, 0.1)\n a = a === null ? { label: 'C' } : a.id\n\n return { atom: a, pos: v }\n}\n\nexport function getRelSgroupsBySelection(restruct, selectedAtoms) {\n return restruct.molecule.sgroups.filter(\n (sgid, sg) =>\n !sg.data.attached &&\n !sg.data.absolute &&\n difference(sg.atoms, selectedAtoms).length === 0\n )\n}\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nexport const SgContexts = {\n Fragment: 'Fragment',\n Multifragment: 'Multifragment',\n Bond: 'Bond',\n Atom: 'Atom',\n Group: 'Group'\n}\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport { uniq } from 'lodash'\n\nimport { SGroup } from '../../chem/struct'\n\nimport Pile from '../../util/pile'\nimport op from '../operations/op'\nimport Action from '../shared/action'\nimport { SgContexts } from '../shared/constants'\n\nimport { atomGetAttr, atomGetDegree, atomGetSGroups } from './utils'\n\nexport function fromSeveralSgroupAddition(restruct, type, atoms, attrs) {\n const descriptors = attrs.fieldValue\n\n if (typeof descriptors === 'string' || type !== 'DAT')\n return fromSgroupAddition(\n restruct,\n type,\n atoms,\n attrs,\n restruct.molecule.sgroups.newId()\n )\n\n return descriptors.reduce((acc, fValue) => {\n const localAttrs = Object.assign({}, attrs)\n localAttrs.fieldValue = fValue\n\n return acc.mergeWith(\n fromSgroupAddition(\n restruct,\n type,\n atoms,\n localAttrs,\n restruct.molecule.sgroups.newId()\n )\n )\n }, new Action())\n}\n\nexport function fromSgroupAttrs(restruct, id, attrs) {\n const action = new Action()\n\n Object.keys(attrs).forEach(key => {\n action.addOp(new op.SGroupAttr(id, key, attrs[key]))\n })\n\n return action.perform(restruct)\n}\n\nexport function sGroupAttributeAction(id, attrs) {\n const action = new Action()\n\n Object.keys(attrs).forEach(key => {\n action.addOp(new op.SGroupAttr(id, key, attrs[key]))\n })\n\n return action\n}\n\nexport function fromSgroupDeletion(restruct, id) {\n let action = new Action()\n const struct = restruct.molecule\n\n const sG = restruct.sgroups.get(id).item\n\n if (sG.type === 'SRU') {\n struct.sGroupsRecalcCrossBonds()\n\n sG.neiAtoms.forEach(aid => {\n if (atomGetAttr(restruct, aid, 'label') === '*')\n action.addOp(new op.AtomAttr(aid, 'label', 'C'))\n })\n }\n\n const sg = struct.sgroups.get(id)\n const atoms = SGroup.getAtoms(struct, sg)\n const attrs = sg.getAttrs()\n\n action.addOp(new op.SGroupRemoveFromHierarchy(id))\n\n atoms.forEach(atom => {\n action.addOp(new op.SGroupAtomRemove(id, atom))\n })\n\n action.addOp(new op.SGroupDelete(id))\n\n action = action.perform(restruct)\n\n action.mergeWith(sGroupAttributeAction(id, attrs))\n\n return action\n}\n\nexport function fromSgroupAddition(restruct, type, atoms, attrs, sgid, pp) {\n // eslint-disable-line\n let action = new Action()\n\n // TODO: shoud the id be generated when OpSGroupCreate is executed?\n // if yes, how to pass it to the following operations?\n sgid = sgid - 0 === sgid ? sgid : restruct.molecule.sgroups.newId()\n\n action.addOp(new op.SGroupCreate(sgid, type, pp))\n\n atoms.forEach(atom => {\n action.addOp(new op.SGroupAtomAdd(sgid, atom))\n })\n\n action.addOp(\n type !== 'DAT'\n ? new op.SGroupAddToHierarchy(sgid)\n : new op.SGroupAddToHierarchy(sgid, -1, [])\n )\n\n action = action.perform(restruct)\n\n if (type === 'SRU') {\n restruct.molecule.sGroupsRecalcCrossBonds()\n let asteriskAction = new Action()\n\n restruct.sgroups.get(sgid).item.neiAtoms.forEach(aid => {\n const plainCarbon = restruct.atoms.get(aid).a.isPlainCarbon()\n\n if (atomGetDegree(restruct, aid) === 1 && plainCarbon)\n asteriskAction.addOp(new op.AtomAttr(aid, 'label', '*'))\n })\n\n asteriskAction = asteriskAction.perform(restruct)\n asteriskAction.mergeWith(action)\n action = asteriskAction\n }\n\n return fromSgroupAttrs(restruct, sgid, attrs).mergeWith(action)\n}\n\nexport function fromSgroupAction(\n context,\n restruct,\n newSg,\n sourceAtoms,\n selection\n) {\n if (context === SgContexts.Bond)\n return fromBondAction(restruct, newSg, sourceAtoms, selection)\n\n const atomsFromBonds = getAtomsFromBonds(restruct.molecule, selection.bonds)\n const newSourceAtoms = uniq(sourceAtoms.concat(atomsFromBonds))\n\n if (context === SgContexts.Fragment)\n return fromGroupAction(\n restruct,\n newSg,\n newSourceAtoms,\n Array.from(restruct.atoms.keys())\n )\n\n if (context === SgContexts.Multifragment)\n return fromMultiFragmentAction(restruct, newSg, newSourceAtoms)\n\n if (context === SgContexts.Group)\n return fromGroupAction(restruct, newSg, newSourceAtoms, newSourceAtoms)\n\n if (context === SgContexts.Atom)\n return fromAtomAction(restruct, newSg, newSourceAtoms)\n\n return {\n action: fromSeveralSgroupAddition(\n restruct,\n newSg.type,\n sourceAtoms,\n newSg.attrs\n )\n }\n}\n\nfunction fromAtomAction(restruct, newSg, sourceAtoms) {\n return sourceAtoms.reduce(\n (acc, atom) => {\n acc.action = acc.action.mergeWith(\n fromSeveralSgroupAddition(restruct, newSg.type, [atom], newSg.attrs)\n )\n return acc\n },\n {\n action: new Action(),\n selection: {\n atoms: sourceAtoms,\n bonds: []\n }\n }\n )\n}\n\nfunction fromGroupAction(restruct, newSg, sourceAtoms, targetAtoms) {\n const allFragments = new Pile(\n sourceAtoms.map(aid => restruct.atoms.get(aid).a.fragment)\n )\n\n return Array.from(allFragments).reduce(\n (acc, fragId) => {\n const atoms = targetAtoms.reduce((res, aid) => {\n const atom = restruct.atoms.get(aid).a\n if (fragId === atom.fragment) res.push(aid)\n\n return res\n }, [])\n\n const bonds = getAtomsBondIds(restruct.molecule, atoms)\n\n acc.action = acc.action.mergeWith(\n fromSeveralSgroupAddition(restruct, newSg.type, atoms, newSg.attrs)\n )\n\n acc.selection.atoms = acc.selection.atoms.concat(atoms)\n acc.selection.bonds = acc.selection.bonds.concat(bonds)\n\n return acc\n },\n {\n action: new Action(),\n selection: {\n atoms: [],\n bonds: []\n }\n }\n )\n}\n\nfunction fromBondAction(restruct, newSg, sourceAtoms, currSelection) {\n const struct = restruct.molecule\n let bonds = getAtomsBondIds(struct, sourceAtoms)\n\n if (currSelection.bonds) bonds = uniq(bonds.concat(currSelection.bonds))\n\n return bonds.reduce(\n (acc, bondid) => {\n const bond = struct.bonds.get(bondid)\n\n acc.action = acc.action.mergeWith(\n fromSeveralSgroupAddition(\n restruct,\n newSg.type,\n [bond.begin, bond.end],\n newSg.attrs\n )\n )\n\n acc.selection.bonds.push(bondid)\n\n return acc\n },\n {\n action: new Action(),\n selection: {\n atoms: sourceAtoms,\n bonds: []\n }\n }\n )\n}\n\nfunction fromMultiFragmentAction(restruct, newSg, atoms) {\n const bonds = getAtomsBondIds(restruct.molecule, atoms)\n return {\n action: fromSeveralSgroupAddition(restruct, newSg.type, atoms, newSg.attrs),\n selection: {\n atoms,\n bonds\n }\n }\n}\n\n// Add action operation to remove atom from s-group if needed\nexport function removeAtomFromSgroupIfNeeded(action, restruct, id) {\n const sgroups = atomGetSGroups(restruct, id)\n\n if (sgroups.length > 0) {\n sgroups.forEach(sid => {\n action.addOp(new op.SGroupAtomRemove(sid, id))\n })\n\n return true\n }\n\n return false\n}\n\n// Add action operations to remove whole s-group if needed\nexport function removeSgroupIfNeeded(action, restruct, atoms) {\n const struct = restruct.molecule\n const sgCounts = new Map()\n\n atoms.forEach(id => {\n const sgroups = atomGetSGroups(restruct, id)\n\n sgroups.forEach(sid => {\n sgCounts.set(sid, sgCounts.has(sid) ? sgCounts.get(sid) + 1 : 1)\n })\n })\n\n sgCounts.forEach((count, sid) => {\n const sG = restruct.sgroups.get(sid).item\n const sgAtoms = SGroup.getAtoms(restruct.molecule, sG)\n\n if (sgAtoms.length === count) {\n // delete whole s-group\n const sgroup = struct.sgroups.get(sid)\n action.mergeWith(sGroupAttributeAction(sid, sgroup.getAttrs()))\n action.addOp(new op.SGroupRemoveFromHierarchy(sid))\n action.addOp(new op.SGroupDelete(sid))\n }\n })\n}\n\nfunction getAtomsBondIds(struct, atoms) {\n const atomSet = new Pile(atoms)\n\n return Array.from(struct.bonds.keys()).filter(bid => {\n const bond = struct.bonds.get(bid)\n return atomSet.has(bond.begin) && atomSet.has(bond.end)\n })\n}\n\nfunction getAtomsFromBonds(struct, bonds) {\n bonds = bonds || []\n return bonds.reduce((acc, bondid) => {\n const bond = struct.bonds.get(bondid)\n acc = acc.concat([bond.begin, bond.end])\n return acc\n }, [])\n}\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport op from '../operations/op'\nimport Action from '../shared/action'\n\nexport function fromRGroupAttrs(restruct, id, attrs) {\n const action = new Action()\n\n Object.keys(attrs).forEach(key => {\n action.addOp(new op.RGroupAttr(id, key, attrs[key]))\n })\n\n return action.perform(restruct)\n}\n\nexport function fromRGroupFragment(restruct, rgidNew, frid) {\n const action = new Action()\n action.addOp(new op.RGroupFragment(rgidNew, frid))\n\n return action.perform(restruct)\n}\n\nexport function fromUpdateIfThen(restruct, rgidNew, rgidOld, skipRgids) {\n const action = new Action()\n if (!restruct.molecule.rgroups.get(rgidOld))\n action.addOp(new op.UpdateIfThen(rgidNew, rgidOld, skipRgids))\n\n return action.perform(restruct)\n}\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\nimport { without } from 'lodash/fp'\n\nimport { Atom, Bond, RGroup } from '../../chem/struct'\nimport op from '../operations/op'\nimport Action from '../shared/action'\n\nimport {\n atomGetAttr,\n atomGetDegree,\n atomGetNeighbors,\n atomGetSGroups\n} from './utils'\nimport { removeSgroupIfNeeded, removeAtomFromSgroupIfNeeded } from './sgroup'\nimport { fromRGroupFragment, fromUpdateIfThen } from './rgroup'\n\nexport function fromAtomAddition(restruct, pos, atom) {\n atom = Object.assign({}, atom)\n const action = new Action()\n atom.fragment = action.addOp(new op.FragmentAdd().perform(restruct)).frid\n action.addOp(new op.AtomAdd(atom, pos).perform(restruct))\n return action\n}\n\n/**\n * @param restruct { ReStruct }\n * @param ids { Array|number }\n * @param attrs { object }\n * @param reset { boolean? }\n */\nexport function fromAtomsAttrs(restruct, ids, attrs, reset) {\n const action = new Action()\n const aids = Array.isArray(ids) ? ids : [ids]\n\n aids.forEach(aid => {\n Object.keys(Atom.attrlist).forEach(key => {\n if (key === 'attpnt' && !(key in attrs)) return\n if (!(key in attrs) && !reset) return\n\n const value = key in attrs ? attrs[key] : Atom.attrGetDefault(key)\n action.addOp(new op.AtomAttr(aid, key, value))\n })\n\n if (\n !reset &&\n 'label' in attrs &&\n attrs.label !== null &&\n attrs.label !== 'L#' &&\n !attrs['atomList']\n )\n action.addOp(new op.AtomAttr(aid, 'atomList', null))\n })\n\n return action.perform(restruct)\n}\n\nexport function fromStereoAtomAttrs(restruct, aid, attrs, withReverse) {\n const action = new Action()\n const atom = restruct.molecule.atoms.get(aid)\n if (atom) {\n const frid = atom.fragment\n\n if ('stereoParity' in attrs)\n action.addOp(\n new op.AtomAttr(aid, 'stereoParity', attrs['stereoParity']).perform(\n restruct\n )\n )\n if ('stereoLabel' in attrs) {\n action.addOp(\n new op.AtomAttr(aid, 'stereoLabel', attrs['stereoLabel']).perform(\n restruct\n )\n )\n if (attrs['stereoLabel'] === null)\n action.addOp(\n new op.FragmentDeleteStereoAtom(frid, aid).perform(restruct)\n )\n else\n action.addOp(new op.FragmentAddStereoAtom(frid, aid).perform(restruct))\n }\n if (withReverse) action.operations.reverse()\n }\n\n return action\n}\n\nexport function fromAtomsFragmentAttr(restruct, aids, newfrid) {\n const action = new Action()\n\n aids.forEach(aid => {\n const atom = restruct.molecule.atoms.get(aid)\n const oldfrid = atom.fragment\n action.addOp(new op.AtomAttr(aid, 'fragment', newfrid))\n\n if (atom.stereoLabel !== null) {\n action.addOp(new op.FragmentAddStereoAtom(newfrid, aid))\n action.addOp(new op.FragmentDeleteStereoAtom(oldfrid, aid))\n }\n })\n\n return action.perform(restruct)\n}\n\n/**\n * @param restruct { ReStruct }\n * @param srcId { number }\n * @param dstId { number }\n * @return { Action }\n */\nexport function fromAtomMerge(restruct, srcId, dstId) {\n if (srcId === dstId) return new Action()\n\n const fragAction = new Action()\n mergeFragmentsIfNeeded(fragAction, restruct, srcId, dstId)\n\n const action = new Action()\n\n atomGetNeighbors(restruct, srcId).forEach(nei => {\n const bond = restruct.molecule.bonds.get(nei.bid)\n\n if (dstId === bond.begin || dstId === bond.end) {\n // src & dst have one nei\n action.addOp(new op.BondDelete(nei.bid))\n return\n }\n\n const begin = bond.begin === nei.aid ? nei.aid : dstId\n const end = bond.begin === nei.aid ? dstId : nei.aid\n\n const mergeBondId = restruct.molecule.findBondId(begin, end)\n\n if (mergeBondId === null) {\n action.addOp(new op.BondAdd(begin, end, bond))\n } else {\n // replace old bond with new bond\n const attrs = Bond.getAttrHash(bond)\n Object.keys(attrs).forEach(key => {\n action.addOp(new op.BondAttr(mergeBondId, key, attrs[key]))\n })\n }\n\n action.addOp(new op.BondDelete(nei.bid))\n })\n\n const attrs = Atom.getAttrHash(restruct.molecule.atoms.get(srcId))\n\n if (atomGetDegree(restruct, srcId) === 1 && attrs['label'] === '*')\n attrs['label'] = 'C'\n\n Object.keys(attrs).forEach(key => {\n action.addOp(new op.AtomAttr(dstId, key, attrs[key]))\n })\n\n const sgChanged = removeAtomFromSgroupIfNeeded(action, restruct, srcId)\n\n if (sgChanged) removeSgroupIfNeeded(action, restruct, [srcId])\n\n action.addOp(new op.AtomDelete(srcId))\n\n return action.perform(restruct).mergeWith(fragAction)\n}\n\nexport function mergeFragmentsIfNeeded(action, restruct, srcId, dstId) {\n const frid = atomGetAttr(restruct, srcId, 'fragment')\n const frid2 = atomGetAttr(restruct, dstId, 'fragment')\n if (frid2 === frid || typeof frid2 !== 'number') return\n\n const struct = restruct.molecule\n\n const rgid = RGroup.findRGroupByFragment(struct.rgroups, frid2)\n if (!(typeof rgid === 'undefined')) {\n action\n .mergeWith(fromRGroupFragment(restruct, null, frid2))\n .mergeWith(fromUpdateIfThen(restruct, 0, rgid))\n }\n\n const fridAtoms = struct.getFragmentIds(frid)\n\n const atomsToNewFrag = []\n struct.atoms.forEach((atom, aid) => {\n if (atom.fragment === frid2) atomsToNewFrag.push(aid)\n })\n const moveAtomsAction = fromAtomsFragmentAttr(restruct, atomsToNewFrag, frid)\n\n mergeSgroups(action, restruct, fridAtoms, dstId)\n action.addOp(new op.FragmentDelete(frid2).perform(restruct))\n action.mergeWith(moveAtomsAction)\n}\n\nexport function mergeSgroups(action, restruct, srcAtoms, dstAtom) {\n const sgroups = atomGetSGroups(restruct, dstAtom)\n\n sgroups.forEach(sid => {\n const sgroup = restruct.molecule.sgroups.get(sid)\n const notExpandedContexts = ['Atom', 'Bond', 'Group']\n if (\n sgroup.type === 'DAT' &&\n notExpandedContexts.includes(sgroup.data.context)\n )\n return\n const atomsToSgroup = without(sgroup.atoms, srcAtoms)\n atomsToSgroup.forEach(aid =>\n action.addOp(new op.SGroupAtomAdd(sid, aid).perform(restruct))\n )\n })\n}\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport { Atom } from '../../chem/struct'\nimport { fromAtomAddition, fromAtomsAttrs } from '../actions/atom'\n\nfunction RGroupAtomTool(editor) {\n if (!(this instanceof RGroupAtomTool)) {\n // TODO: map atoms with labels\n editor.selection(null)\n return new RGroupAtomTool(editor)\n }\n\n this.editor = editor\n}\n\nRGroupAtomTool.prototype.mousemove = function (event) {\n this.editor.hover(this.editor.findItem(event, ['atoms']))\n}\n\nRGroupAtomTool.prototype.click = function (event) {\n const rnd = this.editor.render\n const ci = this.editor.findItem(event, ['atoms'])\n\n if (!ci) {\n // ci.type == 'Canvas'\n this.editor.hover(null)\n propsDialog(this.editor, null, rnd.page2obj(event))\n return true\n } else if (ci.map === 'atoms') {\n this.editor.hover(null)\n propsDialog(this.editor, ci.id)\n return true\n }\n return true\n}\n\nfunction propsDialog(editor, id, pos) {\n const struct = editor.render.ctab.molecule\n const atom = id || id === 0 ? struct.atoms.get(id) : null\n const rglabel = atom ? atom.rglabel : 0\n const label = atom ? atom.label : 'R#'\n\n const res = editor.event.elementEdit.dispatch({\n label: 'R#',\n rglabel,\n fragId: atom ? atom.fragment : null\n })\n\n Promise.resolve(res)\n .then(elem => {\n // TODO review: using Atom.attrlist as a source of default property values\n elem = Object.assign({}, Atom.attrlist, elem)\n\n if (!id && id !== 0 && elem.rglabel) {\n editor.update(fromAtomAddition(editor.render.ctab, pos, elem))\n } else if (rglabel !== elem.rglabel) {\n elem.aam = atom.aam // WTF??\n elem.attpnt = atom.attpnt\n\n if (!elem.rglabel && label !== 'R#') elem.label = label\n\n editor.update(fromAtomsAttrs(editor.render.ctab, id, elem))\n }\n })\n .catch(() => null) // w/o changes\n}\n\nexport default RGroupAtomTool\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport Vec2 from '../../../util/vec2'\n\nfunction getElementsInRectangle(restruct, p0, p1) {\n const bondList = []\n const atomList = []\n\n const x0 = Math.min(p0.x, p1.x)\n const x1 = Math.max(p0.x, p1.x)\n const y0 = Math.min(p0.y, p1.y)\n const y1 = Math.max(p0.y, p1.y)\n\n restruct.bonds.forEach((bond, bid) => {\n const centre = Vec2.lc2(\n restruct.atoms.get(bond.b.begin).a.pp,\n 0.5,\n restruct.atoms.get(bond.b.end).a.pp,\n 0.5\n )\n if (centre.x > x0 && centre.x < x1 && centre.y > y0 && centre.y < y1)\n bondList.push(bid)\n })\n\n restruct.atoms.forEach((atom, aid) => {\n if (\n atom.a.pp.x > x0 &&\n atom.a.pp.x < x1 &&\n atom.a.pp.y > y0 &&\n atom.a.pp.y < y1\n )\n atomList.push(aid)\n })\n\n const rxnArrowsList = []\n const rxnPlusesList = []\n const simpleObjectsList = []\n\n restruct.rxnArrows.forEach((item, id) => {\n if (\n item.item.pp.x > x0 &&\n item.item.pp.x < x1 &&\n item.item.pp.y > y0 &&\n item.item.pp.y < y1\n )\n rxnArrowsList.push(id)\n })\n\n restruct.rxnPluses.forEach((item, id) => {\n if (\n item.item.pp.x > x0 &&\n item.item.pp.x < x1 &&\n item.item.pp.y > y0 &&\n item.item.pp.y < y1\n )\n rxnPlusesList.push(id)\n })\n\n restruct.simpleObjects.forEach((item, id) => {\n if (\n item.item.pos[0].x > x0 &&\n item.item.pos[0].x < x1 &&\n item.item.pos[0].y > y0 &&\n item.item.pos[0].y < y1\n )\n simpleObjectsList.push(id)\n })\n\n const enhancedFlagList = []\n restruct.enhancedFlags.forEach((item, id) => {\n if (!item.pp) return\n if (item.pp.x > x0 && item.pp.x < x1 && item.pp.y > y0 && item.pp.y < y1)\n enhancedFlagList.push(id)\n })\n\n const sgroupDataList = []\n restruct.sgroupData.forEach((item, id) => {\n if (\n item.sgroup.pp.x > x0 &&\n item.sgroup.pp.x < x1 &&\n item.sgroup.pp.y > y0 &&\n item.sgroup.pp.y < y1\n )\n sgroupDataList.push(id)\n })\n\n return {\n atoms: atomList,\n bonds: bondList,\n rxnArrows: rxnArrowsList,\n rxnPluses: rxnPlusesList,\n enhancedFlags: enhancedFlagList,\n sgroupData: sgroupDataList,\n simpleObjects: simpleObjectsList\n }\n}\n\nfunction getElementsInPolygon(restruct, rr) {\n // eslint-disable-line max-statements\n const bondList = []\n const atomList = []\n const r = []\n\n for (let i = 0; i < rr.length; ++i) r[i] = new Vec2(rr[i].x, rr[i].y)\n\n restruct.bonds.forEach((bond, bid) => {\n const centre = Vec2.lc2(\n restruct.atoms.get(bond.b.begin).a.pp,\n 0.5,\n restruct.atoms.get(bond.b.end).a.pp,\n 0.5\n )\n if (isPointInPolygon(r, centre)) bondList.push(bid)\n })\n\n restruct.atoms.forEach((atom, aid) => {\n if (isPointInPolygon(r, atom.a.pp)) atomList.push(aid)\n })\n\n const rxnArrowsList = []\n const rxnPlusesList = []\n const simpleObjectsList = []\n\n restruct.rxnArrows.forEach((item, id) => {\n if (isPointInPolygon(r, item.item.pp)) rxnArrowsList.push(id)\n })\n\n restruct.rxnPluses.forEach((item, id) => {\n if (isPointInPolygon(r, item.item.pp)) rxnPlusesList.push(id)\n })\n\n restruct.simpleObjects.forEach((item, id) => {\n if (isPointInPolygon(r, item.item.pos[0])) simpleObjectsList.push(id)\n })\n\n const enhancedFlagList = []\n restruct.enhancedFlags.forEach((item, id) => {\n if (item.pp && isPointInPolygon(r, item.pp)) enhancedFlagList.push(id)\n })\n\n const sgroupDataList = []\n restruct.sgroupData.forEach((item, id) => {\n if (isPointInPolygon(r, item.sgroup.pp)) sgroupDataList.push(id)\n })\n\n return {\n atoms: atomList,\n bonds: bondList,\n rxnArrows: rxnArrowsList,\n rxnPluses: rxnPlusesList,\n enhancedFlags: enhancedFlagList,\n sgroupData: sgroupDataList,\n simpleObjects: simpleObjectsList\n }\n}\n\n// TODO: test me see testPolygon from\n// 'Remove unused methods from render' commit\nfunction isPointInPolygon(r, p) {\n // eslint-disable-line max-statements\n var d = new Vec2(0, 1)\n var n = d.rotate(Math.PI / 2)\n var v0 = Vec2.diff(r[r.length - 1], p)\n var n0 = Vec2.dot(n, v0)\n var d0 = Vec2.dot(d, v0)\n var w0 = null\n var counter = 0\n var eps = 1e-5\n var flag1 = false\n var flag0 = false\n\n for (var i = 0; i < r.length; ++i) {\n var v1 = Vec2.diff(r[i], p)\n var w1 = Vec2.diff(v1, v0)\n var n1 = Vec2.dot(n, v1)\n var d1 = Vec2.dot(d, v1)\n flag1 = false\n if (n1 * n0 < 0) {\n if (d1 * d0 > -eps) {\n if (d0 > -eps) flag1 = true\n /* eslint-disable no-mixed-operators*/\n } else if (\n (Math.abs(n0) * Math.abs(d1) - Math.abs(n1) * Math.abs(d0)) * d1 >\n 0\n ) {\n /* eslint-enable no-mixed-operators*/\n flag1 = true\n }\n }\n if (flag1 && flag0 && Vec2.dot(w1, n) * Vec2.dot(w0, n) >= 0) flag1 = false\n if (flag1) counter++\n v0 = v1\n n0 = n1\n d0 = d1\n w0 = w1\n flag0 = flag1\n }\n return counter % 2 !== 0\n}\n\nexport default {\n inRectangle: getElementsInRectangle,\n inPolygon: getElementsInPolygon\n}\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport locate from './locate'\nimport draw from '../../../render/draw'\nimport scale from '../../../util/scale'\n\nfunction LassoHelper(mode, editor, fragment) {\n this.mode = mode\n this.fragment = fragment\n this.editor = editor\n}\n\nLassoHelper.prototype.getSelection = function () {\n const rnd = this.editor.render\n\n if (this.mode === 0) return locate.inPolygon(rnd.ctab, this.points)\n\n if (this.mode === 1)\n return locate.inRectangle(rnd.ctab, this.points[0], this.points[1])\n\n throw new Error('Selector mode unknown') // eslint-disable-line no-else-return\n}\n\nLassoHelper.prototype.begin = function (event) {\n const rnd = this.editor.render\n this.points = [rnd.page2obj(event)]\n if (this.mode === 1) this.points.push(this.points[0])\n}\n\nLassoHelper.prototype.running = function () {\n return !!this.points\n}\n\nLassoHelper.prototype.addPoint = function (event) {\n if (!this.points) return null\n\n const rnd = this.editor.render\n\n if (this.mode === 0) this.points.push(rnd.page2obj(event))\n else if (this.mode === 1) this.points = [this.points[0], rnd.page2obj(event)]\n\n this.update()\n return this.getSelection()\n}\n\nLassoHelper.prototype.update = function () {\n if (this.selection) {\n this.selection.remove()\n this.selection = null\n }\n\n if (this.points && this.points.length > 1) {\n const rnd = this.editor.render\n const dp = this.points.map(p =>\n scale.obj2scaled(p, rnd.options).add(rnd.options.offset)\n )\n this.selection =\n this.mode === 0\n ? draw.selectionPolygon(rnd.paper, dp, rnd.options)\n : draw.selectionRectangle(rnd.paper, dp[0], dp[1], rnd.options)\n }\n}\n\nLassoHelper.prototype.end = function () {\n const ret = this.getSelection()\n this.points = null\n this.update(null)\n return ret\n}\n\nexport default LassoHelper\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport isEqual from 'lodash/fp/isEqual'\n\nimport { SgContexts } from '../shared/constants'\n\nimport Pile from '../../util/pile'\nimport { checkOverlapping } from '../../chem/struct/sgforest'\nimport LassoHelper from './helper/lasso'\nimport {\n fromSgroupDeletion,\n fromSeveralSgroupAddition,\n fromSgroupAction\n} from '../actions/sgroup'\n\nconst searchMaps = ['atoms', 'bonds', 'sgroups', 'sgroupData']\n\nfunction SGroupTool(editor, type) {\n if (!(this instanceof SGroupTool)) {\n var selection = editor.selection() || {}\n if (!selection.atoms && !selection.bonds)\n return new SGroupTool(editor, type)\n\n var sgroups = editor.render.ctab.molecule.sgroups\n var selectedAtoms = editor.selection().atoms\n\n var id = sgroups.find((_, sgroup) => isEqual(sgroup.atoms, selectedAtoms))\n\n sgroupDialog(editor, id !== undefined ? id : null, type)\n return null\n }\n\n this.editor = editor\n this.type = type\n\n this.lassoHelper = new LassoHelper(1, editor)\n this.editor.selection(null)\n}\n\nSGroupTool.prototype.mousedown = function (event) {\n var ci = this.editor.findItem(event, searchMaps)\n if (!ci)\n // ci.type == 'Canvas'\n this.lassoHelper.begin(event)\n}\n\nSGroupTool.prototype.mousemove = function (event) {\n if (this.lassoHelper.running(event))\n this.editor.selection(this.lassoHelper.addPoint(event))\n else this.editor.hover(this.editor.findItem(event, searchMaps))\n}\n\nSGroupTool.prototype.mouseleave = function (event) {\n if (this.lassoHelper.running(event)) this.lassoHelper.end(event)\n}\n\nSGroupTool.prototype.mouseup = function (event) {\n var id = null // id of an existing group, if we're editing one\n var selection = null // atoms to include in a newly created group\n if (this.lassoHelper.running(event)) {\n // TODO it catches more events than needed, to be re-factored\n selection = this.lassoHelper.end(event)\n } else {\n var ci = this.editor.findItem(event, searchMaps)\n if (!ci)\n // ci.type == 'Canvas'\n return\n this.editor.hover(null)\n\n if (ci.map === 'atoms') {\n // if we click the SGroup tool on a single atom or bond, make a group out of those\n selection = { atoms: [ci.id] }\n } else if (ci.map === 'bonds') {\n var bond = this.editor.render.ctab.bonds.get(ci.id)\n selection = { atoms: [bond.b.begin, bond.b.end] }\n } else if (ci.map === 'sgroups' || ci.map === 'sgroupData') {\n id = ci.id\n } else {\n return\n }\n }\n\n // TODO: handle click on an existing group?\n if (id !== null || (selection && selection.atoms))\n sgroupDialog(this.editor, id, this.type)\n}\n\nSGroupTool.prototype.cancel = function () {\n if (this.lassoHelper.running()) this.lassoHelper.end()\n this.editor.selection(null)\n}\n\nexport function sgroupDialog(editor, id, defaultType) {\n const restruct = editor.render.ctab\n const struct = restruct.molecule\n const selection = editor.selection() || {}\n const sg = id !== null ? struct.sgroups.get(id) : null\n const type = sg ? sg.type : defaultType\n const eventName = type === 'DAT' ? 'sdataEdit' : 'sgroupEdit'\n\n if (!selection.atoms && !selection.bonds && !sg) {\n console.info('There is no selection or sgroup')\n return\n }\n\n let attrs = null\n if (sg) {\n attrs = sg.getAttrs()\n attrs.context = getContextBySgroup(restruct, sg.atoms)\n } else {\n attrs = {\n context: getContextBySelection(restruct, selection)\n }\n }\n\n const res = editor.event[eventName].dispatch({\n type,\n attrs\n })\n\n Promise.resolve(res)\n .then(newSg => {\n // TODO: check before signal\n if (\n newSg.type !== 'DAT' && // when data s-group separates\n checkOverlapping(struct, selection.atoms || [])\n ) {\n editor.event.message.dispatch({\n error: 'Partial S-group overlapping is not allowed.'\n })\n } else {\n if (\n !sg &&\n newSg.type !== 'DAT' &&\n (!selection.atoms || selection.atoms.length === 0)\n )\n return\n\n const isDataSg = sg && sg.getAttrs().context === newSg.attrs.context\n\n if (isDataSg) {\n const action = fromSeveralSgroupAddition(\n restruct,\n newSg.type,\n sg.atoms,\n newSg.attrs\n ).mergeWith(fromSgroupDeletion(restruct, id))\n\n editor.update(action)\n editor.selection(selection)\n return\n }\n\n const result = fromContextType(id, editor, newSg, selection)\n editor.update(result.action)\n editor.selection(null)\n }\n })\n .catch(() => null)\n}\n\nfunction getContextBySgroup(restruct, sgAtoms) {\n const struct = restruct.molecule\n\n if (sgAtoms.length === 1) return SgContexts.Atom\n\n if (manyComponentsSelected(restruct, sgAtoms)) return SgContexts.Multifragment\n\n if (singleComponentSelected(restruct, sgAtoms)) return SgContexts.Fragment\n\n const atomSet = new Pile(sgAtoms)\n\n const sgBonds = Array.from(struct.bonds.values()).filter(\n bond => atomSet.has(bond.begin) && atomSet.has(bond.end)\n )\n\n return anyChainedBonds(sgBonds) ? SgContexts.Group : SgContexts.Bond\n}\n\nfunction getContextBySelection(restruct, selection) {\n const struct = restruct.molecule\n\n if (selection.atoms && !selection.bonds) return SgContexts.Atom\n\n const bonds = selection.bonds.map(bondid => struct.bonds.get(bondid))\n\n if (!anyChainedBonds(bonds)) return SgContexts.Bond\n\n selection.atoms = selection.atoms || []\n\n const atomSet = new Pile(selection.atoms)\n const allBondsSelected = bonds.every(\n bond => atomSet.has(bond.begin) && atomSet.has(bond.end)\n )\n\n if (singleComponentSelected(restruct, selection.atoms) && allBondsSelected)\n return SgContexts.Fragment\n\n return manyComponentsSelected(restruct, selection.atoms)\n ? SgContexts.Multifragment\n : SgContexts.Group\n}\n\nfunction fromContextType(id, editor, newSg, currSelection) {\n const restruct = editor.render.ctab\n const sg = restruct.molecule.sgroups.get(id)\n const sourceAtoms = (sg && sg.atoms) || currSelection.atoms || []\n const context = newSg.attrs.context\n\n const result = fromSgroupAction(\n context,\n restruct,\n newSg,\n sourceAtoms,\n currSelection\n )\n\n result.selection = result.selection || currSelection\n\n if (id !== null && id !== undefined)\n result.action = result.action.mergeWith(fromSgroupDeletion(restruct, id))\n\n editor.selection(result.selection)\n\n return result\n}\n\nfunction anyChainedBonds(bonds) {\n if (bonds.length === 0) return true\n\n for (let i = 0; i < bonds.length; ++i) {\n const fixedBond = bonds[i]\n for (let j = 0; j < bonds.length; ++j) {\n if (i === j) continue\n\n const bond = bonds[j]\n\n if (fixedBond.end === bond.begin || fixedBond.end === bond.end)\n return true\n }\n }\n\n return false\n}\n\nfunction singleComponentSelected(restruct, atoms) {\n return countOfSelectedComponents(restruct, atoms) === 1\n}\n\nfunction manyComponentsSelected(restruct, atoms) {\n return countOfSelectedComponents(restruct, atoms) > 1\n}\n\nfunction countOfSelectedComponents(restruct, atoms) {\n const atomSet = new Pile(atoms)\n\n return Array.from(restruct.connectedComponents.values()).reduce(\n (acc, component) => acc + (atomSet.isSuperset(component) ? 1 : 0),\n 0\n )\n}\n\nexport default SGroupTool\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport { Atom, Bond } from '../../chem/struct'\n\nimport op from '../operations/op'\nimport utils from '../shared/utils'\nimport Action from '../shared/action'\n\nimport { atomGetAttr, atomForNewBond, atomGetNeighbors } from './utils'\nimport {\n fromAtomMerge,\n fromStereoAtomAttrs,\n mergeFragmentsIfNeeded,\n mergeSgroups\n} from './atom'\n\nexport function fromBondAddition(restruct, bond, begin, end, pos, pos2) {\n // eslint-disable-line\n if (end === undefined) {\n const atom = atomForNewBond(restruct, begin)\n end = atom.atom\n pos = atom.pos\n }\n const action = new Action()\n let mergeFragments = false\n\n let frid = null\n\n if (!(typeof begin === 'number')) {\n if (typeof end === 'number') frid = atomGetAttr(restruct, end, 'fragment')\n } else {\n frid = atomGetAttr(restruct, begin, 'fragment')\n if (typeof end === 'number') mergeFragments = true\n }\n\n if (frid == null)\n frid = action.addOp(new op.FragmentAdd().perform(restruct)).frid\n\n if (!(typeof begin === 'number')) {\n begin.fragment = frid\n begin = action.addOp(new op.AtomAdd(begin, pos).perform(restruct)).data.aid\n if (typeof end === 'number') mergeSgroups(action, restruct, [begin], end)\n pos = pos2\n } else if (atomGetAttr(restruct, begin, 'label') === '*') {\n action.addOp(new op.AtomAttr(begin, 'label', 'C').perform(restruct))\n }\n\n if (!(typeof end === 'number')) {\n end.fragment = frid\n // TODO: .data.aid here is a hack, need a better way to access the id of a created atom\n end = action.addOp(new op.AtomAdd(end, pos).perform(restruct)).data.aid\n if (typeof begin === 'number') mergeSgroups(action, restruct, [end], begin)\n } else if (atomGetAttr(restruct, end, 'label') === '*') {\n action.addOp(new op.AtomAttr(end, 'label', 'C').perform(restruct))\n }\n\n const bid = action.addOp(new op.BondAdd(begin, end, bond).perform(restruct))\n .data.bid\n if (bond.stereo > 0) action.mergeWith(fromBondStereoUpdate(restruct, bid))\n action.operations.reverse()\n\n if (mergeFragments) mergeFragmentsIfNeeded(action, restruct, begin, end)\n\n return [action, begin, end, bid]\n}\n\n/**\n * @param restruct { ReStruct }\n * @param ids { Array|number }\n * @param attrs { Bond }\n * @param reset? { boolean }\n */\nexport function fromBondsAttrs(restruct, ids, attrs, reset) {\n const action = new Action()\n const bids = Array.isArray(ids) ? ids : [ids]\n\n bids.forEach(bid => {\n Object.keys(Bond.attrlist).forEach(key => {\n if (!(key in attrs) && !reset) return\n\n const value = key in attrs ? attrs[key] : Bond.attrGetDefault(key)\n action.addOp(new op.BondAttr(bid, key, value).perform(restruct))\n if (key === 'stereo' && key in attrs)\n action.mergeWith(fromBondStereoUpdate(restruct, bid, true))\n })\n })\n\n return action\n}\n\n/**\n * @param restruct { ReStruct }\n * @param mergeMap { Map }\n */\nexport function fromBondsMerge(restruct, mergeMap) {\n const struct = restruct.molecule\n\n const atomPairs = new Map()\n let action = new Action()\n\n mergeMap.forEach((dstId, srcId) => {\n const bond = struct.bonds.get(srcId)\n const bondCI = struct.bonds.get(dstId)\n\n const params = utils.mergeBondsParams(struct, bond, struct, bondCI)\n if (!params.merged) return\n\n atomPairs.set(bond.begin, !params.cross ? bondCI.begin : bondCI.end)\n atomPairs.set(bond.end, !params.cross ? bondCI.end : bondCI.begin)\n })\n\n atomPairs.forEach((dst, src) => {\n action = fromAtomMerge(restruct, src, dst).mergeWith(action)\n })\n\n return action\n}\n\nfunction fromBondFlipping(restruct, id) {\n const bond = restruct.molecule.bonds.get(id)\n\n const action = new Action()\n action.addOp(new op.BondDelete(id))\n action.addOp(new op.BondAdd(bond.end, bond.begin, bond)).data.bid = id\n // todo: swap atoms stereoLabels and stereoAtoms in fragment\n return action.perform(restruct)\n}\n\nexport function fromBondStereoUpdate(restruct, bid, withReverse) {\n const struct = restruct.molecule\n let bond = struct.bonds.get(bid)\n const action = new Action()\n\n if (bond.stereo === Bond.PATTERN.STEREO.NONE) {\n const neigs = atomGetNeighbors(restruct, bond.begin)\n const stereoNeig = neigs.find(\n item => item.bid !== bid && struct.bonds.get(item.bid).stereo > 0\n )\n if (neigs.length < 3 || !stereoNeig) {\n action.mergeWith(\n fromStereoAtomAttrs(\n restruct,\n bond.begin,\n {\n stereoParity: Atom.PATTERN.STEREO_PARITY.NONE,\n stereoLabel: null\n },\n withReverse\n )\n )\n return action\n }\n bond = struct.bonds.get(stereoNeig.bid)\n }\n\n let newAtomParity = null\n switch (bond.stereo) {\n case Bond.PATTERN.STEREO.UP:\n newAtomParity = Atom.PATTERN.STEREO_PARITY.ODD\n break\n case Bond.PATTERN.STEREO.EITHER:\n newAtomParity = Atom.PATTERN.STEREO_PARITY.EITHER\n break\n case Bond.PATTERN.STEREO.DOWN:\n newAtomParity = Atom.PATTERN.STEREO_PARITY.EVEN\n break\n default:\n return action\n }\n\n action.mergeWith(\n fromStereoAtomAttrs(\n restruct,\n bond.begin,\n {\n stereoParity: newAtomParity,\n stereoLabel: 'and-1'\n },\n withReverse\n )\n )\n return action\n}\n\n/**\n * @param restruct { ReStruct }\n * @param itemID - bond id in structure\n * @param bond - bond for change\n * @param bondProps - bondTool properties\n * @returns Action\n */\nexport function bondChangingAction(restruct, itemID, bond, bondProps) {\n if (\n bondProps.stereo !== Bond.PATTERN.STEREO.NONE && //\n bondProps.type === Bond.PATTERN.TYPE.SINGLE &&\n bond.type === bondProps.type &&\n bond.stereo === bondProps.stereo\n )\n // if bondTool is stereo and equal to bond for change\n return fromBondFlipping(restruct, itemID)\n\n const loop = plainBondTypes.includes(bondProps.type) ? plainBondTypes : null\n if (\n bondProps.stereo === Bond.PATTERN.STEREO.NONE &&\n bondProps.type === Bond.PATTERN.TYPE.SINGLE &&\n bond.stereo === Bond.PATTERN.STEREO.NONE &&\n loop\n )\n // if `Single bond` tool is chosen and bond for change in `plainBondTypes`\n bondProps.type = loop[(loop.indexOf(bond.type) + 1) % loop.length]\n\n const isFlip = bondFlipRequired(restruct.molecule, bond, bondProps)\n const action = isFlip ? fromBondFlipping(restruct, itemID) : new Action()\n\n return fromBondsAttrs(restruct, itemID, bondProps).mergeWith(action)\n}\n\nfunction bondFlipRequired(struct, bond, attrs) {\n return (\n attrs.type === Bond.PATTERN.TYPE.SINGLE &&\n bond.stereo === Bond.PATTERN.STEREO.NONE &&\n attrs.stereo !== Bond.PATTERN.STEREO.NONE &&\n struct.atoms.get(bond.begin).neighbors.length <\n struct.atoms.get(bond.end).neighbors.length\n )\n}\n\nconst plainBondTypes = [\n Bond.PATTERN.TYPE.SINGLE,\n Bond.PATTERN.TYPE.DOUBLE,\n Bond.PATTERN.TYPE.TRIPLE\n]\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport { Atom, Bond } from '../../chem/struct'\n\nimport utils from '../shared/utils'\n\nimport { fromAtomAddition, fromAtomsAttrs } from '../actions/atom'\nimport { fromBondAddition } from '../actions/bond'\n\nfunction AtomTool(editor, atomProps) {\n if (!(this instanceof AtomTool)) {\n if (!editor.selection() || !editor.selection().atoms)\n return new AtomTool(editor, atomProps)\n\n const action = fromAtomsAttrs(\n editor.render.ctab,\n editor.selection().atoms,\n atomProps,\n true\n )\n editor.update(action)\n editor.selection(null)\n return null\n }\n\n this.editor = editor\n this.atomProps = atomProps\n this.bondProps = { type: 1, stereo: Bond.PATTERN.STEREO.NONE }\n}\n\nAtomTool.prototype.mousedown = function (event) {\n this.editor.hover(null)\n this.editor.selection(null)\n const ci = this.editor.findItem(event, ['atoms'])\n\n if (!ci) {\n // ci.type == 'Canvas'\n this.dragCtx = {}\n } else if (ci.map === 'atoms') {\n this.dragCtx = { item: ci }\n }\n}\n\nAtomTool.prototype.mousemove = function (event) {\n const rnd = this.editor.render\n if (!this.dragCtx || !this.dragCtx.item) {\n this.editor.hover(this.editor.findItem(event, ['atoms']))\n return\n }\n\n const dragCtx = this.dragCtx\n const ci = this.editor.findItem(event, ['atoms'])\n\n if (ci && ci.map === 'atoms' && ci.id === dragCtx.item.id) {\n // fromAtomsAttrs\n this.editor.hover(this.editor.findItem(event, ['atoms']))\n return\n }\n\n // fromAtomAddition\n const atom = rnd.ctab.molecule.atoms.get(dragCtx.item.id)\n let angle = utils.calcAngle(atom.pp, rnd.page2obj(event))\n if (!event.ctrlKey) angle = utils.fracAngle(angle)\n const degrees = utils.degrees(angle)\n this.editor.event.message.dispatch({ info: degrees + 'º' })\n const newAtomPos = utils.calcNewAtomPos(\n atom.pp,\n rnd.page2obj(event),\n event.ctrlKey\n )\n if (dragCtx.action) dragCtx.action.perform(rnd.ctab)\n\n dragCtx.action = fromBondAddition(\n rnd.ctab,\n this.bondProps,\n dragCtx.item.id,\n Object.assign({}, this.atomProps),\n newAtomPos,\n newAtomPos\n )[0]\n this.editor.update(dragCtx.action, true)\n}\n\nAtomTool.prototype.mouseup = function (event) {\n if (this.dragCtx) {\n const dragCtx = this.dragCtx\n const rnd = this.editor.render\n\n this.editor.update(\n dragCtx.action ||\n (dragCtx.item\n ? fromAtomsAttrs(rnd.ctab, dragCtx.item.id, this.atomProps, true)\n : fromAtomAddition(rnd.ctab, rnd.page2obj(event), this.atomProps))\n )\n\n delete this.dragCtx\n }\n this.editor.event.message.dispatch({\n info: false\n })\n}\n\nexport function atomLongtapEvent(tool, render) {\n const dragCtx = tool.dragCtx\n const editor = tool.editor\n\n const atomid = dragCtx.item && dragCtx.item.id\n\n // edit atom or add atom\n const atom =\n atomid !== undefined && atomid !== null\n ? render.ctab.molecule.atoms.get(atomid)\n : new Atom({ label: '' })\n\n // TODO: longtab event\n dragCtx.timeout = setTimeout(() => {\n delete tool.dragCtx\n editor.selection(null)\n const res = editor.event.quickEdit.dispatch(atom)\n Promise.resolve(res)\n .then(newatom => {\n const action = atomid\n ? fromAtomsAttrs(render.ctab, atomid, newatom)\n : fromAtomAddition(render.ctab, dragCtx.xy0, newatom)\n editor.update(action)\n })\n .catch(() => null) // w/o changes\n }, 750)\n\n dragCtx.stopTapping = function () {\n if (dragCtx.timeout) {\n clearTimeout(dragCtx.timeout)\n delete dragCtx.timeout\n }\n }\n}\n\nexport default AtomTool\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport Vec2 from '../../util/vec2'\nimport Pile from '../../util/pile'\nimport { RGroup } from '../../chem/struct'\n\nimport op from '../operations/op'\nimport Action from '../shared/action'\n\nimport { fromAtomsFragmentAttr } from './atom'\nimport { atomGetNeighbors, getRelSgroupsBySelection } from './utils'\nimport { fromRGroupFragment, fromUpdateIfThen } from './rgroup'\n\nexport function fromMultipleMove(restruct, lists, d) {\n d = new Vec2(d)\n\n const action = new Action()\n const struct = restruct.molecule\n const loops = new Pile()\n const atomsToInvalidate = new Pile()\n\n if (lists.atoms) {\n const atomSet = new Pile(lists.atoms)\n const bondlist = []\n\n restruct.bonds.forEach((bond, bid) => {\n if (atomSet.has(bond.b.begin) && atomSet.has(bond.b.end)) {\n bondlist.push(bid)\n // add all adjacent loops\n // those that are not completely inside the structure will get redrawn anyway\n ;['hb1', 'hb2'].forEach(hb => {\n const loop = struct.halfBonds.get(bond.b[hb]).loop\n if (loop >= 0) loops.add(loop)\n })\n return\n }\n\n if (atomSet.has(bond.b.begin)) {\n atomsToInvalidate.add(bond.b.begin)\n return\n }\n\n if (atomSet.has(bond.b.end)) atomsToInvalidate.add(bond.b.end)\n })\n\n bondlist.forEach(bond => {\n action.addOp(new op.BondMove(bond, d))\n })\n\n loops.forEach(loopId => {\n if (restruct.reloops.get(loopId) && restruct.reloops.get(loopId).visel)\n // hack\n action.addOp(new op.LoopMove(loopId, d))\n })\n\n lists.atoms.forEach(aid => {\n action.addOp(new op.AtomMove(aid, d, !atomsToInvalidate.has(aid)))\n })\n\n if (lists.sgroupData && lists.sgroupData.length === 0) {\n const sgroups = getRelSgroupsBySelection(restruct, lists.atoms)\n sgroups.forEach(sg => {\n action.addOp(new op.SGroupDataMove(sg.id, d))\n })\n }\n }\n\n if (lists.rxnArrows) {\n lists.rxnArrows.forEach(rxnArrow => {\n action.addOp(new op.RxnArrowMove(rxnArrow, d, true))\n })\n }\n\n if (lists.rxnPluses) {\n lists.rxnPluses.forEach(rxnPulse => {\n action.addOp(new op.RxnPlusMove(rxnPulse, d, true))\n })\n }\n\n if (lists.simpleObjects) {\n lists.simpleObjects.forEach(simpleObject => {\n action.addOp(new op.SimpleObjectMove(simpleObject, d, true))\n })\n }\n\n if (lists.sgroupData) {\n lists.sgroupData.forEach(sgData => {\n action.addOp(new op.SGroupDataMove(sgData, d))\n })\n }\n\n if (lists.enhancedFlags) {\n lists.enhancedFlags.forEach(fid => {\n action.addOp(new op.EnhancedFlagMove(fid, d))\n })\n }\n\n return action.perform(restruct)\n}\n\nexport function fromStereoFlagUpdate(restruct, frid, flag) {\n const action = new Action()\n\n if (!flag) {\n const struct = restruct.molecule\n const frag = restruct.molecule.frags.get(frid)\n frag.stereoAtoms.forEach(aid => {\n if (struct.atoms.get(aid).stereoLabel === null)\n action.addOp(new op.FragmentDeleteStereoAtom(frid, aid))\n })\n }\n\n action.addOp(new op.FragmentStereoFlag(frid, flag))\n return action.perform(restruct)\n}\n\n/**\n * @param restruct { ReStruct }\n * @param aid { number }\n * @param frid { number }\n * @param newfrid { number }\n * @returns { Action }\n */\nfunction processAtom(restruct, aid, frid, newfrid) {\n const queue = [aid]\n const usedIds = new Pile(queue)\n\n while (queue.length > 0) {\n const id = queue.shift()\n\n atomGetNeighbors(restruct, id).forEach(nei => {\n if (\n restruct.molecule.atoms.get(nei.aid).fragment === frid &&\n !usedIds.has(nei.aid)\n ) {\n usedIds.add(nei.aid)\n queue.push(nei.aid)\n }\n })\n }\n\n return fromAtomsFragmentAttr(restruct, usedIds, newfrid)\n}\n\n/**\n * @param restruct { ReStruct }\n * @param frid { number }\n * @param rgForRemove\n * @return { Action }\n */\n// TODO [RB] the thing is too tricky :) need something else in future\nexport function fromFragmentSplit(restruct, frid, rgForRemove = []) {\n const action = new Action()\n const rgid = RGroup.findRGroupByFragment(restruct.molecule.rgroups, frid)\n\n restruct.molecule.atoms.forEach((atom, aid) => {\n if (atom.fragment === frid) {\n const newfrid = action.addOp(new op.FragmentAdd().perform(restruct)).frid\n\n action.mergeWith(processAtom(restruct, aid, frid, newfrid))\n\n if (rgid) action.mergeWith(fromRGroupFragment(restruct, rgid, newfrid))\n }\n })\n\n if (frid !== -1) {\n action.mergeWith(fromRGroupFragment(restruct, 0, frid))\n action.addOp(new op.FragmentDelete(frid).perform(restruct))\n action.mergeWith(fromUpdateIfThen(restruct, 0, rgid, rgForRemove))\n }\n\n action.operations.reverse()\n return action\n}\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport Action from '../shared/action'\nimport utils from '../shared/utils'\nimport { fromBondsMerge } from './bond'\nimport { fromAtomMerge } from './atom'\n\nexport function fromItemsFuse(restruct, items) {\n let action = new Action()\n\n if (!items) return action\n\n const usedAtoms = new Set()\n\n // merge single atoms\n items.atoms.forEach((dst, src) => {\n if (usedAtoms.has(dst) || usedAtoms.has(src)) return\n\n action = fromAtomMerge(restruct, src, dst).mergeWith(action)\n usedAtoms.add(dst).add(src)\n })\n\n // merge bonds\n action = fromBondsMerge(restruct, items.bonds).mergeWith(action)\n\n return action\n}\n\nexport function getItemsToFuse(editor, items) {\n const struct = editor.render.ctab.molecule\n\n const mergeItems = items || {\n atoms: Array.from(struct.atoms.keys()),\n bonds: Array.from(struct.bonds.keys())\n }\n\n return closestToMerge(\n struct,\n editor.findMerge(mergeItems, ['atoms', 'bonds'])\n )\n}\n\nexport function getHoverToFuse(items) {\n if (!items) return null\n\n const hoverItems = {\n atoms: Array.from(items.atoms.values()),\n bonds: Array.from(items.bonds.values())\n }\n\n return { map: 'merge', id: +Date.now(), items: hoverItems }\n}\n\n/**\n * @param struct\n * @param closestMap {{\n * \t\tatoms: Map,\n * \t\tbonds: Map\n * }}\n * @return {{\n * \t\tatoms: Map,\n * \t\tbonds: Map\n * }}\n */\nfunction closestToMerge(struct, closestMap) {\n const mergeMap = {\n atoms: new Map(closestMap.atoms),\n bonds: new Map(closestMap.bonds)\n }\n\n closestMap.bonds.forEach((dstId, srcId) => {\n const bond = struct.bonds.get(srcId)\n const bondCI = struct.bonds.get(dstId)\n\n if (utils.mergeBondsParams(struct, bond, struct, bondCI).merged) {\n mergeMap.atoms.delete(bond.begin)\n mergeMap.atoms.delete(bond.end)\n } else {\n mergeMap.bonds.delete(srcId)\n }\n })\n\n if (mergeMap.atoms.size === 0 && mergeMap.bonds.size === 0) return null\n\n return mergeMap\n}\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport { xor } from 'lodash/fp'\nimport { SGroup } from '../../chem/struct'\nimport LassoHelper from './helper/lasso'\nimport { sgroupDialog } from './sgroup'\nimport { atomLongtapEvent } from './atom'\nimport { fromMultipleMove } from '../actions/fragment'\nimport { fromAtomsAttrs } from '../actions/atom'\nimport { fromBondsAttrs } from '../actions/bond'\nimport {\n fromItemsFuse,\n getItemsToFuse,\n getHoverToFuse\n} from '../actions/closely-fusing'\nimport utils from '../shared/utils'\n\nfunction SelectTool(editor, mode) {\n if (!(this instanceof SelectTool)) return new SelectTool(editor, mode)\n\n this.editor = editor\n this.lassoHelper = new LassoHelper(\n mode === 'lasso' ? 0 : 1,\n editor,\n mode === 'fragment'\n )\n}\n\nSelectTool.prototype.mousedown = function (event) {\n // eslint-disable-line max-statements\n const rnd = this.editor.render\n const ctab = rnd.ctab\n const struct = ctab.molecule\n\n this.editor.hover(null) // TODO review hovering for touch devicess\n\n const selectFragment = this.lassoHelper.fragment || event.ctrlKey\n const ci = this.editor.findItem(\n event,\n selectFragment\n ? [\n 'frags',\n 'sgroups',\n 'sgroupData',\n 'rgroups',\n 'rxnArrows',\n 'rxnPluses',\n 'enhancedFlags',\n 'simpleObjects'\n ]\n : [\n 'atoms',\n 'bonds',\n 'sgroups',\n 'sgroupData',\n 'rgroups',\n 'rxnArrows',\n 'rxnPluses',\n 'enhancedFlags',\n 'simpleObjects'\n ]\n )\n\n this.dragCtx = {\n item: ci,\n xy0: rnd.page2obj(event)\n }\n\n if (!ci || ci.map === 'atoms') atomLongtapEvent(this, rnd)\n\n if (!ci) {\n // ci.type == 'Canvas'\n delete this.dragCtx.item\n if (!this.lassoHelper.fragment) this.lassoHelper.begin(event)\n return true\n }\n\n let sel = closestToSel(ci)\n const selection = this.editor.selection()\n if (ci.map === 'frags') {\n const frag = ctab.frags.get(ci.id)\n sel = {\n atoms: frag.fragGetAtoms(ctab, ci.id),\n bonds: frag.fragGetBonds(ctab, ci.id)\n }\n } else if (ci.map === 'sgroups') {\n const sgroup = ctab.sgroups.get(ci.id).item\n sel = {\n atoms: SGroup.getAtoms(struct, sgroup),\n bonds: SGroup.getBonds(struct, sgroup)\n }\n } else if (ci.map === 'rgroups') {\n const rgroup = ctab.rgroups.get(ci.id)\n sel = {\n atoms: rgroup.getAtoms(rnd),\n bonds: rgroup.getBonds(rnd)\n }\n } else if (ci.map === 'sgroupData') {\n if (isSelected(selection, ci)) return true\n }\n\n if (!event.shiftKey)\n this.editor.selection(isSelected(selection, ci) ? selection : sel)\n else this.editor.selection(selMerge(sel, selection, true))\n return true\n}\n\nSelectTool.prototype.mousemove = function (event) {\n const editor = this.editor\n const rnd = editor.render\n const restruct = editor.render.ctab\n const dragCtx = this.dragCtx\n if (dragCtx && dragCtx.stopTapping) dragCtx.stopTapping()\n if (dragCtx && dragCtx.item) {\n const atoms = restruct.molecule.atoms\n const selection = editor.selection()\n const shouldDisplayDegree =\n dragCtx.item.map === 'atoms' &&\n atoms.get(dragCtx.item.id).neighbors.length === 1 &&\n selection.atoms.length === 1 &&\n !selection.bonds\n if (shouldDisplayDegree) {\n // moving selected objects\n const pos = rnd.page2obj(event)\n const angle = utils.calcAngle(dragCtx.xy0, pos)\n const degrees = utils.degrees(angle)\n this.editor.event.message.dispatch({ info: degrees + 'º' })\n }\n if (dragCtx.action) {\n dragCtx.action.perform(restruct)\n // redraw the elements in unshifted position, lest the have different offset\n editor.update(dragCtx.action, true)\n }\n\n const expSel = editor.explicitSelected()\n dragCtx.action = fromMultipleMove(\n restruct,\n expSel,\n editor.render.page2obj(event).sub(dragCtx.xy0)\n )\n\n dragCtx.mergeItems = getItemsToFuse(editor, expSel)\n editor.hover(getHoverToFuse(dragCtx.mergeItems))\n\n editor.update(dragCtx.action, true)\n return true\n }\n\n if (this.lassoHelper.running()) {\n const sel = this.lassoHelper.addPoint(event)\n editor.selection(\n !event.shiftKey ? sel : selMerge(sel, editor.selection(), false)\n )\n return true\n }\n\n const maps =\n this.lassoHelper.fragment || event.ctrlKey\n ? [\n 'frags',\n 'sgroups',\n 'sgroupData',\n 'rgroups',\n 'rxnArrows',\n 'rxnPluses',\n 'enhancedFlags',\n 'simpleObjects'\n ]\n : [\n 'atoms',\n 'bonds',\n 'sgroups',\n 'sgroupData',\n 'rgroups',\n 'rxnArrows',\n 'rxnPluses',\n 'enhancedFlags',\n 'simpleObjects'\n ]\n\n editor.hover(editor.findItem(event, maps))\n\n return true\n}\n\nSelectTool.prototype.mouseup = function (event) {\n // eslint-disable-line max-statements\n const editor = this.editor\n const restruct = editor.render.ctab\n const dragCtx = this.dragCtx\n\n if (dragCtx && dragCtx.stopTapping) dragCtx.stopTapping()\n\n if (dragCtx && dragCtx.item) {\n dragCtx.action = dragCtx.action\n ? fromItemsFuse(restruct, dragCtx.mergeItems).mergeWith(dragCtx.action)\n : fromItemsFuse(restruct, dragCtx.mergeItems)\n\n editor.hover(null)\n if (dragCtx.mergeItems) editor.selection(null)\n if (dragCtx.action.operations.length !== 0) editor.update(dragCtx.action)\n\n delete this.dragCtx\n } else if (this.lassoHelper.running()) {\n // TODO it catches more events than needed, to be re-factored\n const sel = this.lassoHelper.end()\n editor.selection(!event.shiftKey ? sel : selMerge(sel, editor.selection()))\n } else if (this.lassoHelper.fragment) {\n if (!event.shiftKey) editor.selection(null)\n }\n this.editor.event.message.dispatch({\n info: false\n })\n return true\n}\n\nSelectTool.prototype.dblclick = function (event) {\n // eslint-disable-line max-statements\n var editor = this.editor\n var rnd = this.editor.render\n var ci = this.editor.findItem(event, [\n 'atoms',\n 'bonds',\n 'sgroups',\n 'sgroupData'\n ])\n if (!ci) return true\n\n var struct = rnd.ctab.molecule\n if (ci.map === 'atoms') {\n this.editor.selection(closestToSel(ci))\n var atom = struct.atoms.get(ci.id)\n var ra = editor.event.elementEdit.dispatch(atom)\n Promise.resolve(ra)\n .then(newatom => {\n // TODO: deep compare to not produce dummy, e.g.\n // atom.label != attrs.label || !atom.atomList.equals(attrs.atomList)\n editor.update(fromAtomsAttrs(rnd.ctab, ci.id, newatom))\n })\n .catch(() => null) // w/o changes\n } else if (ci.map === 'bonds') {\n this.editor.selection(closestToSel(ci))\n var bond = rnd.ctab.bonds.get(ci.id).b\n var rb = editor.event.bondEdit.dispatch(bond)\n Promise.resolve(rb)\n .then(newbond => {\n editor.update(fromBondsAttrs(rnd.ctab, ci.id, newbond))\n })\n .catch(() => null) // w/o changes\n } else if (ci.map === 'sgroups' || ci.map === 'sgroupData') {\n this.editor.selection(closestToSel(ci))\n sgroupDialog(this.editor, ci.id)\n }\n return true\n}\n\nSelectTool.prototype.cancel = function () {\n if (this.dragCtx && this.dragCtx.stopTapping) this.dragCtx.stopTapping()\n\n if (this.dragCtx && this.dragCtx.action) {\n var action = this.dragCtx.action\n this.editor.update(action)\n }\n if (this.lassoHelper.running()) this.editor.selection(this.lassoHelper.end())\n\n delete this.dragCtx\n\n this.editor.hover(null)\n}\nSelectTool.prototype.mouseleave = SelectTool.prototype.cancel\n\nfunction closestToSel(ci) {\n const res = {}\n res[ci.map] = [ci.id]\n return res\n}\n\n// TODO: deep-merge?\nfunction selMerge(selection, add, reversible) {\n if (add) {\n Object.keys(add).forEach(item => {\n if (!selection[item]) selection[item] = add[item].slice()\n else selection[item] = uniqArray(selection[item], add[item], reversible)\n })\n }\n return selection\n}\n\nfunction isSelected(selection, item) {\n return (\n selection && selection[item.map] && selection[item.map].includes(item.id)\n )\n}\n\nfunction uniqArray(dest, add, reversible) {\n return add.reduce((res, item) => {\n if (reversible) dest = xor(dest, [item])\n else if (!dest.includes(item)) dest.push(item)\n return dest\n }, [])\n}\n\nexport default SelectTool\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\nimport op from '../operations/op'\nimport Action from '../shared/action'\n\nexport function fromSimpleObjectDeletion(restruct, id) {\n const action = new Action()\n action.addOp(new op.SimpleObjectDelete(id))\n return action.perform(restruct)\n}\n\nexport function fromSimpleObjectAddition(restruct, pos, mode) {\n var action = new Action()\n action.addOp(new op.SimpleObjectAdd(pos, mode))\n return action.perform(restruct)\n}\n\nexport function fromSimpleObjectResizing(restruct, id, d, current, anchor) {\n var action = new Action()\n action.addOp(new op.SimpleObjectResize(id, d, current, anchor))\n return action.perform(restruct)\n}\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport Pile from '../../util/pile'\n\nimport Action from '../shared/action'\nimport op from '../operations/op'\nimport { Atom, RGroup } from '../../chem/struct'\n\nimport { fromStereoAtomAttrs } from './atom'\nimport {\n fromSgroupDeletion,\n removeAtomFromSgroupIfNeeded,\n removeSgroupIfNeeded\n} from './sgroup'\nimport { fromFragmentSplit } from './fragment'\nimport { atomGetDegree, atomGetNeighbors } from './utils'\n\nexport function fromOneAtomDeletion(restruct, id) {\n return fromFragmentDeletion(restruct, { atoms: [id] })\n}\n\nfunction fromBondDeletion(restruct, bid, skipAtoms = []) {\n let action = new Action()\n const bond = restruct.molecule.bonds.get(bid)\n const atomsToRemove = []\n\n action.addOp(new op.BondDelete(bid))\n\n if (\n !skipAtoms.includes(bond.begin) &&\n atomGetDegree(restruct, bond.begin) === 1\n ) {\n if (removeAtomFromSgroupIfNeeded(action, restruct, bond.begin))\n atomsToRemove.push(bond.begin)\n\n action.addOp(new op.AtomDelete(bond.begin))\n }\n\n if (\n !skipAtoms.includes(bond.end) &&\n atomGetDegree(restruct, bond.end) === 1\n ) {\n if (removeAtomFromSgroupIfNeeded(action, restruct, bond.end))\n atomsToRemove.push(bond.end)\n\n action.addOp(new op.AtomDelete(bond.end))\n }\n\n removeSgroupIfNeeded(action, restruct, atomsToRemove)\n action = action.perform(restruct)\n\n if (bond.stereo) {\n action.mergeWith(\n fromStereoAtomAttrs(restruct, bond.begin, {\n stereoParity: Atom.PATTERN.STEREO_PARITY.NONE,\n stereoLabel: null\n })\n )\n }\n\n return action\n}\n\nexport function fromOneBondDeletion(restruct, id) {\n const frid = restruct.molecule.getBondFragment(id)\n let action = fromBondDeletion(restruct, id)\n\n action = fromFragmentSplit(restruct, frid).mergeWith(action)\n\n return action\n}\n\nexport function fromFragmentDeletion(restruct, selection) {\n // eslint-disable-line max-statements\n console.assert(!!selection)\n let action = new Action()\n const atomsToRemove = []\n const frids = []\n\n selection = {\n // TODO: refactor me\n atoms: selection.atoms || [],\n bonds: selection.bonds || [],\n rxnPluses: selection.rxnPluses || [],\n rxnArrows: selection.rxnArrows || [],\n sgroupData: selection.sgroupData || [],\n simpleObjects: selection.simpleObjects || []\n }\n\n const actionRemoveDataSGroups = new Action()\n restruct.molecule.sgroups.forEach((sg, id) => {\n if (\n selection.sgroupData.includes(id) ||\n new Pile(selection.atoms).isSuperset(new Pile(sg.atoms))\n )\n actionRemoveDataSGroups.mergeWith(fromSgroupDeletion(restruct, id))\n })\n\n selection.atoms.forEach(aid => {\n atomGetNeighbors(restruct, aid).forEach(nei => {\n if (selection.bonds.indexOf(nei.bid) === -1)\n selection.bonds = selection.bonds.concat([nei.bid])\n })\n })\n\n const actionRemoveBonds = new Action()\n selection.bonds.forEach(bid => {\n const frid = restruct.molecule.getBondFragment(bid)\n if (frids.indexOf(frid) < 0) frids.push(frid)\n\n actionRemoveBonds.mergeWith(\n fromBondDeletion(restruct, bid, selection.atoms)\n )\n })\n\n selection.atoms.forEach(aid => {\n const frid3 = restruct.molecule.atoms.get(aid).fragment\n if (frids.indexOf(frid3) < 0) frids.push(frid3)\n\n if (removeAtomFromSgroupIfNeeded(action, restruct, aid))\n atomsToRemove.push(aid)\n\n action.addOp(new op.AtomDelete(aid))\n })\n\n removeSgroupIfNeeded(action, restruct, atomsToRemove)\n\n selection.rxnArrows.forEach(id => {\n action.addOp(new op.RxnArrowDelete(id))\n })\n\n selection.rxnPluses.forEach(id => {\n action.addOp(new op.RxnPlusDelete(id))\n })\n\n selection.simpleObjects.forEach(id => {\n action.addOp(new op.SimpleObjectDelete(id))\n })\n\n action = action.perform(restruct)\n action.mergeWith(actionRemoveBonds)\n\n const rgForRemove = frids.map(frid =>\n RGroup.findRGroupByFragment(restruct.molecule.rgroups, frid)\n )\n while (frids.length > 0)\n action = fromFragmentSplit(restruct, frids.pop(), rgForRemove).mergeWith(\n action\n )\n\n action.mergeWith(actionRemoveDataSGroups)\n\n return action\n}\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport LassoHelper from './helper/lasso'\nimport { fromArrowDeletion, fromPlusDeletion } from '../actions/reaction'\nimport { fromSimpleObjectDeletion } from '../actions/simpleobject'\nimport { fromSgroupDeletion } from '../actions/sgroup'\nimport {\n fromFragmentDeletion,\n fromOneAtomDeletion,\n fromOneBondDeletion\n} from '../actions/erase'\n\nfunction EraserTool(editor, mode) {\n if (!(this instanceof EraserTool)) {\n if (!editor.selection()) return new EraserTool(editor, mode)\n\n const action = fromFragmentDeletion(editor.render.ctab, editor.selection())\n editor.update(action)\n editor.selection(null)\n return null\n }\n\n this.editor = editor\n\n this.maps = [\n 'atoms',\n 'bonds',\n 'rxnArrows',\n 'rxnPluses',\n 'sgroups',\n 'sgroupData',\n 'simpleObjects'\n ]\n this.lassoHelper = new LassoHelper(mode || 0, editor)\n}\n\nEraserTool.prototype.mousedown = function (event) {\n const ci = this.editor.findItem(event, this.maps)\n if (!ci)\n // ci.type == 'Canvas'\n this.lassoHelper.begin(event)\n}\n\nEraserTool.prototype.mousemove = function (event) {\n if (this.lassoHelper.running())\n this.editor.selection(this.lassoHelper.addPoint(event))\n else this.editor.hover(this.editor.findItem(event, this.maps))\n}\n\nEraserTool.prototype.mouseup = function (event) {\n // eslint-disable-line max-statements\n const rnd = this.editor.render\n\n if (this.lassoHelper.running()) {\n // TODO it catches more events than needed, to be re-factored\n this.editor.update(\n fromFragmentDeletion(rnd.ctab, this.lassoHelper.end(event))\n )\n this.editor.selection(null)\n }\n}\n\nEraserTool.prototype.click = function (event) {\n const restruct = this.editor.render.ctab\n const ci = this.editor.findItem(event, this.maps)\n\n if (!ci) return // ci.type == 'Canvas'\n\n this.editor.hover(null)\n if (ci.map === 'atoms') {\n this.editor.update(fromOneAtomDeletion(restruct, ci.id))\n } else if (ci.map === 'bonds') {\n this.editor.update(fromOneBondDeletion(restruct, ci.id))\n } else if (ci.map === 'sgroups' || ci.map === 'sgroupData') {\n this.editor.update(fromSgroupDeletion(restruct, ci.id))\n } else if (ci.map === 'rxnArrows') {\n this.editor.update(fromArrowDeletion(restruct, ci.id))\n } else if (ci.map === 'rxnPluses') {\n this.editor.update(fromPlusDeletion(restruct, ci.id))\n } else if (ci.map === 'simpleObjects') {\n this.editor.update(fromSimpleObjectDeletion(restruct, ci.id))\n } else {\n // TODO re-factoring needed - should be \"map-independent\"\n console.error(\n 'EraserTool: unable to delete the object ' + ci.map + '[' + ci.id + ']'\n )\n return\n }\n this.editor.selection(null)\n}\n\nEraserTool.prototype.mouseleave = EraserTool.prototype.mouseup\n\nEraserTool.prototype.cancel = function () {\n if (this.lassoHelper.running()) this.lassoHelper.end()\n this.editor.selection(null)\n}\n\nexport default EraserTool\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport Vec2 from '../../util/vec2'\nimport { Bond } from '../../chem/struct'\nimport utils from '../shared/utils'\n\nimport {\n fromBondAddition,\n bondChangingAction,\n fromBondsAttrs\n} from '../actions/bond'\n\nfunction BondTool(editor, bondProps) {\n if (!(this instanceof BondTool)) {\n if (!editor.selection() || !editor.selection().bonds)\n return new BondTool(editor, bondProps)\n\n const action = fromBondsAttrs(\n editor.render.ctab,\n editor.selection().bonds,\n bondProps\n )\n editor.update(action)\n editor.selection(null)\n return null\n }\n\n this.editor = editor\n this.atomProps = { label: 'C' }\n this.bondProps = bondProps\n}\n\nBondTool.prototype.mousedown = function (event) {\n const rnd = this.editor.render\n this.editor.hover(null)\n this.editor.selection(null)\n this.dragCtx = {\n xy0: rnd.page2obj(event),\n item: this.editor.findItem(event, ['atoms', 'bonds'])\n }\n if (!this.dragCtx.item)\n // ci.type == 'Canvas'\n delete this.dragCtx.item\n return true\n}\n\nBondTool.prototype.mousemove = function (event) {\n // eslint-disable-line max-statements\n const editor = this.editor\n const rnd = editor.render\n if ('dragCtx' in this) {\n const dragCtx = this.dragCtx\n\n const pos = rnd.page2obj(event)\n let angle = utils.calcAngle(dragCtx.xy0, pos)\n if (!event.ctrlKey) angle = utils.fracAngle(angle)\n\n const degrees = utils.degrees(angle)\n this.editor.event.message.dispatch({ info: degrees + 'º' })\n\n if (!('item' in dragCtx) || dragCtx.item.map === 'atoms') {\n if ('action' in dragCtx) dragCtx.action.perform(rnd.ctab)\n let i1\n let i2\n let p1\n let p2\n if ('item' in dragCtx && dragCtx.item.map === 'atoms') {\n // first mousedown event intersect with any atom\n i1 = dragCtx.item.id\n i2 = editor.findItem(event, ['atoms'], dragCtx.item)\n } else {\n // first mousedown event intersect with any canvas\n i1 = this.atomProps\n p1 = dragCtx.xy0\n i2 = editor.findItem(event, ['atoms'])\n }\n let dist = Number.MAX_VALUE\n if (i2 && i2.map === 'atoms') {\n // after mousedown events is appered, cursor is moved and then cursor intersects any atoms\n i2 = i2.id\n } else {\n i2 = this.atomProps\n const xy1 = rnd.page2obj(event)\n dist = Vec2.dist(dragCtx.xy0, xy1)\n if (p1) {\n // rotation only, leght of bond = 1;\n p2 = utils.calcNewAtomPos(p1, xy1, event.ctrlKey)\n } else {\n // first mousedown event intersect with any atom and\n // rotation only, leght of bond = 1;\n const atom = rnd.ctab.molecule.atoms.get(i1)\n p1 = utils.calcNewAtomPos(atom.pp.get_xy0(), xy1, event.ctrlKey)\n }\n }\n // don't rotate the bond if the distance between the start and end point is too small\n if (dist > 0.3)\n dragCtx.action = fromBondAddition(\n rnd.ctab,\n this.bondProps,\n i1,\n i2,\n p1,\n p2\n )[0]\n else delete dragCtx.action\n this.editor.update(dragCtx.action, true)\n return true\n }\n }\n this.editor.hover(this.editor.findItem(event, ['atoms', 'bonds']))\n return true\n}\n\nBondTool.prototype.mouseup = function (event) {\n // eslint-disable-line max-statements\n if ('dragCtx' in this) {\n var dragCtx = this.dragCtx\n var rnd = this.editor.render\n var struct = rnd.ctab.molecule\n if ('action' in dragCtx) {\n this.editor.update(dragCtx.action)\n } else if (!('item' in dragCtx)) {\n var xy = rnd.page2obj(event)\n var v = new Vec2(1.0 / 2, 0).rotate(\n this.bondProps.type === Bond.PATTERN.TYPE.SINGLE ? -Math.PI / 6 : 0\n )\n var bondAddition = fromBondAddition(\n rnd.ctab,\n this.bondProps,\n { label: 'C' },\n { label: 'C' },\n Vec2.diff(xy, v),\n Vec2.sum(xy, v)\n )\n\n this.editor.update(bondAddition[0])\n } else if (dragCtx.item.map === 'atoms') {\n // when does it hapend?\n this.editor.update(\n fromBondAddition(rnd.ctab, this.bondProps, dragCtx.item.id)[0]\n )\n } else if (dragCtx.item.map === 'bonds') {\n var bondProps = Object.assign({}, this.bondProps)\n var bond = struct.bonds.get(dragCtx.item.id)\n\n this.editor.update(\n bondChangingAction(rnd.ctab, dragCtx.item.id, bond, bondProps)\n )\n }\n delete this.dragCtx\n }\n this.editor.event.message.dispatch({\n info: false\n })\n return true\n}\n\nexport default BondTool\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport Vec2 from '../../util/vec2'\nimport { Bond } from '../../chem/struct'\nimport utils from '../shared/utils'\n\nimport { atomLongtapEvent } from './atom'\nimport { bondChangingAction } from '../actions/bond'\nimport { fromChain } from '../actions/chain'\nimport {\n fromItemsFuse,\n getItemsToFuse,\n getHoverToFuse\n} from '../actions/closely-fusing'\n\nfunction ChainTool(editor) {\n if (!(this instanceof ChainTool)) return new ChainTool(editor)\n\n this.editor = editor\n this.editor.selection(null)\n}\n\nChainTool.prototype.mousedown = function (event) {\n const rnd = this.editor.render\n const ci = this.editor.findItem(event, ['atoms', 'bonds'])\n this.editor.hover(null)\n this.dragCtx = {\n xy0: rnd.page2obj(event),\n item: ci\n }\n if (ci && ci.map === 'atoms') {\n this.editor.selection({ atoms: [ci.id] }) // for change atom\n // this event has to be stopped in others events by `tool.dragCtx.stopTapping()`\n atomLongtapEvent(this, rnd)\n }\n if (!this.dragCtx.item)\n // ci.type == 'Canvas'\n delete this.dragCtx.item\n return true\n}\n\nChainTool.prototype.mousemove = function (event) {\n // eslint-disable-line max-statements\n const editor = this.editor\n const restruct = editor.render.ctab\n const dragCtx = this.dragCtx\n\n editor.hover(this.editor.findItem(event, ['atoms', 'bonds']))\n if (!dragCtx) return true\n\n if (dragCtx && dragCtx.stopTapping) dragCtx.stopTapping()\n\n editor.selection(null)\n\n if (!dragCtx.item || dragCtx.item.map === 'atoms') {\n if (dragCtx.action) dragCtx.action.perform(restruct)\n\n const atoms = restruct.molecule.atoms\n\n const pos0 = dragCtx.item ? atoms.get(dragCtx.item.id).pp : dragCtx.xy0\n\n const pos1 = editor.render.page2obj(event)\n const sectCount = Math.ceil(Vec2.diff(pos1, pos0).length())\n\n const angle = event.ctrlKey\n ? utils.calcAngle(pos0, pos1)\n : utils.fracAngle(pos0, pos1)\n\n const [action, newItems] = fromChain(\n restruct,\n pos0,\n angle,\n sectCount,\n dragCtx.item ? dragCtx.item.id : null\n )\n\n editor.event.message.dispatch({\n info: sectCount + ' sectors'\n })\n\n dragCtx.action = action\n editor.update(dragCtx.action, true)\n\n dragCtx.mergeItems = getItemsToFuse(editor, newItems)\n editor.hover(getHoverToFuse(dragCtx.mergeItems))\n\n return true\n }\n\n return true\n}\n\nChainTool.prototype.mouseup = function () {\n const dragCtx = this.dragCtx\n if (!dragCtx) return true\n delete this.dragCtx\n\n const editor = this.editor\n const restruct = editor.render.ctab\n const struct = restruct.molecule\n\n if (dragCtx.stopTapping) dragCtx.stopTapping()\n\n if (!dragCtx.action && dragCtx.item && dragCtx.item.map === 'bonds') {\n const bond = struct.bonds.get(dragCtx.item.id)\n\n dragCtx.action = bondChangingAction(restruct, dragCtx.item.id, bond, {\n type: Bond.PATTERN.TYPE.SINGLE,\n stereo: Bond.PATTERN.STEREO.NONE\n })\n } else {\n dragCtx.action = dragCtx.action\n ? fromItemsFuse(restruct, dragCtx.mergeItems).mergeWith(dragCtx.action)\n : fromItemsFuse(restruct, dragCtx.mergeItems)\n }\n\n editor.selection(null)\n editor.hover(null)\n\n if (dragCtx.action) editor.update(dragCtx.action)\n\n editor.event.message.dispatch({\n info: false\n })\n\n return true\n}\n\nChainTool.prototype.cancel = ChainTool.prototype.mouseup\n\nChainTool.prototype.mouseleave = ChainTool.prototype.mouseup\n\nexport default ChainTool\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport molfile from '../../chem/molfile'\nimport { Bond } from '../../chem/struct'\n\nimport op from '../operations/op'\nimport Action from '../shared/action'\n\n/**\n * @param restruct { ReStruct }\n * @param events { Array }\n * @param bid { number }\n * @param template {{\n * \t\tmolecule: Struct,\n * \t\tbid: number\n * }}\n * @param simpleFusing { Function }\n * @returns { Promise }\n */\nexport function fromAromaticTemplateOnBond(\n restruct,\n template,\n bid,\n events,\n simpleFusing\n) {\n const tmpl = template.molecule\n const struct = restruct.molecule\n\n const frid = struct.getBondFragment(bid)\n const beforeMerge = getFragmentWithBondMap(struct, frid)\n let afterMerge = null\n let pasteItems = null\n\n let action = new Action()\n\n if (!canBeAromatized(beforeMerge.frag) || !canBeAromatized(tmpl)) {\n action = simpleFusing(restruct, template, bid)\n return Promise.resolve(action)\n }\n\n return Promise.all([\n events.aromatizeStruct\n .dispatch(beforeMerge.frag)\n .then(res => molfile.parse(res.struct)),\n events.aromatizeStruct.dispatch(tmpl).then(res => molfile.parse(res.struct))\n ])\n .then(([astruct, atmpl]) => {\n // aromatize restruct fragment\n const aromatizeAction = fromAromatize(\n restruct,\n astruct,\n beforeMerge.bondMap\n )\n // merge template with fragment\n const aromTemplate = { bid: template.bid, molecule: atmpl }\n const templateFusingAction = simpleFusing(restruct, aromTemplate, bid)\n pasteItems = templateFusingAction[1]\n\n action = templateFusingAction[0].mergeWith(aromatizeAction)\n\n afterMerge = getFragmentWithBondMap(restruct.molecule, frid)\n\n return events.dearomatizeStruct\n .dispatch(afterMerge.frag)\n .then(res => molfile.parse(res.struct))\n })\n .then(destruct => {\n destruct.bonds.forEach(bond => {\n if (bond.type === Bond.PATTERN.TYPE.AROMATIC)\n throw Error('Bad dearomatize')\n })\n\n // dearomatize restruct fragment\n const dearomatizeAction = fromDearomatize(\n restruct,\n destruct,\n afterMerge.bondMap\n )\n action = dearomatizeAction.mergeWith(action)\n\n return [action, pasteItems]\n })\n .catch(err => {\n console.info(err.message)\n action.perform(restruct) // revert actions if error\n\n return simpleFusing(restruct, template, bid)\n })\n}\n\nfunction fromAromatize(restruct, astruct, bondMap) {\n const action = new Action()\n\n astruct.bonds.forEach((bond, bid) => {\n if (bond.type !== Bond.PATTERN.TYPE.AROMATIC) return\n action.addOp(\n new op.BondAttr(\n bondMap.get(bid),\n 'type',\n Bond.PATTERN.TYPE.AROMATIC\n ).perform(restruct)\n )\n })\n\n return action\n}\n\n/**\n * @param restruct { ReStruct }\n * @param dastruct { ReStruct }\n * @param bondMap { Map }\n * @returns { Action }\n */\nfunction fromDearomatize(restruct, dastruct, bondMap) {\n const action = new Action()\n\n dastruct.bonds.forEach((bond, bid) => {\n action.addOp(\n new op.BondAttr(bondMap.get(bid), 'type', bond.type).perform(restruct)\n )\n })\n\n return action\n}\n\n/* UTILS */\n\nfunction canBeAromatized(struct) {\n // TODO correct this checking && move to chem.Struct ??\n if (struct.loops.size === 0) struct.prepareLoopStructure()\n\n const hasAromLoop = struct.loops.find((id, loop) => loop.aromatic)\n if (struct.loops.size === 0 || hasAromLoop) return false\n\n const correctDblBonds = struct.loops.find(\n (id, loop) => loop.dblBonds === loop.hbs.length / 2\n )\n\n return correctDblBonds !== undefined\n}\n\n/**\n * @param struct { Struct }\n * @param frid { number }\n * @returns {{\n * \t\tfrag: Struct,\n * \t\tbondMap: Map\n * }}\n */\nfunction getFragmentWithBondMap(struct, frid) {\n const atomSet = struct.getFragmentIds(frid)\n const atomsInStruct = Array.from(atomSet)\n\n const frag = struct.clone(atomSet)\n const bondMap = new Map()\n frag.bonds.forEach((bond, bid) => {\n bondMap.set(\n bid,\n struct.findBondId(atomsInStruct[bond.begin], atomsInStruct[bond.end])\n )\n })\n\n return { frag, bondMap }\n}\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport Vec2 from '../../util/vec2'\n\nimport op from '../operations/op'\nimport Action from '../shared/action'\n\nimport { fromRGroupAttrs, fromUpdateIfThen } from './rgroup'\nimport { fromSgroupAddition } from './sgroup'\n\nexport function fromPaste(restruct, pstruct, point, angle = 0) {\n const xy0 = getStructCenter(pstruct)\n const offset = Vec2.diff(point, xy0)\n\n const action = new Action()\n\n const aidMap = new Map()\n const fridMap = new Map()\n\n const pasteItems = {\n // only atoms and bonds now\n atoms: [],\n bonds: []\n }\n\n pstruct.atoms.forEach((atom, aid) => {\n if (!fridMap.has(atom.fragment))\n fridMap.set(\n atom.fragment,\n action.addOp(new op.FragmentAdd().perform(restruct)).frid\n )\n\n const tmpAtom = Object.assign(atom.clone(), {\n fragment: fridMap.get(atom.fragment)\n })\n const operation = new op.AtomAdd(\n tmpAtom,\n Vec2.diff(atom.pp, xy0).rotate(angle).add(point)\n ).perform(restruct)\n action.addOp(operation)\n aidMap.set(aid, operation.data.aid)\n\n pasteItems.atoms.push(operation.data.aid)\n })\n\n pstruct.frags.forEach((frag, frid) => {\n frag.stereoAtoms.forEach(aid =>\n action.addOp(\n new op.FragmentAddStereoAtom(\n fridMap.get(frid),\n aidMap.get(aid)\n ).perform(restruct)\n )\n )\n })\n\n pstruct.bonds.forEach(bond => {\n const operation = new op.BondAdd(\n aidMap.get(bond.begin),\n aidMap.get(bond.end),\n bond\n ).perform(restruct)\n action.addOp(operation)\n\n pasteItems.bonds.push(operation.data.bid)\n })\n\n pstruct.sgroups.forEach(sg => {\n const newsgid = restruct.molecule.sgroups.newId()\n const sgAtoms = sg.atoms.map(aid => aidMap.get(aid))\n const sgAction = fromSgroupAddition(\n restruct,\n sg.type,\n sgAtoms,\n sg.data,\n newsgid,\n sg.pp ? sg.pp.add(offset) : null\n )\n sgAction.operations.reverse().forEach(oper => {\n action.addOp(oper)\n })\n })\n\n if (restruct.rxnArrows.size < 1) {\n pstruct.rxnArrows.forEach(rxnArrow => {\n action.addOp(\n new op.RxnArrowAdd(rxnArrow.pp.add(offset)).perform(restruct)\n )\n })\n }\n\n pstruct.rxnPluses.forEach(plus => {\n action.addOp(new op.RxnPlusAdd(plus.pp.add(offset)).perform(restruct))\n })\n\n pstruct.simpleObjects.forEach(simpleObject => {\n action.addOp(\n new op.SimpleObjectAdd(\n simpleObject.pos.map(p => p.add(offset)),\n simpleObject.mode\n ).perform(restruct)\n )\n })\n\n pstruct.rgroups.forEach((rg, rgid) => {\n rg.frags.forEach((frag, frid) => {\n action.addOp(\n new op.RGroupFragment(rgid, fridMap.get(frid)).perform(restruct)\n )\n })\n const ifThen = pstruct.rgroups.get(rgid).ifthen\n const newRgId = pstruct.rgroups.get(ifThen) ? ifThen : 0\n action\n .mergeWith(fromRGroupAttrs(restruct, rgid, rg.getAttrs()))\n .mergeWith(fromUpdateIfThen(restruct, newRgId, rg.ifthen))\n })\n\n action.operations.reverse()\n return [action, pasteItems]\n}\n\nfunction getStructCenter(struct) {\n if (struct.atoms.size > 0) {\n let xmin = 1e50\n let ymin = xmin\n let xmax = -xmin\n let ymax = -ymin\n\n struct.atoms.forEach(atom => {\n xmin = Math.min(xmin, atom.pp.x)\n ymin = Math.min(ymin, atom.pp.y)\n xmax = Math.max(xmax, atom.pp.x)\n ymax = Math.max(ymax, atom.pp.y)\n })\n return new Vec2((xmin + xmax) / 2, (ymin + ymax) / 2) // TODO: check\n }\n if (struct.rxnArrows.size > 0) return struct.rxnArrows.get(0).pp\n if (struct.rxnPluses.size > 0) return struct.rxnPluses.get(0).pp\n if (struct.simpleObjects.size > 0) return struct.simpleObjects.get(0).center()\n\n return null\n}\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport Vec2 from '../../util/vec2'\nimport { Atom } from '../../chem/struct'\nimport op from '../operations/op'\nimport Action from '../shared/action'\nimport utils from '../shared/utils'\nimport closest from '../shared/closest'\n\nimport { atomGetAttr, atomForNewBond } from './utils'\nimport { fromAtomsAttrs, mergeSgroups } from './atom'\nimport { fromBondAddition, fromBondsAttrs } from './bond'\nimport { fromAromaticTemplateOnBond } from './aromatic-fusing'\nimport { fromPaste } from './paste'\n\nexport function fromTemplateOnCanvas(restruct, template, pos, angle) {\n return fromPaste(restruct, template.molecule, pos, angle)\n}\n\nfunction extraBondAction(restruct, aid, angle) {\n let action = new Action()\n const frid = atomGetAttr(restruct, aid, 'fragment')\n let additionalAtom = null\n\n if (angle === null) {\n const middleAtom = atomForNewBond(restruct, aid)\n const actionRes = fromBondAddition(\n restruct,\n { type: 1 },\n aid,\n middleAtom.atom,\n middleAtom.pos.get_xy0()\n )\n action = actionRes[0]\n action.operations.reverse()\n additionalAtom = actionRes[2]\n } else {\n const operation = new op.AtomAdd(\n { label: 'C', fragment: frid },\n new Vec2(1, 0)\n .rotate(angle)\n .add(restruct.molecule.atoms.get(aid).pp)\n .get_xy0()\n ).perform(restruct)\n\n action.addOp(operation)\n action.addOp(\n new op.BondAdd(aid, operation.data.aid, { type: 1 }).perform(restruct)\n )\n\n additionalAtom = operation.data.aid\n }\n\n return { action, aid1: additionalAtom }\n}\n\nexport function fromTemplateOnAtom(restruct, template, aid, angle, extraBond) {\n let action = new Action()\n\n const tmpl = template.molecule\n const struct = restruct.molecule\n\n let atom = struct.atoms.get(aid) // aid - the atom that was clicked on\n let aid1 = aid // aid1 - the atom on the other end of the extra bond || aid\n\n let delta = null\n\n if (extraBond) {\n // create extra bond after click on atom\n const extraRes = extraBondAction(restruct, aid, angle)\n action = extraRes.action\n aid1 = extraRes.aid1\n\n atom = struct.atoms.get(aid1)\n delta = utils.calcAngle(struct.atoms.get(aid).pp, atom.pp) - template.angle0\n } else {\n if (angle === null)\n angle = utils.calcAngle(atom.pp, atomForNewBond(restruct, aid).pos)\n delta = angle - template.angle0\n }\n\n const map = new Map()\n const xy0 = tmpl.atoms.get(template.aid).pp\n const frid = atomGetAttr(restruct, aid, 'fragment')\n\n /* For merge */\n const pasteItems = {\n // only atoms and bonds now\n atoms: [],\n bonds: []\n }\n /* ----- */\n\n tmpl.atoms.forEach((a, id) => {\n const attrs = Atom.getAttrHash(a)\n attrs.fragment = frid\n\n if (id === template.aid) {\n action.mergeWith(fromAtomsAttrs(restruct, aid1, attrs, true))\n map.set(id, aid1)\n pasteItems.atoms.push(aid1)\n } else {\n const v = Vec2.diff(a.pp, xy0).rotate(delta).add(atom.pp)\n\n const operation = new op.AtomAdd(attrs, v.get_xy0()).perform(restruct)\n action.addOp(operation)\n map.set(id, operation.data.aid)\n pasteItems.atoms.push(operation.data.aid)\n }\n })\n mergeSgroups(action, restruct, pasteItems.atoms, aid)\n\n tmpl.bonds.forEach(bond => {\n const operation = new op.BondAdd(\n map.get(bond.begin),\n map.get(bond.end),\n bond\n ).perform(restruct)\n action.addOp(operation)\n\n pasteItems.bonds.push(operation.data.bid)\n })\n\n action.operations.reverse()\n return [action, pasteItems]\n}\n\nexport function fromTemplateOnBondAction(\n restruct,\n template,\n bid,\n events,\n flip,\n force\n) {\n if (!force) return fromTemplateOnBond(restruct, template, bid, flip)\n\n const simpleFusing = (restruct, template, bid) =>\n fromTemplateOnBond(restruct, template, bid, flip) // eslint-disable-line\n /* aromatic merge (Promise)*/\n return fromAromaticTemplateOnBond(\n restruct,\n template,\n bid,\n events,\n simpleFusing\n )\n}\n\nfunction fromTemplateOnBond(restruct, template, bid, flip) {\n // TODO: refactor function !!\n const action = new Action()\n\n const tmpl = template.molecule\n const struct = restruct.molecule\n\n const bond = struct.bonds.get(bid)\n const tmplBond = tmpl.bonds.get(template.bid)\n\n const tmplBegin = tmpl.atoms.get(flip ? tmplBond.end : tmplBond.begin)\n\n const atomsMap = new Map([\n [tmplBond.begin, flip ? bond.end : bond.begin],\n [tmplBond.end, flip ? bond.begin : bond.end]\n ])\n\n // calc angle\n const bondAtoms = {\n begin: flip ? tmplBond.end : tmplBond.begin,\n end: flip ? tmplBond.begin : tmplBond.end\n }\n const { angle, scale } = utils.mergeBondsParams(struct, bond, tmpl, bondAtoms)\n\n const frid = struct.getBondFragment(bid)\n\n /* For merge */\n const pasteItems = {\n // only atoms and bonds now\n atoms: [],\n bonds: []\n }\n /* ----- */\n\n tmpl.atoms.forEach((atom, id) => {\n const attrs = Atom.getAttrHash(atom)\n attrs.fragment = frid\n if (id === tmplBond.begin || id === tmplBond.end) {\n action.mergeWith(fromAtomsAttrs(restruct, atomsMap.get(id), attrs, true))\n return\n }\n\n const v = Vec2.diff(atom.pp, tmplBegin.pp)\n .rotate(angle)\n .scaled(scale)\n .add(struct.atoms.get(bond.begin).pp)\n const mergeA = closest.atom(restruct, v, null, 0.1)\n\n if (mergeA === null) {\n const operation = new op.AtomAdd(attrs, v).perform(restruct)\n action.addOp(operation)\n atomsMap.set(id, operation.data.aid)\n pasteItems.atoms.push(operation.data.aid)\n } else {\n atomsMap.set(id, mergeA.id)\n\n action.mergeWith(fromAtomsAttrs(restruct, atomsMap.get(id), attrs, true))\n // TODO [RB] need to merge fragments?\n }\n })\n mergeSgroups(action, restruct, pasteItems.atoms, bond.begin)\n\n tmpl.bonds.forEach(tBond => {\n const existId = struct.findBondId(\n atomsMap.get(tBond.begin),\n atomsMap.get(tBond.end)\n )\n if (existId === null) {\n const operation = new op.BondAdd(\n atomsMap.get(tBond.begin),\n atomsMap.get(tBond.end),\n tBond\n ).perform(restruct)\n action.addOp(operation)\n\n pasteItems.bonds.push(operation.data.bid)\n } else {\n action.mergeWith(fromBondsAttrs(restruct, existId, tmplBond, true))\n }\n })\n action.operations.reverse()\n return [action, pasteItems]\n}\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport Vec2 from '../../util/vec2'\nimport utils from '../shared/utils'\nimport {\n fromTemplateOnCanvas,\n fromTemplateOnAtom,\n fromTemplateOnBondAction\n} from '../actions/template'\nimport {\n fromItemsFuse,\n getItemsToFuse,\n getHoverToFuse\n} from '../actions/closely-fusing'\n\nfunction TemplateTool(editor, tmpl) {\n // eslint-disable-line max-statements\n if (!(this instanceof TemplateTool)) return new TemplateTool(editor, tmpl)\n\n this.editor = editor\n this.editor.selection(null)\n\n this.template = {\n aid: parseInt(tmpl.aid) || 0,\n bid: parseInt(tmpl.bid) || 0\n }\n\n const frag = tmpl.struct\n frag.rescale()\n\n const xy0 = new Vec2()\n frag.atoms.forEach(atom => {\n xy0.add_(atom.pp) // eslint-disable-line no-underscore-dangle\n })\n\n this.template.molecule = frag // preloaded struct\n this.findItems = []\n this.template.xy0 = xy0.scaled(1 / (frag.atoms.size || 1)) // template center\n\n const atom = frag.atoms.get(this.template.aid)\n if (atom) {\n this.template.angle0 = utils.calcAngle(atom.pp, this.template.xy0) // center tilt\n this.findItems.push('atoms')\n }\n\n const bond = frag.bonds.get(this.template.bid)\n if (bond) {\n // template location sign against attachment bond\n this.template.sign = getSign(frag, bond, this.template.xy0)\n this.findItems.push('bonds')\n }\n}\n\nTemplateTool.prototype.mousedown = function (event) {\n // eslint-disable-line max-statements\n const editor = this.editor\n const restruct = editor.render.ctab\n this.editor.hover(null)\n\n this.dragCtx = {\n xy0: editor.render.page2obj(event),\n item: editor.findItem(event, this.findItems)\n }\n\n const dragCtx = this.dragCtx\n const ci = dragCtx.item\n\n if (!ci) {\n // ci.type == 'Canvas'\n delete dragCtx.item\n return true\n }\n\n if (ci.map === 'bonds') {\n // calculate fragment center\n const molecule = restruct.molecule\n const xy0 = new Vec2()\n const bond = molecule.bonds.get(ci.id)\n const frid = molecule.atoms.get(bond.begin).fragment\n const frIds = molecule.getFragmentIds(frid)\n let count = 0\n\n let loop = molecule.halfBonds.get(bond.hb1).loop\n\n if (loop < 0) loop = molecule.halfBonds.get(bond.hb2).loop\n\n if (loop >= 0) {\n const loopHbs = molecule.loops.get(loop).hbs\n loopHbs.forEach(hb => {\n xy0.add_(molecule.atoms.get(molecule.halfBonds.get(hb).begin).pp) // eslint-disable-line no-underscore-dangle, max-len\n count++\n })\n } else {\n frIds.forEach(id => {\n xy0.add_(molecule.atoms.get(id).pp) // eslint-disable-line no-underscore-dangle\n count++\n })\n }\n\n dragCtx.v0 = xy0.scaled(1 / count)\n\n const sign = getSign(molecule, bond, dragCtx.v0)\n\n // calculate default template flip\n dragCtx.sign1 = sign || 1\n dragCtx.sign2 = this.template.sign\n }\n\n return true\n}\n\nTemplateTool.prototype.mousemove = function (event) {\n // eslint-disable-line max-statements\n const restruct = this.editor.render.ctab\n\n if (!this.dragCtx) {\n this.editor.hover(this.editor.findItem(event, this.findItems))\n return true\n }\n\n const dragCtx = this.dragCtx\n const ci = dragCtx.item\n let pos0 = null\n const pos1 = this.editor.render.page2obj(event)\n const struct = restruct.molecule\n\n /* moving when attached to bond */\n if (ci && ci.map === 'bonds') {\n const bond = struct.bonds.get(ci.id)\n let sign = getSign(struct, bond, pos1)\n\n if (dragCtx.sign1 * this.template.sign > 0) sign = -sign\n\n if (sign !== dragCtx.sign2 || !dragCtx.action) {\n if (dragCtx.action) dragCtx.action.perform(restruct) // undo previous action\n\n dragCtx.sign2 = sign\n ;[action, pasteItems] = fromTemplateOnBondAction(\n restruct,\n this.template,\n ci.id,\n this.editor.event,\n dragCtx.sign1 * dragCtx.sign2 > 0,\n false\n )\n\n dragCtx.action = action\n this.editor.update(dragCtx.action, true)\n\n dragCtx.mergeItems = getItemsToFuse(this.editor, pasteItems)\n this.editor.hover(getHoverToFuse(dragCtx.mergeItems))\n }\n return true\n }\n /* end */\n\n let extraBond = null\n // calc initial pos and is extra bond needed\n if (!ci) {\n // ci.type == 'Canvas'\n pos0 = dragCtx.xy0\n } else if (ci.map === 'atoms') {\n pos0 = struct.atoms.get(ci.id).pp\n extraBond = Vec2.dist(pos0, pos1) > 1\n }\n\n // calc angle\n let angle = utils.calcAngle(pos0, pos1)\n if (!event.ctrlKey) angle = utils.fracAngle(angle)\n const degrees = utils.degrees(angle)\n this.editor.event.message.dispatch({ info: degrees + 'º' })\n\n // check if anything changed since last time\n if (\n dragCtx.hasOwnProperty('angle') &&\n dragCtx.angle === degrees && // eslint-disable-line no-prototype-builtins\n (!dragCtx.hasOwnProperty('extra_bond') || dragCtx.extra_bond === extraBond)\n )\n // eslint-disable-line no-prototype-builtins\n return true\n\n // undo previous action\n if (dragCtx.action) dragCtx.action.perform(restruct)\n\n // create new action\n dragCtx.angle = degrees\n let action = null\n let pasteItems\n\n if (!ci) {\n // ci.type == 'Canvas'\n ;[action, pasteItems] = fromTemplateOnCanvas(\n restruct,\n this.template,\n pos0,\n angle\n )\n } else if (ci.map === 'atoms') {\n ;[action, pasteItems] = fromTemplateOnAtom(\n restruct,\n this.template,\n ci.id,\n angle,\n extraBond\n )\n dragCtx.extra_bond = extraBond\n }\n dragCtx.action = action\n\n this.editor.update(dragCtx.action, true)\n\n dragCtx.mergeItems = getItemsToFuse(this.editor, pasteItems)\n this.editor.hover(getHoverToFuse(dragCtx.mergeItems))\n\n return true\n}\n\nTemplateTool.prototype.mouseup = function (event) {\n // eslint-disable-line max-statements\n const dragCtx = this.dragCtx\n if (!dragCtx) return true\n delete this.dragCtx\n\n const restruct = this.editor.render.ctab\n const struct = restruct.molecule\n const ci = dragCtx.item\n\n /* after moving around bond */\n if (dragCtx.action && ci && ci.map === 'bonds') {\n dragCtx.action.perform(restruct) // revert drag action\n fromTemplateOnBondAction(\n restruct,\n this.template,\n ci.id,\n this.editor.event,\n dragCtx.sign1 * dragCtx.sign2 > 0,\n true\n ).then(([action, pasteItems]) => {\n const mergeItems = getItemsToFuse(this.editor, pasteItems)\n action = fromItemsFuse(restruct, mergeItems).mergeWith(action)\n this.editor.update(action)\n })\n return true\n }\n /* end */\n\n let action\n let pasteItems = null\n\n if (!dragCtx.action) {\n if (!ci) {\n // ci.type == 'Canvas'\n ;[action, pasteItems] = fromTemplateOnCanvas(\n restruct,\n this.template,\n dragCtx.xy0,\n 0\n )\n dragCtx.action = action\n } else if (ci.map === 'atoms') {\n const degree = restruct.atoms.get(ci.id).a.neighbors.length\n let angle\n let extraBond\n\n if (degree > 1) {\n // common case\n angle = null\n extraBond = true\n } else if (degree === 1) {\n // on chain end\n const atom = struct.atoms.get(ci.id)\n const neiId = struct.halfBonds.get(atom.neighbors[0]).end\n const nei = struct.atoms.get(neiId)\n\n angle = event.ctrlKey\n ? utils.calcAngle(nei.pp, atom.pp)\n : utils.fracAngle(utils.calcAngle(nei.pp, atom.pp))\n extraBond = false\n } else {\n // on single atom\n angle = 0\n extraBond = false\n }\n\n ;[action, pasteItems] = fromTemplateOnAtom(\n restruct,\n this.template,\n ci.id,\n angle,\n extraBond\n )\n dragCtx.action = action\n } else if (ci.map === 'bonds') {\n fromTemplateOnBondAction(\n restruct,\n this.template,\n ci.id,\n this.editor.event,\n dragCtx.sign1 * dragCtx.sign2 > 0,\n true\n ).then(([action, pasteItems]) => {\n // eslint-disable-line no-shadow\n const mergeItems = getItemsToFuse(this.editor, pasteItems)\n action = fromItemsFuse(restruct, mergeItems).mergeWith(action)\n this.editor.update(action)\n })\n\n return true\n }\n }\n\n this.editor.selection(null)\n\n if (!dragCtx.mergeItems && pasteItems)\n dragCtx.mergeItems = getItemsToFuse(this.editor, pasteItems)\n dragCtx.action = dragCtx.action\n ? fromItemsFuse(restruct, dragCtx.mergeItems).mergeWith(dragCtx.action)\n : fromItemsFuse(restruct, dragCtx.mergeItems)\n\n this.editor.hover(null)\n const completeAction = dragCtx.action\n if (completeAction && !completeAction.isDummy())\n this.editor.update(completeAction)\n this.editor.event.message.dispatch({\n info: false\n })\n\n return true\n}\n\nTemplateTool.prototype.cancel = TemplateTool.prototype.mouseup\nTemplateTool.prototype.mouseleave = TemplateTool.prototype.mouseup\n\nfunction getSign(molecule, bond, v) {\n const begin = molecule.atoms.get(bond.begin).pp\n const end = molecule.atoms.get(bond.end).pp\n\n const sign = Vec2.cross(Vec2.diff(begin, end), Vec2.diff(v, end))\n\n if (sign > 0) return 1\n if (sign < 0) return -1\n return 0\n}\n\nexport default TemplateTool\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport element from '../../chem/element'\nimport { fromAtomsAttrs } from '../actions/atom'\n\nfunction ChargeTool(editor, charge) {\n if (!(this instanceof ChargeTool)) return new ChargeTool(editor, charge)\n\n this.editor = editor\n this.editor.selection(null)\n this.charge = charge\n}\n\nChargeTool.prototype.mousemove = function (event) {\n var rnd = this.editor.render\n var ci = this.editor.findItem(event, ['atoms'])\n var struct = rnd.ctab.molecule\n if (ci && ci.map === 'atoms' && element.map[struct.atoms.get(ci.id).label])\n this.editor.hover(ci)\n else this.editor.hover(null)\n return true\n}\n\nChargeTool.prototype.click = function (event) {\n var editor = this.editor\n var rnd = editor.render\n var struct = rnd.ctab.molecule\n var ci = editor.findItem(event, ['atoms'])\n if (ci && ci.map === 'atoms' && element.map[struct.atoms.get(ci.id).label]) {\n this.editor.hover(null)\n this.editor.update(\n fromAtomsAttrs(rnd.ctab, ci.id, {\n charge: struct.atoms.get(ci.id).charge + this.charge\n })\n )\n }\n return true\n}\n\nexport default ChargeTool\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport { RGroup } from '../../chem/struct'\nimport {\n fromRGroupAttrs,\n fromRGroupFragment,\n fromUpdateIfThen\n} from '../actions/rgroup'\n\nfunction RGroupFragmentTool(editor) {\n if (!(this instanceof RGroupFragmentTool)) {\n // TODO: check if it's a fragments already\n editor.selection(null)\n return new RGroupFragmentTool(editor)\n }\n\n this.editor = editor\n}\n\nRGroupFragmentTool.prototype.mousemove = function (event) {\n this.editor.hover(this.editor.findItem(event, ['frags', 'rgroups']))\n}\n\nRGroupFragmentTool.prototype.click = function (event) {\n const editor = this.editor\n const struct = editor.render.ctab.molecule\n const ci = editor.findItem(event, ['frags', 'rgroups'])\n\n if (!ci) return true\n\n this.editor.hover(null)\n\n const label =\n ci.map === 'rgroups'\n ? ci.id\n : RGroup.findRGroupByFragment(struct.rgroups, ci.id)\n\n const rg = Object.assign(\n { label },\n ci.map === 'frags' ? { fragId: ci.id } : struct.rgroups.get(ci.id)\n )\n\n const res = editor.event.rgroupEdit.dispatch(rg)\n\n Promise.resolve(res)\n .then(newRg => {\n const restruct = editor.render.ctab\n\n let action = null\n if (ci.map !== 'rgroups') {\n const rgidOld = RGroup.findRGroupByFragment(\n restruct.molecule.rgroups,\n ci.id\n )\n\n action = fromRGroupFragment(restruct, newRg.label, ci.id).mergeWith(\n fromUpdateIfThen(restruct, newRg.label, rgidOld)\n )\n } else {\n action = fromRGroupAttrs(restruct, ci.id, newRg)\n }\n\n editor.update(action)\n })\n .catch(() => null) // w/o changes\n\n return true\n}\n\nRGroupFragmentTool.prototype.cancel = function () {\n this.editor.hover(null)\n}\n\nexport default RGroupFragmentTool\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport { fromAtomsAttrs } from '../actions/atom'\n\nfunction APointTool(editor) {\n if (!(this instanceof APointTool)) return new APointTool(editor)\n\n this.editor = editor\n this.editor.selection(null)\n}\n\nAPointTool.prototype.mousemove = function (event) {\n this.editor.hover(this.editor.findItem(event, ['atoms']))\n}\n\nAPointTool.prototype.click = function (event) {\n var editor = this.editor\n var struct = editor.render.ctab.molecule\n var ci = editor.findItem(event, ['atoms'])\n\n if (ci && ci.map === 'atoms') {\n this.editor.hover(null)\n var atom = struct.atoms.get(ci.id)\n var res = editor.event.elementEdit.dispatch({\n attpnt: atom.attpnt\n })\n Promise.resolve(res)\n .then(newatom => {\n if (atom.attpnt !== newatom.attpnt) {\n var action = fromAtomsAttrs(editor.render.ctab, ci.id, newatom)\n editor.update(action)\n }\n })\n .catch(() => null) // w/o changes\n return true\n }\n return true\n}\n\nexport default APointTool\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport element from '../../chem/element'\n\nfunction AttachTool(editor, attachPoints) {\n if (!(this instanceof AttachTool)) return new AttachTool(editor, attachPoints)\n\n this.attach = attachPoints || { atomid: 0, bondid: 0 }\n this.editor = editor\n\n this.editor.selection({\n atoms: [this.attach.atomid],\n bonds: [this.attach.bondid]\n })\n}\n\nAttachTool.prototype.mousemove = function (event) {\n const rnd = this.editor.render\n\n const ci = this.editor.findItem(event, ['atoms', 'bonds'])\n const struct = rnd.ctab.molecule\n if (\n ci &&\n ((ci.map === 'atoms' && element.map[struct.atoms.get(ci.id).label]) ||\n ci.map === 'bonds')\n )\n this.editor.hover(ci)\n else this.editor.hover(null)\n return true\n}\n\nAttachTool.prototype.click = function (event) {\n const editor = this.editor\n const rnd = editor.render\n const struct = rnd.ctab.molecule\n const ci = editor.findItem(event, ['atoms', 'bonds'])\n\n if (\n ci &&\n ((ci.map === 'atoms' && element.map[struct.atoms.get(ci.id).label]) ||\n ci.map === 'bonds')\n ) {\n if (ci.map === 'atoms') this.attach.atomid = ci.id\n else this.attach.bondid = ci.id\n\n this.editor.selection({\n atoms: [this.attach.atomid],\n bonds: [this.attach.bondid]\n })\n this.editor.event.attachEdit.dispatch(this.attach)\n }\n return true\n}\n\nexport default AttachTool\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport Action from '../shared/action'\nimport { fromArrowAddition } from '../actions/reaction'\nimport { fromMultipleMove } from '../actions/fragment'\n\nfunction ReactionArrowTool(editor) {\n if (!(this instanceof ReactionArrowTool)) return new ReactionArrowTool(editor)\n\n this.editor = editor\n this.editor.selection(null)\n}\n\nReactionArrowTool.prototype.mousedown = function (event) {\n var rnd = this.editor.render\n var ci = this.editor.findItem(event, ['rxnArrows'])\n if (ci && ci.map === 'rxnArrows') {\n this.editor.hover(null)\n this.editor.selection({ rxnArrows: [ci.id] })\n this.dragCtx = {\n xy0: rnd.page2obj(event),\n action: new Action()\n }\n }\n}\n\nReactionArrowTool.prototype.mousemove = function (event) {\n var rnd = this.editor.render\n if ('dragCtx' in this) {\n if (this.dragCtx.action) this.dragCtx.action.perform(rnd.ctab)\n\n this.dragCtx.action = fromMultipleMove(\n rnd.ctab,\n this.editor.selection() || {},\n rnd.page2obj(event).sub(this.dragCtx.xy0)\n )\n this.editor.update(this.dragCtx.action, true)\n } else {\n this.editor.hover(this.editor.findItem(event, ['rxnArrows']))\n }\n}\n\nReactionArrowTool.prototype.mouseup = function () {\n if (this.dragCtx) {\n this.editor.update(this.dragCtx.action) // TODO investigate, subsequent undo/redo fails\n delete this.dragCtx\n }\n}\n\nReactionArrowTool.prototype.click = function (event) {\n const rnd = this.editor.render\n if (rnd.ctab.molecule.rxnArrows.size < 1)\n this.editor.update(fromArrowAddition(rnd.ctab, rnd.page2obj(event)))\n}\n\nexport default ReactionArrowTool\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport { fromPlusAddition } from '../actions/reaction'\nimport { fromMultipleMove } from '../actions/fragment'\n\nfunction ReactionPlusTool(editor) {\n if (!(this instanceof ReactionPlusTool)) return new ReactionPlusTool(editor)\n\n this.editor = editor\n this.editor.selection(null)\n}\n\nReactionPlusTool.prototype.mousedown = function (event) {\n var rnd = this.editor.render\n var ci = this.editor.findItem(event, ['rxnPluses'])\n if (ci && ci.map === 'rxnPluses') {\n this.editor.hover(null)\n this.editor.selection({ rxnPluses: [ci.id] })\n this.dragCtx = { xy0: rnd.page2obj(event) }\n }\n}\n\nReactionPlusTool.prototype.mousemove = function (event) {\n var rnd = this.editor.render\n if ('dragCtx' in this) {\n if (this.dragCtx.action) this.dragCtx.action.perform(rnd.ctab)\n this.dragCtx.action = fromMultipleMove(\n rnd.ctab,\n this.editor.selection() || {},\n rnd.page2obj(event).sub(this.dragCtx.xy0)\n )\n this.editor.update(this.dragCtx.action, true)\n } else {\n this.editor.hover(this.editor.findItem(event, ['rxnPluses']))\n }\n}\n\nReactionPlusTool.prototype.mouseup = function () {\n if (!this.dragCtx) return true\n\n if (this.dragCtx.action) {\n this.editor.update(this.dragCtx.action) // TODO investigate, subsequent undo/redo fails\n }\n\n delete this.dragCtx\n return true\n}\n\nReactionPlusTool.prototype.click = function (event) {\n const rnd = this.editor.render\n const ci = this.editor.findItem(event, ['rxnPluses'])\n if (!ci) {\n this.editor.update(fromPlusAddition(rnd.ctab, rnd.page2obj(event)))\n }\n}\n\nexport default ReactionPlusTool\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport scale from '../../util/scale'\nimport Action from '../shared/action'\nimport draw from '../../render/draw'\n\nimport { fromAtomsAttrs } from '../actions/atom'\n\nfunction ReactionMapTool(editor) {\n if (!(this instanceof ReactionMapTool)) return new ReactionMapTool(editor)\n\n this.editor = editor\n this.editor.selection(null)\n}\n\nReactionMapTool.prototype.mousedown = function (event) {\n const rnd = this.editor.render\n this.rcs = rnd.ctab.molecule.getComponents()\n\n const ci = this.editor.findItem(event, ['atoms'])\n if (ci && ci.map === 'atoms') {\n this.editor.hover(null)\n this.dragCtx = {\n item: ci,\n xy0: rnd.page2obj(event)\n }\n }\n}\nReactionMapTool.prototype.mousemove = function (event) {\n var rnd = this.editor.render\n if ('dragCtx' in this) {\n var ci = this.editor.findItem(event, ['atoms'], this.dragCtx.item)\n var atoms = rnd.ctab.molecule.atoms\n if (\n ci &&\n ci.map === 'atoms' &&\n isValidMap(this.rcs, this.dragCtx.item.id, ci.id)\n ) {\n this.editor.hover(ci)\n this.updateLine(atoms.get(this.dragCtx.item.id).pp, atoms.get(ci.id).pp)\n } else {\n this.editor.hover(null)\n this.updateLine(atoms.get(this.dragCtx.item.id).pp, rnd.page2obj(event))\n }\n } else {\n this.editor.hover(this.editor.findItem(event, ['atoms']))\n }\n}\n\nReactionMapTool.prototype.updateLine = function (p1, p2) {\n if (this.line) {\n this.line.remove()\n this.line = null\n }\n if (p1 && p2) {\n var rnd = this.editor.render\n this.line = draw.selectionLine(\n rnd.paper,\n scale.obj2scaled(p1, rnd.options).add(rnd.options.offset),\n scale.obj2scaled(p2, rnd.options).add(rnd.options.offset),\n rnd.options\n )\n }\n}\n\nReactionMapTool.prototype.mouseup = function (event) {\n // eslint-disable-line max-statements\n if ('dragCtx' in this) {\n var rnd = this.editor.render\n var ci = this.editor.findItem(event, ['atoms'], this.dragCtx.item)\n if (\n ci &&\n ci.map === 'atoms' &&\n isValidMap(this.rcs, this.dragCtx.item.id, ci.id)\n ) {\n var action = new Action()\n var atoms = rnd.ctab.molecule.atoms\n var atom1 = atoms.get(this.dragCtx.item.id)\n var atom2 = atoms.get(ci.id)\n var aam1 = atom1.aam\n var aam2 = atom2.aam\n if (!aam1 || aam1 !== aam2) {\n if ((aam1 && aam1 !== aam2) || (!aam1 && aam2)) {\n // eslint-disable-line no-mixed-operators\n atoms.forEach((atom, aid) => {\n if (\n aid !== this.dragCtx.item.id &&\n ((aam1 && atom.aam === aam1) || (aam2 && atom.aam === aam2))\n )\n action.mergeWith(fromAtomsAttrs(rnd.ctab, aid, { aam: 0 }))\n })\n }\n if (aam1) {\n action.mergeWith(fromAtomsAttrs(rnd.ctab, ci.id, { aam: aam1 }))\n } else {\n var aam = 0\n atoms.forEach(atom => {\n aam = Math.max(aam, atom.aam || 0)\n })\n action.mergeWith(\n fromAtomsAttrs(rnd.ctab, this.dragCtx.item.id, { aam: aam + 1 })\n )\n action.mergeWith(fromAtomsAttrs(rnd.ctab, ci.id, { aam: aam + 1 }))\n }\n this.editor.update(action)\n }\n }\n this.updateLine(null)\n delete this.dragCtx\n }\n this.editor.hover(null)\n}\n\nfunction isValidMap(rcs, aid1, aid2) {\n var t1\n var t2\n for (var ri = 0; (!t1 || !t2) && ri < rcs.reactants.length; ri++) {\n var ro = Array.from(rcs.reactants[ri])\n if (!t1 && ro.indexOf(aid1) >= 0) t1 = 'r'\n if (!t2 && ro.indexOf(aid2) >= 0) t2 = 'r'\n }\n for (var pi = 0; (!t1 || !t2) && pi < rcs.products.length; pi++) {\n var po = Array.from(rcs.products[pi])\n if (!t1 && po.indexOf(aid1) >= 0) t1 = 'p'\n if (!t2 && po.indexOf(aid2) >= 0) t2 = 'p'\n }\n return t1 && t2 && t1 !== t2\n}\n\nexport default ReactionMapTool\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport Action from '../shared/action'\nimport { fromAtomsAttrs } from '../actions/atom'\n\nfunction ReactionUnmapTool(editor) {\n if (!(this instanceof ReactionUnmapTool)) return new ReactionUnmapTool(editor)\n\n this.editor = editor\n this.editor.selection(null)\n}\nReactionUnmapTool.prototype.mousemove = function (event) {\n var ci = this.editor.findItem(event, ['atoms'])\n if (ci && ci.map === 'atoms')\n this.editor.hover(\n this.editor.render.ctab.molecule.atoms.get(ci.id).aam ? ci : null\n )\n else this.editor.hover(null)\n}\nReactionUnmapTool.prototype.mouseup = function (event) {\n var ci = this.editor.findItem(event, ['atoms'])\n var atoms = this.editor.render.ctab.molecule.atoms\n if (ci && ci.map === 'atoms' && atoms.get(ci.id).aam) {\n var action = new Action()\n var aam = atoms.get(ci.id).aam\n atoms.forEach((atom, aid) => {\n if (atom.aam === aam)\n action.mergeWith(\n fromAtomsAttrs(this.editor.render.ctab, aid, { aam: 0 })\n )\n })\n this.editor.update(action)\n }\n this.editor.hover(null)\n}\n\nexport default ReactionUnmapTool\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport { fromPaste } from '../actions/paste'\nimport {\n fromItemsFuse,\n getItemsToFuse,\n getHoverToFuse\n} from '../actions/closely-fusing'\n\nfunction PasteTool(editor, struct) {\n if (!(this instanceof PasteTool)) return new PasteTool(editor, struct)\n\n this.editor = editor\n this.editor.selection(null)\n this.struct = struct\n\n const rnd = editor.render\n const point = editor.lastEvent ? rnd.page2obj(editor.lastEvent) : null\n\n const [action, pasteItems] = fromPaste(rnd.ctab, this.struct, point)\n this.action = action\n this.editor.update(this.action, true)\n\n this.mergeItems = getItemsToFuse(this.editor, pasteItems)\n this.editor.hover(getHoverToFuse(this.mergeItems), this)\n}\n\nPasteTool.prototype.mousemove = function (event) {\n const rnd = this.editor.render\n\n if (this.action) this.action.perform(rnd.ctab)\n\n const [action, pasteItems] = fromPaste(\n rnd.ctab,\n this.struct,\n rnd.page2obj(event)\n )\n this.action = action\n this.editor.update(this.action, true)\n\n this.mergeItems = getItemsToFuse(this.editor, pasteItems)\n this.editor.hover(getHoverToFuse(this.mergeItems))\n}\n\nPasteTool.prototype.mouseup = function () {\n const editor = this.editor\n const restruct = editor.render.ctab\n\n editor.selection(null)\n\n this.action = this.action\n ? fromItemsFuse(restruct, this.mergeItems).mergeWith(this.action)\n : fromItemsFuse(restruct, this.mergeItems)\n\n editor.hover(null)\n\n if (this.action) {\n const action = this.action\n delete this.action\n this.editor.update(action)\n }\n}\n\nPasteTool.prototype.cancel = function () {\n const rnd = this.editor.render\n this.editor.hover(null)\n if (this.action) {\n this.action.perform(rnd.ctab) // revert the action\n delete this.action\n rnd.update()\n }\n}\nPasteTool.prototype.mouseleave = PasteTool.prototype.cancel\n\nexport default PasteTool\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport Vec2 from '../../util/vec2'\nimport Pile from '../../util/pile'\n\nimport { Bond } from '../../chem/struct'\n\nimport op from '../operations/op'\nimport utils from '../shared/utils'\nimport Action from '../shared/action'\n\nimport { structSelection, getRelSgroupsBySelection } from './utils'\n\nexport function fromFlip(restruct, selection, dir, center) {\n // eslint-disable-line max-statements\n const struct = restruct.molecule\n\n const action = new Action()\n\n if (!selection) selection = structSelection(struct)\n\n if (!selection.atoms) return action.perform(restruct)\n\n const fids = selection.atoms.reduce((acc, aid) => {\n const atom = struct.atoms.get(aid)\n\n if (!acc[atom.fragment]) acc[atom.fragment] = []\n\n acc[atom.fragment].push(aid)\n return acc\n }, {})\n\n const isFragFound = Object.keys(fids).find(frag => {\n frag = parseInt(frag, 10)\n return !struct.getFragmentIds(frag).equals(new Pile(fids[frag]))\n })\n\n if (isFragFound) return action // empty action\n\n Object.keys(fids).forEach(frag => {\n const fragment = new Pile(fids[frag])\n\n const bbox = struct.getCoordBoundingBox(fragment)\n const calcCenter =\n center ||\n new Vec2((bbox.max.x + bbox.min.x) / 2, (bbox.max.y + bbox.min.y) / 2)\n\n fragment.forEach(aid => {\n const atom = struct.atoms.get(aid)\n const d = flipItemByCenter(atom, calcCenter, dir)\n action.addOp(new op.AtomMove(aid, d))\n })\n\n if (!selection.sgroupData) {\n const sgroups = getRelSgroupsBySelection(restruct, Array.from(fragment))\n\n sgroups.forEach(sg => {\n const d = flipItemByCenter(sg, calcCenter, dir)\n action.addOp(new op.SGroupDataMove(sg.id, d))\n })\n }\n })\n\n if (selection.bonds) {\n selection.bonds.forEach(bid => {\n const bond = struct.bonds.get(bid)\n\n if (bond.type !== Bond.PATTERN.TYPE.SINGLE) return\n\n if (bond.stereo === Bond.PATTERN.STEREO.UP) {\n action.addOp(new op.BondAttr(bid, 'stereo', Bond.PATTERN.STEREO.DOWN))\n return\n }\n\n if (bond.stereo === Bond.PATTERN.STEREO.DOWN)\n action.addOp(new op.BondAttr(bid, 'stereo', Bond.PATTERN.STEREO.UP))\n })\n }\n\n return action.perform(restruct)\n}\n\nfunction flipItemByCenter(item, center, dir) {\n const d = new Vec2()\n /* eslint-disable no-mixed-operators*/\n if (dir === 'horizontal') {\n d.x =\n center.x > item.pp.x\n ? 2 * (center.x - item.pp.x)\n : -2 * (item.pp.x - center.x)\n } else {\n // 'vertical'\n d.y =\n center.y > item.pp.y\n ? 2 * (center.y - item.pp.y)\n : -2 * (item.pp.y - center.y)\n }\n /* eslint-enable no-mixed-operators*/\n return d\n}\n\nexport function fromRotate(restruct, selection, center, angle) {\n // eslint-disable-line\n const struct = restruct.molecule\n\n const action = new Action()\n\n if (!selection) selection = structSelection(struct)\n\n if (selection.atoms) {\n selection.atoms.forEach(aid => {\n const atom = struct.atoms.get(aid)\n action.addOp(new op.AtomMove(aid, rotateDelta(atom.pp, center, angle)))\n })\n\n if (!selection.sgroupData) {\n const sgroups = getRelSgroupsBySelection(restruct, selection.atoms)\n\n sgroups.forEach(sg => {\n action.addOp(\n new op.SGroupDataMove(sg.id, rotateDelta(sg.pp, center, angle))\n )\n })\n }\n }\n\n if (selection.rxnArrows) {\n selection.rxnArrows.forEach(aid => {\n var arrow = struct.rxnArrows.get(aid)\n action.addOp(\n new op.RxnArrowMove(aid, rotateDelta(arrow.pp, center, angle))\n )\n })\n }\n\n if (selection.rxnPluses) {\n selection.rxnPluses.forEach(pid => {\n var plus = struct.rxnPluses.get(pid)\n action.addOp(new op.RxnPlusMove(pid, rotateDelta(plus.pp, center, angle)))\n })\n }\n\n if (selection.sgroupData) {\n selection.sgroupData.forEach(did => {\n var data = struct.sgroups.get(did)\n action.addOp(\n new op.SGroupDataMove(did, rotateDelta(data.pp, center, angle))\n )\n })\n }\n\n if (selection.enhancedFlags) {\n selection.enhancedFlags.forEach(fid => {\n const flag = restruct.enhancedFlags.get(fid)\n action.addOp(\n new op.EnhancedFlagMove(fid, rotateDelta(flag.pp, center, angle))\n )\n })\n }\n\n return action.perform(restruct)\n}\n\nexport function fromBondAlign(restruct, bid, dir) {\n const struct = restruct.molecule\n const bond = struct.bonds.get(bid)\n const begin = struct.atoms.get(bond.begin)\n const end = struct.atoms.get(bond.end)\n\n const center = begin.pp.add(end.pp).scaled(0.5)\n let angle = utils.calcAngle(begin.pp, end.pp)\n const atoms = Array.from(struct.getFragmentIds(begin.fragment))\n\n // TODO: choose minimal angle\n angle = dir === 'horizontal' ? -angle : Math.PI / 2 - angle\n\n if (angle === 0 || Math.abs(angle) === Math.PI)\n return fromFlip(restruct, { atoms }, dir, center)\n\n return fromRotate(restruct, { atoms }, center, angle)\n}\n\nfunction rotateDelta(v, center, angle) {\n var v1 = v.sub(center)\n v1 = v1.rotate(angle)\n v1.add_(center) // eslint-disable-line no-underscore-dangle\n return v1.sub(v)\n}\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport Vec2 from '../../util/vec2'\n\nimport utils from '../shared/utils'\nimport { fromRotate, fromFlip, fromBondAlign } from '../actions/rotate'\nimport {\n fromItemsFuse,\n getItemsToFuse,\n getHoverToFuse\n} from '../actions/closely-fusing'\n\nfunction RotateTool(editor, dir) {\n if (!(this instanceof RotateTool)) {\n if (!dir) return new RotateTool(editor)\n\n const restruct = editor.render.ctab\n const selection = editor.selection()\n const singleBond =\n selection &&\n selection.bonds &&\n Object.keys(selection).length === 1 &&\n selection.bonds.length === 1\n\n const action = !singleBond\n ? fromFlip(restruct, selection, dir)\n : fromBondAlign(restruct, selection.bonds[0], dir)\n editor.update(action)\n return null\n }\n\n this.editor = editor\n\n if (!editor.selection() || !editor.selection().atoms)\n // otherwise, clear selection\n this.editor.selection(null)\n}\n\nRotateTool.prototype.mousedown = function (event) {\n var xy0 = new Vec2()\n var selection = this.editor.selection()\n var rnd = this.editor.render\n var struct = rnd.ctab.molecule\n\n if (selection && selection.atoms) {\n console.assert(selection.atoms.length > 0)\n\n var rotId = null\n var rotAll = false\n\n selection.atoms.forEach(aid => {\n var atom = struct.atoms.get(aid)\n\n xy0.add_(atom.pp) // eslint-disable-line no-underscore-dangle\n\n if (rotAll) return\n\n atom.neighbors.find(nei => {\n var hb = struct.halfBonds.get(nei)\n\n if (selection.atoms.indexOf(hb.end) === -1) {\n if (hb.loop >= 0) {\n var neiAtom = struct.atoms.get(aid)\n if (\n !neiAtom.neighbors.find(neiNei => {\n var neiHb = struct.halfBonds.get(neiNei)\n return (\n neiHb.loop >= 0 && selection.atoms.indexOf(neiHb.end) !== -1\n )\n })\n ) {\n rotAll = true\n return true\n }\n }\n if (rotId == null) {\n rotId = aid\n } else if (rotId !== aid) {\n rotAll = true\n return true\n }\n }\n return false\n })\n })\n\n if (!rotAll && rotId !== null) xy0 = struct.atoms.get(rotId).pp\n else xy0 = xy0.scaled(1 / selection.atoms.length)\n } else if (struct.atoms?.size) {\n struct.atoms.forEach(atom => {\n xy0.add_(atom.pp)\n }) // eslint-disable-line no-underscore-dangle, max-len\n // poor man struct center (without sdata, etc)\n xy0 = xy0.scaled(1 / struct.atoms.size)\n } else {\n xy0 = rnd.page2obj(event)\n }\n this.dragCtx = {\n xy0,\n angle1: utils.calcAngle(xy0, rnd.page2obj(event))\n }\n return true\n}\n\nRotateTool.prototype.mousemove = function (event) {\n // eslint-disable-line max-statements\n if (!this.dragCtx) return true\n\n const rnd = this.editor.render\n const dragCtx = this.dragCtx\n\n const pos = rnd.page2obj(event)\n let angle = utils.calcAngle(dragCtx.xy0, pos) - dragCtx.angle1\n if (!event.ctrlKey) angle = utils.fracAngle(angle)\n\n const degrees = utils.degrees(angle)\n\n if ('angle' in dragCtx && dragCtx.angle === degrees) return true\n if ('action' in dragCtx) dragCtx.action.perform(rnd.ctab)\n\n dragCtx.angle = degrees\n dragCtx.action = fromRotate(\n rnd.ctab,\n this.editor.selection(),\n dragCtx.xy0,\n angle\n )\n\n this.editor.event.message.dispatch({ info: degrees + 'º' })\n\n const expSel = this.editor.explicitSelected()\n dragCtx.mergeItems = getItemsToFuse(this.editor, expSel)\n this.editor.hover(getHoverToFuse(dragCtx.mergeItems))\n\n this.editor.update(dragCtx.action, true)\n return true\n}\n\nRotateTool.prototype.mouseup = function () {\n if (!this.dragCtx) return true\n const dragCtx = this.dragCtx\n const restruct = this.editor.render.ctab\n\n const action = dragCtx.action\n ? fromItemsFuse(restruct, dragCtx.mergeItems).mergeWith(dragCtx.action)\n : fromItemsFuse(restruct, dragCtx.mergeItems)\n delete this.dragCtx\n\n this.editor.update(action)\n this.editor.hover(null)\n if (dragCtx.mergeItems) this.editor.selection(null)\n this.editor.event.message.dispatch({\n info: false\n })\n return true\n}\n\nRotateTool.prototype.cancel = RotateTool.prototype.mouseup\nRotateTool.prototype.mouseleave = RotateTool.prototype.mouseup\n\nexport default RotateTool\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\nimport { fromMultipleMove } from '../actions/fragment'\nimport {\n fromSimpleObjectAddition,\n fromSimpleObjectResizing,\n fromSimpleObjectDeletion\n} from '../actions/simpleobject'\n\nfunction SimpleObjectTool(editor, mode) {\n if (!(this instanceof SimpleObjectTool))\n return new SimpleObjectTool(editor, mode)\n\n this.mode = mode\n this.editor = editor\n this.editor.selection(null)\n}\n\nSimpleObjectTool.prototype.mousedown = function (event) {\n var rnd = this.editor.render\n const p0 = rnd.page2obj(event)\n this.dragCtx = { p0 }\n\n var ci = this.editor.findItem(event, ['simpleObjects'])\n if (ci && ci.map === 'simpleObjects') {\n this.editor.hover(null)\n this.editor.selection({ simpleObjects: [ci.id] })\n this.dragCtx.ci = ci\n } else {\n this.dragCtx.isNew = true\n }\n}\n\nSimpleObjectTool.prototype.mousemove = function (event) {\n var rnd = this.editor.render\n if (this.dragCtx) {\n const current = rnd.page2obj(event)\n const diff = current.sub(this.dragCtx.p0)\n this.dragCtx.previous = current\n if (this.dragCtx.ci) {\n if (this.dragCtx.action) this.dragCtx.action.perform(rnd.ctab)\n if (!this.dragCtx.ci.ref) {\n this.dragCtx.action = fromMultipleMove(\n rnd.ctab,\n this.editor.selection() || {},\n diff\n )\n } else {\n this.dragCtx.action = fromSimpleObjectResizing(\n rnd.ctab,\n this.dragCtx.ci.id,\n diff,\n current,\n this.dragCtx.ci.ref\n )\n }\n this.editor.update(this.dragCtx.action, true)\n } else {\n if (!this.dragCtx.action) {\n const action = fromSimpleObjectAddition(\n rnd.ctab,\n [this.dragCtx.p0, this.dragCtx.p0],\n this.mode\n )\n //TODO: need to rework actions/operations logic\n const addOperation = action.operations[0]\n const itemId = addOperation.data.id\n this.dragCtx.itemId = itemId\n this.dragCtx.action = action\n this.editor.update(this.dragCtx.action, true)\n } else {\n this.dragCtx.action.perform(rnd.ctab)\n }\n\n this.dragCtx.action = fromSimpleObjectResizing(\n rnd.ctab,\n this.dragCtx.itemId,\n diff,\n current,\n null\n )\n this.editor.update(this.dragCtx.action, true)\n }\n } else {\n const items = this.editor.findItem(event, ['simpleObjects'])\n this.editor.hover(items)\n }\n}\n\nSimpleObjectTool.prototype.mouseup = function (event) {\n if (!this.dragCtx) return true\n\n if (this.dragCtx.action) {\n if (this.dragCtx.isNew) {\n const rnd = this.editor.render\n this.editor.update(\n fromSimpleObjectDeletion(rnd.ctab, this.dragCtx.itemId),\n true\n )\n this.dragCtx.action = fromSimpleObjectAddition(\n rnd.ctab,\n [this.dragCtx.p0, this.dragCtx.previous],\n this.mode\n )\n }\n this.editor.update(this.dragCtx.action)\n }\n\n delete this.dragCtx\n return true\n}\n\nexport default SimpleObjectTool\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport op from '../operations/op'\nimport Action from '../shared/action'\n\nexport function fromArrowAddition(restruct, pos) {\n var action = new Action()\n if (restruct.molecule.rxnArrows.size < 1)\n action.addOp(new op.RxnArrowAdd(pos).perform(restruct))\n return action\n}\n\nexport function fromArrowDeletion(restruct, id) {\n var action = new Action()\n action.addOp(new op.RxnArrowDelete(id))\n return action.perform(restruct)\n}\n\nexport function fromPlusAddition(restruct, pos) {\n var action = new Action()\n action.addOp(new op.RxnPlusAdd(pos).perform(restruct))\n return action\n}\n\nexport function fromPlusDeletion(restruct, id) {\n var action = new Action()\n action.addOp(new op.RxnPlusDelete(id))\n return action.perform(restruct)\n}\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport Vec2 from '../../util/vec2'\n\nimport op from '../operations/op'\nimport Action from '../shared/action'\n\nimport { atomGetAttr } from './utils'\nimport { fromBondAddition } from './bond'\n\nexport function fromChain(restruct, p0, v, nSect, atomId) {\n // eslint-disable-line max-params\n const dx = Math.cos(Math.PI / 6)\n const dy = Math.sin(Math.PI / 6)\n\n let action = new Action()\n\n const frid =\n atomId !== null\n ? atomGetAttr(restruct, atomId, 'fragment')\n : action.addOp(new op.FragmentAdd().perform(restruct)).frid\n\n const chainItems = {\n atoms: [],\n bonds: []\n }\n\n let id0 =\n atomId !== null\n ? atomId\n : action.addOp(\n new op.AtomAdd({ label: 'C', fragment: frid }, p0).perform(restruct)\n ).data.aid\n\n chainItems.atoms.push(id0)\n action.operations.reverse()\n\n for (let i = 0; i < nSect; i++) {\n const pos = new Vec2(dx * (i + 1), i & 1 ? 0 : dy).rotate(v).add(p0)\n\n const ret = fromBondAddition(restruct, {}, id0, {}, pos)\n action = ret[0].mergeWith(action)\n id0 = ret[2]\n chainItems.bonds.push(ret[3])\n chainItems.atoms.push(id0)\n }\n\n return [action, chainItems]\n}\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport RGroupAtomTool from './rgroupatom'\nimport SelectTool from './select'\nimport SGroupTool from './sgroup'\nimport EraserTool from './eraser'\nimport AtomTool from './atom'\nimport BondTool from './bond'\nimport ChainTool from './chain'\nimport TemplateTool from './template'\nimport ChargeTool from './charge'\nimport RGroupFragmentTool from './rgroupfragment'\nimport APointTool from './apoint'\nimport AttachTool from './attach'\nimport ReactionArrowTool from './reactionarrow'\nimport ReactionPlusTool from './reactionplus'\nimport ReactionMapTool from './reactionmap'\nimport ReactionUnmapTool from './reactionunmap'\nimport PasteTool from './paste'\nimport RotateTool from './rotate'\nimport EnhancedStereoTool from './enhanced-stereo'\nimport SimpleObjectTool from './simpleobject'\n\nconst tools = {\n rgroupatom: RGroupAtomTool,\n select: SelectTool,\n sgroup: SGroupTool,\n eraser: EraserTool,\n atom: AtomTool,\n bond: BondTool,\n chain: ChainTool,\n template: TemplateTool,\n charge: ChargeTool,\n rgroupfragment: RGroupFragmentTool,\n apoint: APointTool,\n attach: AttachTool,\n reactionarrow: ReactionArrowTool,\n reactionplus: ReactionPlusTool,\n reactionmap: ReactionMapTool,\n reactionunmap: ReactionUnmapTool,\n paste: PasteTool,\n rotate: RotateTool,\n enhancedStereo: EnhancedStereoTool,\n simpleobject: SimpleObjectTool\n}\n\nexport default tools\n","import Pile from '../../util/pile'\n\nimport { fromAtomsAttrs } from '../actions/atom'\nimport { fromStereoFlagUpdate } from '../actions/fragment'\nimport { findStereoAtoms } from '../actions/utils'\n\nfunction EnhancedStereoTool(editor) {\n if (!(this instanceof EnhancedStereoTool)) {\n const selection = editor.selection()\n if (!selection || !selection.atoms) return null\n\n const stereoAtoms = findStereoAtoms(editor.struct(), selection.atoms) // Map \n if (stereoAtoms.length === 0) return null\n\n if (checkSelectionForFragment(editor, selection)) {\n changeFragmentStereoAction(editor, stereoAtoms).then(\n action => action && editor.update(action)\n )\n } else {\n changeAtomsStereoAction(editor, stereoAtoms).then(\n action => action && editor.update(action)\n )\n }\n }\n}\n\nfunction changeAtomsStereoAction(editor, stereoAtoms) {\n const struct = editor.struct()\n const restruct = editor.render.ctab\n const res = editor.event.enhancedStereoEdit.dispatch({\n type: 'atoms',\n stereoLabel: struct.atoms.get(stereoAtoms[0]).stereoLabel\n })\n return res.then(stereoLabel => {\n const action = fromAtomsAttrs(restruct, stereoAtoms, {\n stereoLabel\n }).mergeWith(\n fromStereoFlagUpdate(restruct, struct.atoms.get(stereoAtoms[0]).fragment)\n )\n action.operations.reverse()\n return action\n })\n}\n\nfunction changeFragmentStereoAction(editor, stereoAtoms) {\n const struct = editor.struct()\n const restruct = editor.render.ctab\n const frid = struct.atoms.get(stereoAtoms[0]).fragment\n const flag = struct.frags.get(frid).enhancedStereoFlag\n\n const res = editor.event.enhancedStereoEdit.dispatch({\n type: 'fragment',\n stereoFlag: flag\n })\n return res.then(({ stereoFlag }) => {\n if (stereoFlag === flag) return null\n const stereoLabel =\n stereoFlag !== null\n ? `${stereoFlag}${stereoFlag !== 'abs' ? '-1' : ''}`\n : null\n return fromStereoFlagUpdate(restruct, frid, stereoFlag).mergeWith(\n fromAtomsAttrs(restruct, stereoAtoms, { stereoLabel })\n )\n })\n}\n\nfunction checkSelectionForFragment(editor, selection) {\n const struct = editor.struct()\n const frid = struct.atoms.get(selection.atoms[0]).fragment\n const fragAids = new Pile(struct.getFragmentIds(frid))\n const selectionAids = new Pile(selection.atoms)\n\n return fragAids.equals(selectionAids)\n}\n\nexport default EnhancedStereoTool\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport s from 'subscription'\nimport Vec2 from '../util/vec2'\nimport Pile from '../util/pile'\n\nimport Struct from '../chem/struct'\nimport Render from '../render'\n\nimport { fromNewCanvas, fromDescriptorsAlign } from './actions/basic'\nimport closest from './shared/closest'\nimport toolMap from './tool'\n\nconst SCALE = 40\nconst HISTORY_SIZE = 32 // put me to options\n\nconst structObjects = [\n 'atoms',\n 'bonds',\n 'frags',\n 'sgroups',\n 'sgroupData',\n 'rgroups',\n 'rxnArrows',\n 'rxnPluses',\n 'enhancedFlags',\n 'simpleObjects'\n]\n\nfunction Editor(clientArea, options) {\n this.render = new Render(\n clientArea,\n Object.assign(\n {\n scale: SCALE\n },\n options\n )\n )\n\n this._selection = null // eslint-disable-line\n this._tool = null // eslint-disable-line\n this.historyStack = []\n this.historyPtr = 0\n\n this.event = {\n message: new s.Subscription(),\n elementEdit: new s.PipelineSubscription(),\n bondEdit: new s.PipelineSubscription(),\n rgroupEdit: new s.PipelineSubscription(),\n sgroupEdit: new s.PipelineSubscription(),\n sdataEdit: new s.PipelineSubscription(),\n quickEdit: new s.PipelineSubscription(),\n attachEdit: new s.PipelineSubscription(),\n change: new s.PipelineSubscription(),\n selectionChange: new s.PipelineSubscription(),\n aromatizeStruct: new s.PipelineSubscription(),\n dearomatizeStruct: new s.PipelineSubscription(),\n // TODO: correct\n enhancedStereoEdit: new s.PipelineSubscription()\n }\n\n domEventSetup(this, clientArea)\n}\n\nEditor.prototype.tool = function (name, opts) {\n /* eslint-disable no-underscore-dangle */\n if (arguments.length > 0) {\n if (this._tool && this._tool.cancel) this._tool.cancel()\n var tool = toolMap[name](this, opts)\n if (!tool) return null\n this._tool = tool\n }\n return this._tool\n /* eslint-enable no-underscore-dangle */\n}\n\nEditor.prototype.clear = function () {\n this.struct(null)\n}\n\nEditor.prototype.struct = function (value) {\n if (arguments.length > 0) {\n this.selection(null)\n this.update(fromNewCanvas(this.render.ctab, value || new Struct()))\n recoordinate(this, getStructCenter(this.render.ctab))\n }\n return this.render.ctab.molecule\n}\n\nEditor.prototype.options = function (value) {\n if (arguments.length > 0) {\n var struct = this.render.ctab.molecule\n var zoom = this.render.options.zoom\n this.render.clientArea.innerHTML = ''\n this.render = new Render(\n this.render.clientArea,\n Object.assign({ scale: SCALE }, value)\n )\n this.render.setMolecule(struct) // TODO: reuse this.struct here?\n this.render.setZoom(zoom)\n this.render.update()\n }\n return this.render.options\n}\n\nEditor.prototype.zoom = function (value) {\n if (arguments.length > 0) {\n this.render.setZoom(value)\n recoordinate(this, getStructCenter(this.render.ctab, this.selection()))\n this.render.update()\n }\n return this.render.options.zoom\n}\n\nEditor.prototype.selection = function (ci) {\n let restruct = this.render.ctab\n if (arguments.length > 0) {\n this._selection = null // eslint-disable-line\n if (ci === 'all') {\n // TODO: better way will be this.struct()\n ci = structObjects.reduce((res, key) => {\n res[key] = Array.from(restruct[key].keys())\n return res\n }, {})\n }\n\n if (ci === 'descriptors') {\n restruct = this.render.ctab\n ci = { sgroupData: Array.from(restruct['sgroupData'].keys()) }\n }\n\n if (ci) {\n var res = {}\n Object.keys(ci).forEach(key => {\n if (ci[key].length > 0)\n // TODO: deep merge\n res[key] = ci[key].slice()\n })\n if (Object.keys(res).length !== 0) this._selection = res // eslint-disable-line\n }\n\n this.render.ctab.setSelection(this._selection) // eslint-disable-line\n this.event.selectionChange.dispatch(this._selection) // eslint-disable-line\n\n this.render.update()\n }\n return this._selection // eslint-disable-line\n}\n\nEditor.prototype.hover = function (ci, newTool) {\n const tool = newTool || this._tool // eslint-disable-line\n\n if ('ci' in tool && (!ci || tool.ci.map !== ci.map || tool.ci.id !== ci.id)) {\n this.highlight(tool.ci, false)\n delete tool.ci\n }\n\n if (ci && this.highlight(ci, true)) tool.ci = ci\n}\n\nconst highlightTargets = [\n 'atoms',\n 'bonds',\n 'rxnArrows',\n 'rxnPluses',\n 'frags',\n 'merge',\n 'rgroups',\n 'sgroups',\n 'sgroupData',\n 'enhancedFlags',\n 'simpleObjects'\n]\n\nEditor.prototype.highlight = function (ci, visible) {\n if (highlightTargets.indexOf(ci.map) === -1) return false\n\n var rnd = this.render\n var item = null\n\n if (ci.map === 'merge') {\n Object.keys(ci.items).forEach(mp => {\n ci.items[mp].forEach(dstId => {\n item = rnd.ctab[mp].get(dstId)\n\n if (item) item.setHighlight(visible, rnd)\n })\n })\n\n return true\n }\n item = rnd.ctab[ci.map].get(ci.id)\n if (!item) return true // TODO: fix, attempt to highlight a deleted item\n if (\n (ci.map === 'sgroups' && item.item.type === 'DAT') ||\n ci.map === 'sgroupData'\n ) {\n // set highlight for both the group and the data item\n var item1 = rnd.ctab.sgroups.get(ci.id)\n var item2 = rnd.ctab.sgroupData.get(ci.id)\n if (item1) item1.setHighlight(visible, rnd)\n if (item2) item2.setHighlight(visible, rnd)\n } else {\n item.setHighlight(visible, rnd)\n }\n return true\n}\n\nEditor.prototype.update = function (action, ignoreHistory) {\n if (action === true) {\n this.render.update(true) // force\n } else {\n if (!ignoreHistory && !action.isDummy()) {\n this.historyStack.splice(this.historyPtr, HISTORY_SIZE + 1, action)\n if (this.historyStack.length > HISTORY_SIZE) this.historyStack.shift()\n this.historyPtr = this.historyStack.length\n this.event.change.dispatch(action) // TODO: stoppable here\n }\n this.render.update()\n }\n}\n\nEditor.prototype.historySize = function () {\n return {\n undo: this.historyPtr,\n redo: this.historyStack.length - this.historyPtr\n }\n}\n\nEditor.prototype.undo = function () {\n if (this.historyPtr === 0) throw new Error('Undo stack is empty')\n if (this.tool() && this.tool().cancel) this.tool().cancel()\n this.selection(null)\n if (this._tool instanceof toolMap['paste']) {\n this.event.change.dispatch()\n return\n }\n this.historyPtr--\n const action = this.historyStack[this.historyPtr].perform(this.render.ctab)\n this.historyStack[this.historyPtr] = action\n this.event.change.dispatch(action)\n this.render.update()\n}\n\nEditor.prototype.redo = function () {\n if (this.historyPtr === this.historyStack.length)\n throw new Error('Redo stack is empty')\n if (this.tool() && this.tool().cancel) this.tool().cancel()\n this.selection(null)\n if (this._tool instanceof toolMap['paste']) {\n this.event.change.dispatch()\n return\n }\n const action = this.historyStack[this.historyPtr].perform(this.render.ctab)\n this.historyStack[this.historyPtr] = action\n this.historyPtr++\n this.event.change.dispatch(action)\n this.render.update()\n}\n\nEditor.prototype.on = function (eventName, handler) {\n this.event[eventName].add(handler)\n}\n\nfunction isMouseRight(event) {\n return (\n (event.which && event.which === 3) || (event.button && event.button === 2)\n )\n}\n\nfunction domEventSetup(editor, clientArea) {\n // TODO: addEventListener('resize', ...);\n ;[\n 'click',\n 'dblclick',\n 'mousedown',\n 'mousemove',\n 'mouseup',\n 'mouseleave'\n ].forEach(eventName => {\n editor.event[eventName] = new s.DOMSubscription()\n const subs = editor.event[eventName]\n clientArea.addEventListener(eventName, subs.dispatch.bind(subs))\n\n subs.add(event => {\n if (eventName !== 'mouseup' && eventName !== 'mouseleave') {\n // to complete drag actions\n if (\n isMouseRight(event) ||\n !event.target ||\n event.target.nodeName === 'DIV'\n ) {\n // click on scroll\n editor.hover(null)\n return true\n }\n }\n const EditorTool = editor.tool()\n editor.lastEvent = event\n if (EditorTool && eventName in EditorTool) EditorTool[eventName](event)\n return true\n }, -1)\n })\n}\n\nEditor.prototype.findItem = function (event, maps, skip) {\n const pos = global._ui_editor\n ? new Vec2(this.render.page2obj(event)) // eslint-disable-line\n : new Vec2(event.pageX, event.pageY).sub(\n elementOffset(this.render.clientArea)\n )\n\n return closest.item(this.render.ctab, pos, maps, skip, this.render.options)\n}\n\nEditor.prototype.findMerge = function (srcItems, maps) {\n return closest.merge(this.render.ctab, srcItems, maps, this.render.options)\n}\n\nEditor.prototype.explicitSelected = function () {\n const selection = this.selection() || {}\n const res = structObjects.reduce((acc, key) => {\n acc[key] = selection[key] ? selection[key].slice() : []\n return acc\n }, {})\n\n const struct = this.render.ctab.molecule\n // \"auto-select\" the atoms for the bonds in selection\n if (res.bonds) {\n res.bonds.forEach(bid => {\n const bond = struct.bonds.get(bid)\n res.atoms = res.atoms || []\n if (res.atoms.indexOf(bond.begin) < 0) res.atoms.push(bond.begin)\n\n if (res.atoms.indexOf(bond.end) < 0) res.atoms.push(bond.end)\n })\n }\n // \"auto-select\" the bonds with both atoms selected\n if (res.atoms && res.bonds) {\n struct.bonds.forEach((bond, bid) => {\n if (!res.bonds.indexOf(bid) < 0) {\n if (\n res.atoms.indexOf(bond.begin) >= 0 &&\n res.atoms.indexOf(bond.end) >= 0\n ) {\n res.bonds = res.bonds || []\n res.bonds.push(bid)\n }\n }\n })\n }\n\n return res\n}\n\nEditor.prototype.structSelected = function () {\n const struct = this.render.ctab.molecule\n const selection = this.explicitSelected()\n const dst = struct.clone(\n new Pile(selection.atoms),\n new Pile(selection.bonds),\n true,\n null,\n new Pile(selection.simpleObjects)\n )\n\n // Copy by its own as Struct.clone doesn't support\n // arrows/pluses id sets\n struct.rxnArrows.forEach((item, id) => {\n if (selection.rxnArrows.indexOf(id) !== -1) dst.rxnArrows.add(item.clone())\n })\n struct.rxnPluses.forEach((item, id) => {\n if (selection.rxnPluses.indexOf(id) !== -1) dst.rxnPluses.add(item.clone())\n })\n\n // TODO: should be reaction only if arrwos? check this logic\n dst.isReaction =\n struct.isReaction && (dst.rxnArrows.size || dst.rxnPluses.size)\n\n return dst\n}\n\nEditor.prototype.alignDescriptors = function () {\n this.selection(null)\n const action = fromDescriptorsAlign(this.render.ctab)\n this.update(action)\n this.render.update(true)\n}\n\nfunction recoordinate(editor, rp /* , vp*/) {\n // rp is a point in scaled coordinates, which will be positioned\n // vp is the point where the reference point should now be (in view coordinates)\n // or the center if not set\n console.assert(rp, 'Reference point not specified')\n editor.render.setScrollOffset(0, 0)\n}\n\nfunction getStructCenter(restruct, selection) {\n var bb = restruct.getVBoxObj(selection || {})\n return Vec2.lc2(bb.p0, 0.5, bb.p1, 0.5)\n}\n\n// TODO: find DOM shorthand\nfunction elementOffset(element) {\n let top = 0\n let left = 0\n do {\n top += element.offsetTop || 0\n left += element.offsetLeft || 0\n element = element.offsetParent\n } while (element)\n return new Vec2(left, top)\n}\n\nexport default Editor\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport { upperFirst } from 'lodash/fp'\nimport React, { Component, createRef } from 'react'\nimport Editor from '../../editor'\n\n//TODO: need to update component after making refactoring of store\nfunction setupEditor(editor, props, oldProps = {}) {\n const { struct, tool, toolOpts, options } = props\n\n if (struct !== oldProps.struct) editor.struct(struct)\n\n if (tool !== oldProps.tool || toolOpts !== oldProps.toolOpts) {\n editor.tool(tool, toolOpts)\n if (toolOpts !== oldProps.toolOpts) {\n editor.event.message.dispatch({ info: JSON.stringify(toolOpts) })\n }\n }\n\n if (oldProps.options && options !== oldProps.options) editor.options(options)\n\n Object.keys(editor.event).forEach(name => {\n const eventName = `on${upperFirst(name)}`\n\n if (props[eventName] !== oldProps[eventName]) {\n if (oldProps[eventName]) editor.event[name].remove(oldProps[eventName])\n\n if (props[eventName]) editor.event[name].add(props[eventName])\n }\n })\n}\n\nfunction removeEditorHandlers(editor, props) {\n Object.keys(editor.event).forEach(name => {\n const eventName = `on${upperFirst(name)}`\n\n if (props[eventName]) editor.event[name].remove(props[eventName])\n })\n}\n\nclass StructEditor extends Component {\n constructor(props) {\n super(props)\n this.editorRef = createRef()\n this.logRef = createRef()\n }\n\n shouldComponentUpdate() {\n return false\n }\n\n componentWillReceiveProps(props) {\n setupEditor(this.editor, props, this.props)\n }\n\n componentDidMount() {\n this.editor = new Editor(this.editorRef.current, {\n ...this.props.options\n })\n setupEditor(this.editor, this.props)\n if (this.props.onInit) this.props.onInit(this.editor)\n\n this.editor.event.message.add(msg => {\n const el = this.logRef.current\n if (msg.info) {\n el.innerHTML = msg.info\n el.classList.add('visible')\n } else {\n el.classList.remove('visible')\n }\n })\n }\n\n componentWillUnmount() {\n removeEditorHandlers(this.editor, this.props)\n }\n\n render() {\n const {\n Tag = 'div',\n struct,\n tool,\n toolOpts,\n options,\n onInit,\n onSelectionChange,\n onElementEdit,\n onEnhancedStereoEdit,\n onQuickEdit,\n onBondEdit,\n onRgroupEdit,\n onSgroupEdit,\n onSdataEdit,\n onMessage,\n onAromatizeStruct,\n onDearomatizeStruct,\n onAttachEdit,\n ...props\n } = this.props\n return (\n ev.preventDefault()}\n {...props}\n ref={this.editorRef}>\n {/* svg here */}\n
\n \n )\n }\n}\n\nexport default StructEditor\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport { connect } from 'react-redux'\nimport initEditor from '../state/editor'\nimport StructEditor from '../component/structeditor'\n\nconst AppEditor = connect(\n state => ({\n options: state.options.settings\n }),\n dispatch => dispatch(initEditor)\n)(StructEditor)\n\nexport default AppEditor\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport React, { Component, createRef } from 'react'\n\nimport * as KN from 'w3c-keyname'\n\nclass Dialog extends Component {\n constructor(props) {\n super(props)\n this.formRef = createRef()\n }\n exit(mode) {\n const { params, result = () => null, valid = () => !!result() } = this.props\n const key = mode === 'OK' ? 'onOk' : 'onCancel'\n if (params && key in params && (key !== 'onOk' || valid()))\n params[key](result())\n }\n keyDown(ev) {\n const key = KN.keyName(ev)\n const active = document.activeElement\n const activeTextarea = active && active.tagName === 'TEXTAREA'\n if (key === 'Escape' || (key === 'Enter' && !activeTextarea)) {\n this.exit(key === 'Enter' ? 'OK' : 'Cancel')\n ev.preventDefault()\n ev.stopPropagation()\n }\n }\n\n componentDidMount() {\n const fe =\n this.formRef.current.querySelector(\n [\n 'input:not([type=checkbox]):not([type=button])',\n 'textarea',\n '[contenteditable]',\n 'select'\n ].join(',')\n ) || this.formRef.current.querySelector(['button.close'].join(','))\n if (fe.focus) fe.focus()\n }\n\n componentWillUnmount() {\n ;(document.querySelector('.cliparea') || document.body).focus()\n }\n\n render() {\n const {\n children,\n title,\n params = {},\n result = () => null,\n valid = () => !!result(), // Hmm, dublicate.. No simple default props\n buttons = ['Cancel', 'OK'],\n ...props\n } = this.props // see: https://git.io/v1KR6\n return (\n ev.preventDefault()}\n onKeyDown={ev => this.keyDown(ev)}\n tabIndex=\"-1\"\n {...props}>\n
\n {title}\n {params.onCancel && title && (\n \n )}\n
\n
{children}
\n\n
\n {buttons.map(b =>\n typeof b !== 'string' ? (\n b\n ) : (\n this.exit(b)}\n />\n )\n )}\n
\n \n )\n }\n}\n\nexport default Dialog\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport React, { Component } from 'react'\n\nclass OpenButton extends Component {\n constructor(props) {\n super(props)\n this.state = {}\n if (props.server) {\n fileOpener(props.server).then(opener => {\n this.setState({ opener })\n })\n }\n }\n\n open(ev) {\n const files = ev.target.files\n const noop = () => null\n const { onLoad = noop, onError = noop } = this.props\n\n if (this.state.opener && files.length)\n this.state.opener(files[0]).then(onLoad, onError)\n else if (files.length) onLoad(files[0])\n ev.target.value = null\n ev.preventDefault()\n }\n\n render() {\n const {\n children,\n type,\n server,\n className = 'open-button',\n ...props\n } = this.props\n\n return (\n \n )\n }\n}\n\nfunction fileOpener(server) {\n return new Promise((resolve, reject) => {\n // TODO: refactor return\n if (global.FileReader) {\n resolve(throughFileReader)\n } else if (global.ActiveXObject) {\n try {\n const fso = new ActiveXObject('Scripting.FileSystemObject') // eslint-disable-line no-undef\n resolve(file => Promise.resolve(throughFileSystemObject(fso, file)))\n } catch (e) {\n reject(e)\n }\n } else if (server) {\n resolve(\n server.then(() => {\n throw Error(\"Server doesn't still support echo method\")\n // return resolve(throughForm2IframePosting);\n })\n )\n } else {\n reject(new Error('Your browser does not support opening files locally'))\n }\n })\n}\n\nfunction throughFileReader(file) {\n return new Promise((resolve, reject) => {\n const rd = new FileReader() // eslint-disable-line no-undef\n\n rd.onload = () => {\n const content = rd.result\n if (file.msClose) file.msClose()\n resolve(content)\n }\n\n rd.onerror = event => {\n reject(event)\n }\n\n rd.readAsText(file, 'UTF-8')\n })\n}\n\nfunction throughFileSystemObject(fso, file) {\n // IE9 and below\n const fd = fso.OpenTextFile(file.name, 1)\n const content = fd.ReadAll()\n fd.Close()\n return content\n}\n\nexport default OpenButton\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport { isEqual, isEmpty, pickBy } from 'lodash/fp'\nimport acts from '../../action'\n\nfunction execute(activeTool, { action, editor, server, options }) {\n if (action.tool) {\n if (editor.tool(action.tool, action.opts)) return action\n } else if (typeof action === 'function') {\n action(editor, server, options)\n } else {\n console.info('no action')\n }\n return activeTool\n}\n\nfunction selected(actObj, activeTool, { editor, server }) {\n if (typeof actObj.selected === 'function')\n return actObj.selected(editor, server)\n else if (actObj.action && actObj.action.tool)\n return isEqual(activeTool, actObj.action)\n return false\n}\n\nfunction disabled(actObj, { editor, server, options }) {\n if (typeof actObj.disabled === 'function')\n return actObj.disabled(editor, server, options)\n return false\n}\n\nfunction status(key, activeTool, params) {\n const actObj = acts[key]\n return pickBy(x => x, {\n selected: selected(actObj, activeTool, params),\n disabled: disabled(actObj, params)\n })\n}\n\nexport default function (state = null, { type, action, ...params }) {\n let activeTool\n switch (type) {\n case 'INIT':\n action = acts['select-lasso'].action\n case 'ACTION': // eslint-disable-line no-case-declarations\n activeTool = execute(state && state.activeTool, {\n ...params,\n action\n })\n case 'UPDATE':\n return Object.keys(acts).reduce(\n (res, key) => {\n const value = status(key, res.activeTool, params)\n if (!isEmpty(value)) res[key] = value\n return res\n },\n { activeTool: activeTool || state.activeTool }\n )\n default:\n return state\n }\n}\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport { capitalize, throttle, isEqual } from 'lodash/fp'\nimport { basic as basicAtoms } from '../../action/atoms'\nimport tools from '../../action/tools'\n\nconst initial = {\n freqAtoms: [],\n currentAtom: 0,\n opened: null,\n visibleTools: {\n select: 'select-lasso'\n }\n}\nconst MAX_ATOMS = 7\n\nfunction updateVisibleTools(visibleTool, activeTool) {\n const regExp = /(bond)(-)(common|stereo|query)/\n const menuHeight = window.innerHeight\n\n return Object.keys(visibleTool).reduce(\n (res, key) => {\n if (key === 'bond' && menuHeight > 700) return res // TODO remove me after update styles\n if (key === 'transform' && menuHeight > 800) return res\n if (key === 'rgroup' && menuHeight > 850) return res\n if (key === 'shape' && menuHeight > 900) return res\n if (!key.match(regExp) || menuHeight > 700) res[key] = visibleTool[key]\n return res\n },\n { ...activeTool }\n )\n}\n\nexport function initResize() {\n return function (dispatch, getState) {\n const onResize = throttle(250, () => {\n const state = getState()\n state.editor.render.update()\n dispatch({ type: 'CLEAR_VISIBLE', data: state.actionState.activeTool })\n })\n addEventListener('resize', onResize) // eslint-disable-line\n }\n}\n\n/* REDUCER */\nexport default function (state = initial, action) {\n const { type, data } = action\n\n switch (type) {\n case 'ACTION': {\n const visibleTool = toolInMenu(action.action)\n return visibleTool\n ? {\n ...state,\n opened: null,\n visibleTools: { ...state.visibleTools, ...visibleTool }\n }\n : { ...state, opened: null }\n }\n case 'ADD_ATOMS': {\n const newState = addFreqAtom(data, state.freqAtoms, state.currentAtom)\n return { ...state, ...newState }\n }\n case 'CLEAR_VISIBLE': {\n const activeTool = toolInMenu(action.data)\n const correctTools = updateVisibleTools(state.visibleTools, activeTool)\n return { ...state, opened: null, visibleTools: { ...correctTools } }\n }\n case 'OPENED': {\n return data.isSelected && state.opened\n ? { ...state, opened: null }\n : { ...state, opened: data.menuName }\n }\n case 'UPDATE':\n return { ...state, opened: null }\n case 'MODAL_OPEN':\n return { ...state, opened: null }\n default:\n return state\n }\n}\n/* ------- */\n\nfunction addFreqAtom(label, freqAtoms, index) {\n label = capitalize(label)\n if (basicAtoms.indexOf(label) > -1 || freqAtoms.indexOf(label) !== -1)\n return { freqAtoms }\n\n freqAtoms[index] = label\n index = (index + 1) % MAX_ATOMS\n\n return { freqAtoms, currentAtom: index }\n}\n\nexport function addAtoms(atomLabel) {\n return {\n type: 'ADD_ATOMS',\n data: atomLabel\n }\n}\n\nfunction toolInMenu(action) {\n const tool = Object.keys(tools).find(toolName =>\n isEqual(action, tools[toolName].action)\n )\n\n const sel = document.getElementById(tool)\n const dropdown = sel && hiddenAncestor(sel)\n\n return dropdown && dropdown.id !== '' ? { [dropdown.id]: sel.id } : null\n}\n\nexport function hiddenAncestor(el, base) {\n base = base || document.body\n let findEl = el\n\n while (\n window.getComputedStyle(findEl).overflow !== 'hidden' &&\n !findEl.classList.contains('opened')\n ) {\n if (findEl === base) return null\n findEl = findEl.parentNode\n }\n\n return findEl\n}\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport { pick } from 'lodash/fp'\n\nimport { createStore, combineReducers, applyMiddleware } from 'redux'\nimport thunk from 'redux-thunk'\nimport { logger } from 'redux-logger'\n\nimport actionStateReducer from './action'\nimport modalReducer from './modal'\nimport optionsReducer, { initOptionsState } from './options'\nimport templatesReducer, { initTmplsState } from './templates'\nimport toolbarReducer from './toolbar'\n\nimport { onAction, load } from './shared'\n\nexport { onAction, load }\n\nconst shared = combineReducers({\n actionState: actionStateReducer,\n toolbar: toolbarReducer,\n modal: modalReducer,\n server: (store = null) => store,\n editor: (store = null) => store,\n options: optionsReducer,\n templates: templatesReducer\n})\n\n/* ROOT REDUCER */\nfunction root(state, action) {\n switch (\n action.type // eslint-disable-line default-case\n ) {\n case 'INIT':\n global._ui_editor = action.editor\n global.ketcher.editor = action.editor\n case 'UPDATE': // eslint-disable-line no-case-declarations\n const { type, ...data } = action\n if (data) state = { ...state, ...data }\n }\n\n const sh = shared(state, {\n ...action,\n ...pick(['editor', 'server', 'options'], state)\n })\n\n const finalState =\n sh === state.shared\n ? state\n : {\n ...state,\n ...sh\n }\n\n //TODO: temporary solution. Need to review work with redux store\n global.currentState = finalState\n return finalState\n}\n\nexport default function (options, server) {\n // TODO: redux localStorage here\n const initState = {\n actionState: null,\n editor: null,\n modal: null,\n options: Object.assign(initOptionsState, { app: options }),\n server: server || Promise.reject(new Error('Standalone mode!')),\n templates: initTmplsState\n }\n\n const middleware = [thunk]\n\n if (process.env.NODE_ENV !== 'production') middleware.push(logger)\n\n return createStore(root, initState, applyMiddleware(...middleware))\n}\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport React, { Component, createRef } from 'react'\nimport { connect } from 'react-redux'\n\nimport { map as formatMap } from '../../data/convert/structformat'\nimport Dialog from '../../component/dialog'\nimport OpenButton from '../../component/view/openbutton'\nimport ClipArea, { exec } from '../../component/cliparea'\n\nimport { load } from '../../state'\n\nclass Open extends Component {\n constructor(props) {\n super(props)\n this.state = {\n structStr: '',\n fragment: false\n }\n this.textAreaRef = createRef()\n }\n result() {\n const { structStr, fragment } = this.state\n return structStr ? { structStr, fragment } : null\n }\n\n changeStructStr(structStr) {\n this.setState({ structStr })\n }\n\n changeFragment(target) {\n this.setState({\n fragment: target.checked\n })\n }\n\n render() {\n const { structStr, fragment } = this.state\n return (\n this.result()}\n params={this.props}\n buttons={[\n this.changeStructStr(s)}>\n Open From File…\n ,\n 'Cancel',\n 'OK'\n ]}>\n this.changeStructStr(ev.target.value)}\n />\n \n true}\n onCopy={() => ({ 'text/plain': structStr })}\n />\n \n )\n }\n}\n\nfunction structAcceptMimes() {\n return Object.keys(formatMap)\n .reduce(\n (res, key) => res.concat(formatMap[key].mime, ...formatMap[key].ext),\n []\n )\n .join(',')\n}\n\nexport default connect(\n store => ({ server: store.server }),\n (dispatch, props) => ({\n onOk: res => {\n if (res.fragment) exec('copy')\n dispatch(\n load(res.structStr, {\n badHeaderRecover: true,\n fragment: res.fragment\n })\n )\n props.onOk(res)\n }\n })\n)(Open)\n","/****************************************************************************\n * Copyright 2020 EPAM Systems\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n\nimport React, { Component } from 'react'\nimport { omit } from 'lodash'\n\nfunction GenericInput({\n schema,\n value = '',\n onChange,\n type = 'text',\n ...props\n}) {\n return (\n \n )\n}\n\nGenericInput.val = function (ev, schema) {\n const input = ev.target\n const isNumber =\n input.type === 'number' ||\n input.type === 'range' ||\n (schema && (schema.type === 'number' || schema.type === 'integer'))\n const value = isNumber ? input.value.replace(/,/g, '.') : input.value\n\n return isNumber && !isNaN(value - 0) ? value - 0 : value // eslint-disable-line\n}\n\nfunction TextArea({ schema, value, onChange, ...props }) {\n return