Many end user programming tools such as spreadsheets and databases offer poor support for representing a level of abstraction that is intuitive to users. For example, users must work with "strings" rather than person names, phone numbers, or street addresses. As a result, validating and manipulating data is difficult. This thesis develops a new user-extensible model for semi-structured data items. Each "tope" within this model defines how to recognize a kind of data item based on format and context, and how to transform that kind of item among valid formats. To show the usefulness of this model, we provide an environment to help end-user programmers to create, share, and apply topes, enabling these users to quickly implement data validation and reformatting functionality.