SlideShare a Scribd company logo
The Road to Damascus –A Conversion Experience: 
LS and @Formula to SSJS 
2014/09/12 –Matthew Fyleman
Matthew Fyleman 
21 Years as a Notes/Domino Developer 
Mostly Working on: 
Xpagesconversions 
Product development 
Who Am I?
When should you convert existing code? 
Conversion Options 
NotesAgent.run() with parameter doc 
Search and Replace 
Dedicated Tools 
Search and Replace 
Preparation 
Introduction to Regular Expressions 
Examples and Demonstration 
Tips and Traps 
Dedicated Tools 
Questions 
What am I talking about?
Never! 
When should you convert existing code?
It is always going to be slow 
GIGO 
You will introduce new bugs 
Re-developing will be quicker, cheaper and you will end up with a better result 
But if you really must ... 
What is the problem?
NotesAgent.run() 
Quick and Dirty 
Agent must run independently 
Only use when agents are available and time is critical 
Scheduled agents excluded –mostly! 
Search and Replace 
LotusScript-> JavaScript (and Java) 
Less useful for @Formula 
Dedicated Tools 
@Formula 
What are your options?
Search and Replace is most useful for LS conversion 
Syntactically similar 
Easiest if you do a little refactoring first 
Option Declare 
doc.field(0) -> doc.getItemValue(“Field“)(0) 
Camel Case Notes Objects 
Make Sure Method calls are consistently named 
Best to Avoid All-In-One-Go 
Function or Sub at a Time 
Variable with one purpose in one location may have a different use elsewhere 
Converting LotusScriptto SSJS -Preparation
Regular Expressions are your new BFF 
Sophisticated Pattern Matching 
Elements from search can be carried through to replace 
The Search and Replace built in to DDE can use Regular Expressions 
Useful outside LS conversion (e.g. Validation) 
See Planet Lotus -http://planetlotus.org/profiles/ross-swick_97733 
Regular Expressions
[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3} 
Example –What does this do?
Tidy up first –Option Declare, remove clustering e.g.: 
Dim xas Integer,yas Integer,zas Integer 
We want to match any variable name in the pattern: 
Dim <varname> As <Any valid type> 
Fairly simple: 
Dim[ ]+[A-Za-z0-9_]+[ ]+As[ ]+(Integer|String|Boolean|Double|Variant) 
But how do we replace? 
Modify the search: 
Dim[ ]+([w]*)[ ]+As[ ]+String 
Use this for replace 
var1 = “”; 
Starting Simple –Dim Statements
For Notes Objects, Things are simpler 
Dim <varname> As Notes<rest of object name> 
-Ignore ... As New NotesSessionfor now 
Also, initialising in SSJS, = null is ok: 
var<varname>:Notes<rest of object name> = null; 
So our terms are: 
Search: 
Dim[ ]+([w]*)[ ]+As[ ]+(Notes[w]*) 
Replace: 
var1:2 = null; 
Starting Simple –Dim Statements (2)
For the most part, simple S & R (but order is important): 
End If to} 
[ ]*Thento) { 
Else[ ]+If[ ]*to } else if ( 
Else [ ]*to } else { 
If[ ]* to if ( 
But what about: 
If (x = 10) Then 
Use Search: If[ ]+([w()[].<>" ]*)=([w()[].<> "]*)[ ]+Then 
Use Replace: if (1==2) { - 
NB: Works but not optimal! 
Other comparison operators not a problem 
A bit more complex –If Statements
The problem: 
Session object is global in ssjs: ‘session’ 
In LS it is created: 
Dim sessAs New NotesSession 
Need to find all LS session objects, and replace with session 
How do you get a list of session object names? 
! –session objects 
You need a coffee!
Java String Object has regexsearch and replace 
String source = “Dim x As String”; 
String result = source.replaceAll(“Dim[ ]+([w]*)[ ]+As[ ]+String”, “var$1 = “”;”); 
Pattern and Matcher objects make this even more powerful 
Pattern p = Pattern.compile(pattern); 
Matcher m = p.matcher(this.source); 
intstartPos= 0; 
while (m.find(startPos)) { 
if (!itemList.contains(m.group(1))) { 
itemList.add(m.group(1)); 
} 
startPos= m.end() + 1; 
} 
Adding Java
Similar Issue to Session 
Need to find all document object names, and replace field handling methods 
Will probably need to handle dot notation 
Arrgghh! 
How do you search for dot notation? 
<doc name>.([^GetItemValue])([0-9]+) 
Still hard work! 
Field Handling
There are other types than string! 
Always review and test converted code thoroughly 
Date handling is a pain 
Script libraries can help here –Java? 
Watch out for User interaction and particularly dialogues 
Work out your strategies in advance! 
Search and Replace –Tips and Traps
In some respects @Formula -> SSJS is easier than LS -> SSJS 
@Formula JavaScript Wrappers help a lot 
Mostly just ‘;’ to ‘,’, and converting lists to arrays 
Some constructions are obvious: 
@SetField(“Field”, Value); 
Goes to: 
doc.replaceItemValue(“Field”, Value); 
Or 
S: @SetField([ ]*([w”]*)[ ]*,[ ]*([w”]*)[ ]*); 
R: doc.replaceItemValue(1, 2); 
But there are some issues ... 
Converting Formula 
@
No direct equivalent in SSJS for *+, *= *>= etc. when applied to Lists 
Need to plan for this 
Java Class/Library to provide direct substitute 
Unfortunately, Java does not permit operator overloading, so has to be a set of methods 
Converting Formula –List Processing 
@!
@If(@Contains(_WFData_neu;_Key);""; 
@Do( 
@Set("_Sachgebiet_Zuordnung";@DbLookup("NOTES":"NOCACHE";"":_ADM$StructureDB;"Workflows";"WFArbeitsanweisung";"Sachgebietzuordnung")); 
@If(_Sachgebiet_Zuordnung = "" | !@Contains(_Sachgebiet_Zuordnung;_Key2);@Do( 
@Prompt([Ok];"Hinweis";"In der System Struktur VBM wurde für das aktuelle Sachgebiet kein Workflow definiert. Das Dokument wird zum ehemaligen Kompetenzträger zurückgegeben, damit dieser ein neues Sachgebiet auswählen kann."); 
@Set("_Kompetenzträger";Bearbeiter1); 
@Set("_tmpintern";5) 
); 
@Do( 
@Prompt([Ok];"Hinweis";"In der System Struktur VBM wurde für das aktuelle Sachgebiet ein neues Sachgebiet konfiguriert. Das Dokument wird zum Kompetenzträger zurückgegeben, damit dieser das neue Sachgebiet auswählen kann."); 
@Set("_neues_Sachgebiet";@Left(@Right(_Sachgebiet_Zuordnung;_key2);"||")); 
@Set("_Elements";@Elements(@Explode(@Left(@Left(@Right(_WFData_neu;"||Sachgebiet#");"||"); _neues_Sachgebiet) + _neues_Sachgebiet; "$" ))); 
@Set("_KompetenzträgerData";@Explode(@Left(@Right(_WFData_neu;"||Kompetenzträger#");"||"); "$")); 
@Set("_Kompetenzträger";@Subset(@Subset(_KompetenzträgerData;_Elements);-1)); 
@Set("_tmpintern";6) 
) 
) 
) 
); 
Converting Formula -@If, @Do and @While 
@!!
Focusing on @If 
•@Formula is a FUNCTION language 
•@If is a function not a statement 
•In practice: 
@SetField(“Author”; @If(Status=“1”; Manager; Salesman)); 
•Needs to convert to: 
if (Status == “1”) { 
varauthor = doc.getItemValueString(“Manager”); 
} else { 
varauthor = doc.getItemValueString(“Salesman”); 
} 
doc.replaceItemValue(“Author”, author); 
@!!!
Search and Replace can be used for @Formula -> SSJS ... 
... but it can only take you so far 
A dedicated tool can go further 
Only real alternative to manual translation for complex statements 
Time consuming to create 
Still not a silver bullet 
Tools
Espresso -http://www.ultrapico.com/Expresso.htm 
Good for learning regex, and serious regexdev 
Free! 
GREP 
Sophisticated regexfile search 
Where regex started (UNIX grep)! 
Third Party Tools
OpenNTF–www.openntf.org 
RegexQuick Reference 
http://www.night-ray.com/regex.pdf 
Loads of websites for all aspects of regexdevelopment 
Mastering Regular Expressions –Jeffrey E.F. Friedl– O’Reilly Publishing 
Resources and Information
Questions?
matthew.fyleman@we4it.com

More Related Content

PPTX
The Road To Damascus - A Conversion Experience: LotusScript and @Formula to SSJS
PDF
bccon-2014 dev03 xpages-road_to_damascas-lotus-script-and-@formula-to-ssjs
PPT
JavaScript Objects
PDF
Java script objects 1
 
PDF
awesome groovy
ODP
Grails: a quick tutorial (1)
PPT
JDK1.7 features
The Road To Damascus - A Conversion Experience: LotusScript and @Formula to SSJS
bccon-2014 dev03 xpages-road_to_damascas-lotus-script-and-@formula-to-ssjs
JavaScript Objects
Java script objects 1
 
awesome groovy
Grails: a quick tutorial (1)
JDK1.7 features

What's hot (18)

PPTX
Namespace in C++ Programming Language
PPTX
Grails GORM - You Know SQL. You Know Queries. Here's GORM.
PDF
groovy rules
PPT
Core java by a introduction sandesh sharma
PDF
Scala - en bedre Java?
PPT
2CPP15 - Templates
ODP
Functional programming with Scala
PDF
Scala - en bedre og mere effektiv Java?
PPTX
The JavaScript Programming Language
ODP
Functions & closures
PDF
Python dictionary : past, present, future
PPTX
Python lec4
PPTX
Python lec5
PPT
Introduction To Groovy
PPTX
Javascript
PPTX
Linq Introduction
PPTX
Context
Namespace in C++ Programming Language
Grails GORM - You Know SQL. You Know Queries. Here's GORM.
groovy rules
Core java by a introduction sandesh sharma
Scala - en bedre Java?
2CPP15 - Templates
Functional programming with Scala
Scala - en bedre og mere effektiv Java?
The JavaScript Programming Language
Functions & closures
Python dictionary : past, present, future
Python lec4
Python lec5
Introduction To Groovy
Javascript
Linq Introduction
Context
Ad

Similar to Icsug dev day2014_road to damascus - conversion experience-lotusscript and @formula to ssjs (20)

PDF
Icsug conf 14_dev03_xpages-roadtodamascas-lotus-script-and-formula-to-ssjs
PDF
Angular Schematics
PPTX
Introduction to Client-Side Javascript
PDF
Groovy On Trading Desk (2010)
PDF
Twins: Object Oriented Programming and Functional Programming
ODP
Practical catalyst
PPT
Prototype Js
PPT
PowerShell Core Skills (TechMentor Fall 2011)
PDF
Rich Internet Applications con JavaFX e NetBeans
PPTX
Refactoring
PPT
Introduction to PowerShell
PPT
Groovy Introduction - JAX Germany - 2008
PPTX
Clean Code
PDF
lab4_php
PDF
lab4_php
PDF
DataMapper
PPT
Pxb For Yapc2008
PDF
Modern, Scalable, Ambitious apps with Ember.js
PDF
Exploring Ceylon with Gavin King - JUG BB Talk - Belrin 2014
PPTX
DataWeave 2.0 Language Fundamentals
Icsug conf 14_dev03_xpages-roadtodamascas-lotus-script-and-formula-to-ssjs
Angular Schematics
Introduction to Client-Side Javascript
Groovy On Trading Desk (2010)
Twins: Object Oriented Programming and Functional Programming
Practical catalyst
Prototype Js
PowerShell Core Skills (TechMentor Fall 2011)
Rich Internet Applications con JavaFX e NetBeans
Refactoring
Introduction to PowerShell
Groovy Introduction - JAX Germany - 2008
Clean Code
lab4_php
lab4_php
DataMapper
Pxb For Yapc2008
Modern, Scalable, Ambitious apps with Ember.js
Exploring Ceylon with Gavin King - JUG BB Talk - Belrin 2014
DataWeave 2.0 Language Fundamentals
Ad

More from ICS User Group (20)

PDF
Domino Security Present and Future ConnectED Review - ICS.UG 2016
PDF
Moving DNUG Usergroup von on-premise in die IBM ConnectionsCloud - ICS.UG 2016
PDF
IBM Notes Traveler & IBM Mobile Connect What's new?, What's next? - ICS.UG 2016
PDF
Warum IBM mit Watson den Büroalltag revolutioniert - ICS.UG 2016
PDF
Private Cloud Storage - ICS.UG 2016
PDF
Die mobile Herausforderung meistern! - ICS.UG 2016
PDF
Cloud Update 2016 IBM Collaboration Solutions - Verse (&Toscana) - ICS.UG 2016
PDF
Cloud Update 2016 IBM Collaboration Solutions - ConnectionsCloud - ICS.UG 2016
PDF
OpenNTF - From Donation to Contribution - ICS.UG 2016
PDF
Virtual, Faster, Better! How to Virtualize the Rich Client and Browser Plugin...
PDF
Find your data - using GraphDB capabilities in XPages applications - ICS.UG 2016
PDF
XPages on IBM Bluemix: The Do's and Dont's - ICS.UG 2016
PDF
Die Zukunft spricht Domino! - ICS.UG 2016
PDF
Smashdocs - Dokumente gemeinsam schreiben - ICS.UG 2016
PDF
Smashdocs - Collaborative authoring & reviewing - ICS.UG 2016
PDF
IBM Digital Experience Overview - ICS.UG 2016
PDF
Watson - Bitte-helfen-Sie - ICS.UG 2016
PDF
Planung / Terminierung eines Außendienstes mit XPages - ICS.UG 2016
PDF
Beyond XPages ICS.UG 2015
PDF
ATLUG comes to you ICS.UG 2015
Domino Security Present and Future ConnectED Review - ICS.UG 2016
Moving DNUG Usergroup von on-premise in die IBM ConnectionsCloud - ICS.UG 2016
IBM Notes Traveler & IBM Mobile Connect What's new?, What's next? - ICS.UG 2016
Warum IBM mit Watson den Büroalltag revolutioniert - ICS.UG 2016
Private Cloud Storage - ICS.UG 2016
Die mobile Herausforderung meistern! - ICS.UG 2016
Cloud Update 2016 IBM Collaboration Solutions - Verse (&Toscana) - ICS.UG 2016
Cloud Update 2016 IBM Collaboration Solutions - ConnectionsCloud - ICS.UG 2016
OpenNTF - From Donation to Contribution - ICS.UG 2016
Virtual, Faster, Better! How to Virtualize the Rich Client and Browser Plugin...
Find your data - using GraphDB capabilities in XPages applications - ICS.UG 2016
XPages on IBM Bluemix: The Do's and Dont's - ICS.UG 2016
Die Zukunft spricht Domino! - ICS.UG 2016
Smashdocs - Dokumente gemeinsam schreiben - ICS.UG 2016
Smashdocs - Collaborative authoring & reviewing - ICS.UG 2016
IBM Digital Experience Overview - ICS.UG 2016
Watson - Bitte-helfen-Sie - ICS.UG 2016
Planung / Terminierung eines Außendienstes mit XPages - ICS.UG 2016
Beyond XPages ICS.UG 2015
ATLUG comes to you ICS.UG 2015

Recently uploaded (20)

PPTX
fundraisepro pitch deck elegant and modern
PPTX
INTERNATIONAL LABOUR ORAGNISATION PPT ON SOCIAL SCIENCE
PPTX
nose tajweed for the arabic alphabets for the responsive
PPT
First Aid Training Presentation Slides.ppt
PPTX
English-9-Q1-3-.pptxjkshbxnnxgchchxgxhxhx
PPTX
Presentation for DGJV QMS (PQP)_12.03.2025.pptx
PPTX
Introduction to Effective Communication.pptx
PPTX
Relationship Management Presentation In Banking.pptx
PPTX
Non-Verbal-Communication .mh.pdf_110245_compressed.pptx
PPTX
Emphasizing It's Not The End 08 06 2025.pptx
PDF
Swiggy’s Playbook: UX, Logistics & Monetization
PPTX
Introduction-to-Food-Packaging-and-packaging -materials.pptx
PPT
The Effect of Human Resource Management Practice on Organizational Performanc...
PPTX
Tour Presentation Educational Activity.pptx
PPTX
Project and change Managment: short video sequences for IBA
PDF
Instagram's Product Secrets Unveiled with this PPT
PDF
Presentation1 [Autosaved].pdf diagnosiss
PPTX
The spiral of silence is a theory in communication and political science that...
PPTX
Human Mind & its character Characteristics
PPTX
BIOLOGY TISSUE PPT CLASS 9 PROJECT PUBLIC
fundraisepro pitch deck elegant and modern
INTERNATIONAL LABOUR ORAGNISATION PPT ON SOCIAL SCIENCE
nose tajweed for the arabic alphabets for the responsive
First Aid Training Presentation Slides.ppt
English-9-Q1-3-.pptxjkshbxnnxgchchxgxhxhx
Presentation for DGJV QMS (PQP)_12.03.2025.pptx
Introduction to Effective Communication.pptx
Relationship Management Presentation In Banking.pptx
Non-Verbal-Communication .mh.pdf_110245_compressed.pptx
Emphasizing It's Not The End 08 06 2025.pptx
Swiggy’s Playbook: UX, Logistics & Monetization
Introduction-to-Food-Packaging-and-packaging -materials.pptx
The Effect of Human Resource Management Practice on Organizational Performanc...
Tour Presentation Educational Activity.pptx
Project and change Managment: short video sequences for IBA
Instagram's Product Secrets Unveiled with this PPT
Presentation1 [Autosaved].pdf diagnosiss
The spiral of silence is a theory in communication and political science that...
Human Mind & its character Characteristics
BIOLOGY TISSUE PPT CLASS 9 PROJECT PUBLIC

Icsug dev day2014_road to damascus - conversion experience-lotusscript and @formula to ssjs

  • 1. The Road to Damascus –A Conversion Experience: LS and @Formula to SSJS 2014/09/12 –Matthew Fyleman
  • 2. Matthew Fyleman 21 Years as a Notes/Domino Developer Mostly Working on: Xpagesconversions Product development Who Am I?
  • 3. When should you convert existing code? Conversion Options NotesAgent.run() with parameter doc Search and Replace Dedicated Tools Search and Replace Preparation Introduction to Regular Expressions Examples and Demonstration Tips and Traps Dedicated Tools Questions What am I talking about?
  • 4. Never! When should you convert existing code?
  • 5. It is always going to be slow GIGO You will introduce new bugs Re-developing will be quicker, cheaper and you will end up with a better result But if you really must ... What is the problem?
  • 6. NotesAgent.run() Quick and Dirty Agent must run independently Only use when agents are available and time is critical Scheduled agents excluded –mostly! Search and Replace LotusScript-> JavaScript (and Java) Less useful for @Formula Dedicated Tools @Formula What are your options?
  • 7. Search and Replace is most useful for LS conversion Syntactically similar Easiest if you do a little refactoring first Option Declare doc.field(0) -> doc.getItemValue(“Field“)(0) Camel Case Notes Objects Make Sure Method calls are consistently named Best to Avoid All-In-One-Go Function or Sub at a Time Variable with one purpose in one location may have a different use elsewhere Converting LotusScriptto SSJS -Preparation
  • 8. Regular Expressions are your new BFF Sophisticated Pattern Matching Elements from search can be carried through to replace The Search and Replace built in to DDE can use Regular Expressions Useful outside LS conversion (e.g. Validation) See Planet Lotus -http://planetlotus.org/profiles/ross-swick_97733 Regular Expressions
  • 10. Tidy up first –Option Declare, remove clustering e.g.: Dim xas Integer,yas Integer,zas Integer We want to match any variable name in the pattern: Dim <varname> As <Any valid type> Fairly simple: Dim[ ]+[A-Za-z0-9_]+[ ]+As[ ]+(Integer|String|Boolean|Double|Variant) But how do we replace? Modify the search: Dim[ ]+([w]*)[ ]+As[ ]+String Use this for replace var1 = “”; Starting Simple –Dim Statements
  • 11. For Notes Objects, Things are simpler Dim <varname> As Notes<rest of object name> -Ignore ... As New NotesSessionfor now Also, initialising in SSJS, = null is ok: var<varname>:Notes<rest of object name> = null; So our terms are: Search: Dim[ ]+([w]*)[ ]+As[ ]+(Notes[w]*) Replace: var1:2 = null; Starting Simple –Dim Statements (2)
  • 12. For the most part, simple S & R (but order is important): End If to} [ ]*Thento) { Else[ ]+If[ ]*to } else if ( Else [ ]*to } else { If[ ]* to if ( But what about: If (x = 10) Then Use Search: If[ ]+([w()[].<>" ]*)=([w()[].<> "]*)[ ]+Then Use Replace: if (1==2) { - NB: Works but not optimal! Other comparison operators not a problem A bit more complex –If Statements
  • 13. The problem: Session object is global in ssjs: ‘session’ In LS it is created: Dim sessAs New NotesSession Need to find all LS session objects, and replace with session How do you get a list of session object names? ! –session objects You need a coffee!
  • 14. Java String Object has regexsearch and replace String source = “Dim x As String”; String result = source.replaceAll(“Dim[ ]+([w]*)[ ]+As[ ]+String”, “var$1 = “”;”); Pattern and Matcher objects make this even more powerful Pattern p = Pattern.compile(pattern); Matcher m = p.matcher(this.source); intstartPos= 0; while (m.find(startPos)) { if (!itemList.contains(m.group(1))) { itemList.add(m.group(1)); } startPos= m.end() + 1; } Adding Java
  • 15. Similar Issue to Session Need to find all document object names, and replace field handling methods Will probably need to handle dot notation Arrgghh! How do you search for dot notation? <doc name>.([^GetItemValue])([0-9]+) Still hard work! Field Handling
  • 16. There are other types than string! Always review and test converted code thoroughly Date handling is a pain Script libraries can help here –Java? Watch out for User interaction and particularly dialogues Work out your strategies in advance! Search and Replace –Tips and Traps
  • 17. In some respects @Formula -> SSJS is easier than LS -> SSJS @Formula JavaScript Wrappers help a lot Mostly just ‘;’ to ‘,’, and converting lists to arrays Some constructions are obvious: @SetField(“Field”, Value); Goes to: doc.replaceItemValue(“Field”, Value); Or S: @SetField([ ]*([w”]*)[ ]*,[ ]*([w”]*)[ ]*); R: doc.replaceItemValue(1, 2); But there are some issues ... Converting Formula @
  • 18. No direct equivalent in SSJS for *+, *= *>= etc. when applied to Lists Need to plan for this Java Class/Library to provide direct substitute Unfortunately, Java does not permit operator overloading, so has to be a set of methods Converting Formula –List Processing @!
  • 19. @If(@Contains(_WFData_neu;_Key);""; @Do( @Set("_Sachgebiet_Zuordnung";@DbLookup("NOTES":"NOCACHE";"":_ADM$StructureDB;"Workflows";"WFArbeitsanweisung";"Sachgebietzuordnung")); @If(_Sachgebiet_Zuordnung = "" | !@Contains(_Sachgebiet_Zuordnung;_Key2);@Do( @Prompt([Ok];"Hinweis";"In der System Struktur VBM wurde für das aktuelle Sachgebiet kein Workflow definiert. Das Dokument wird zum ehemaligen Kompetenzträger zurückgegeben, damit dieser ein neues Sachgebiet auswählen kann."); @Set("_Kompetenzträger";Bearbeiter1); @Set("_tmpintern";5) ); @Do( @Prompt([Ok];"Hinweis";"In der System Struktur VBM wurde für das aktuelle Sachgebiet ein neues Sachgebiet konfiguriert. Das Dokument wird zum Kompetenzträger zurückgegeben, damit dieser das neue Sachgebiet auswählen kann."); @Set("_neues_Sachgebiet";@Left(@Right(_Sachgebiet_Zuordnung;_key2);"||")); @Set("_Elements";@Elements(@Explode(@Left(@Left(@Right(_WFData_neu;"||Sachgebiet#");"||"); _neues_Sachgebiet) + _neues_Sachgebiet; "$" ))); @Set("_KompetenzträgerData";@Explode(@Left(@Right(_WFData_neu;"||Kompetenzträger#");"||"); "$")); @Set("_Kompetenzträger";@Subset(@Subset(_KompetenzträgerData;_Elements);-1)); @Set("_tmpintern";6) ) ) ) ); Converting Formula -@If, @Do and @While @!!
  • 20. Focusing on @If •@Formula is a FUNCTION language •@If is a function not a statement •In practice: @SetField(“Author”; @If(Status=“1”; Manager; Salesman)); •Needs to convert to: if (Status == “1”) { varauthor = doc.getItemValueString(“Manager”); } else { varauthor = doc.getItemValueString(“Salesman”); } doc.replaceItemValue(“Author”, author); @!!!
  • 21. Search and Replace can be used for @Formula -> SSJS ... ... but it can only take you so far A dedicated tool can go further Only real alternative to manual translation for complex statements Time consuming to create Still not a silver bullet Tools
  • 22. Espresso -http://www.ultrapico.com/Expresso.htm Good for learning regex, and serious regexdev Free! GREP Sophisticated regexfile search Where regex started (UNIX grep)! Third Party Tools
  • 23. OpenNTF–www.openntf.org RegexQuick Reference http://www.night-ray.com/regex.pdf Loads of websites for all aspects of regexdevelopment Mastering Regular Expressions –Jeffrey E.F. Friedl– O’Reilly Publishing Resources and Information