Contributors updated by SRGF editor

Contributors updated by SRGF editor

--- maps/contributors.coffee
+++ maps/contributors.coffee
@@ -3,7 +3,7 @@
     name: 'Zarinah Agnew'
     location: 'San Francisco'
     links: ['[@zarinahagnew](https://twitter.com/zarinahagnew)']
-    bio: 'Zarinah Agnew is a neuroscientist at UCSF using non-invasive neuroimaging and brain stimulation techniques to probe how the brain controls complex voluntary movements. Outside of neuroscience her interests lie in designing new cultural behaviors, encouraging discourse and critical thinking for an improved society. She is heavily involved in public engagement of science, as a speaker and demonstrator as a way to forge links between academia and the public.'
+    bio: 'Zarinah Agnew is a neuroscientist at the University of California, San Francisco, who uses noninvasive neuroimaging and brain stimulation techniques to probe how the brain controls complex voluntary movements. Outside of neuroscience, her interests lie in designing new cultural behaviors and encouraging discourse and critical thinking for an improved society. As a speaker and demonstrator, she is heavily involved in public engagement of science as a way to forge links between academia and the public.'
     azone_username: ''
     azone_reviews: []
     azone_funds: []
@@ -12,7 +12,7 @@
     name: 'Raphaël Bastide'
     location: 'Paris'
     links: ['[raphaelbastide.com](http://www.raphaelbastide.com/)', '[@raphaelbastide](https://twitter.com/raphaelbastide)', '[are.na/raphael-bastide](https://www.are.na/raphael-bastide)']
-    bio: 'Raphaël Bastide is an artist, independent graphic designer and teacher based in Paris. He studied digital art and typography in Brussels where he began to delete the proprietary software from his hard drive. He recently had solo exhibitions in Belgium where he showed _Branch_ and _Diff_, two installations inspired by versioning and revision control systems. He is also involved in several collectives related to free culture, design and typography.'
+    bio: 'Raphaël Bastide is an artist, independent graphic designer, and teacher based in Paris. He studied digital art and typography in Brussels, where he began to delete the proprietary software from his hard drive. He recently had solo exhibitions in Belgium that showed _Branch_ and _Diff_, two installations inspired by versioning and revision control systems. He is also involved in several collectives related to free culture, design and typography.'
     azone_username: ''
     azone_reviews: []
     azone_funds: []
@@ -21,7 +21,7 @@
     name: 'Carson Chan'
     location: 'Princeton'
     links: ['[carsonchan.net](http://www.carsonchan.net/)']
-    bio: 'Carson Chan is an architecture writer and curator, pursuing a PhD in architecture at Princeton University. In 2006, he co-founded PROGRAM in Berlin, a non-profit initiative for art and architecture collaborations. In 2012, he co-curated the 4th Marrakech Biennale, and he was Executive Curator of the Biennial of the Americas in Denver, 2013. He guest curated Aurora Dallas 2015, an outdoor public art biennial. Chan is Contributing Editor at Kaleidoscope, and Editor-at-Large at 032c.'
+    bio: 'Carson Chan is an architecture writer and curator pursuing a Ph.D. in architecture at Princeton University. In 2006 he cofounded PROGRAM in Berlin, a nonprofit initiative for art and architecture collaborations. In 2012 he cocurated the Marrakech Biennial, and he was Executive Curator of the 2013 Biennial of the Americas in Denver. He served as Guest Curator for Aurora Dallas 2015, an outdoor public art biennial. Chan is Contributing Editor at _Kaleidoscope_, and Editor-at-Large at _032c_.'
     azone_username: ''
     azone_reviews: []
     azone_funds: []
@@ -41,7 +41,7 @@
     name: 'Diakron'
     location: 'Copenhagen'
     links: ['[diakron.dk](http://diakron.dk/organisation)', '[@diakron](https://twitter.com/diakron)', '[are.na/david-hilmer-rex](https://www.are.na/david-hilmer-rex)', '[@aslakaamot](https://twitter.com/aslakaamot)', '[are.na/aslak-aamot-kjaerulff](https://www.are.na/aslak-aamot-kjaerulff)', '[@amitairomm](https://twitter.com/amitairomm)', '[are.na/amitai-romm](https://www.are.na/amitai-romm)']
-    bio: 'Diakron is a platform and studio for transdisciplinary research and practice located in Amager, Copenhagen. Diakron is based on explorative research as a core value, currently interested in creative ways of identifying and dealing with changes that invisibly permeate or unavoidably overwhelm ways of life. This work is tied to concerned interests in various pervasive ecological, humanitarian, existential, digital, or economic shifts.'
+    bio: 'Diakron is a platform and studio for transdisciplinary research and practice located in Amager, Copenhagen. Diakron is based on exploratory research as a core value and is currently interested in creative ways of identifying and dealing with changes that invisibly permeate or unavoidably overwhelm ways of life. This work is tied to concerned interests in various pervasive ecological, humanitarian, existential, digital, or economic shifts.'
     azone_username: ''
     azone_reviews: []
     azone_funds: []
@@ -51,7 +51,7 @@
     name: 'Louise Drulhe'
     location: 'Paris'
     links: ['[louisedrulhe.fr](http://louisedrulhe.fr/)', '[@louisedrulhe](https://twitter.com/louisedrulhe)']
-    bio: 'Louise Drulhe is currently working as a graphic designer in Paris. Author of the _Critical Atlas of the Internet_ (originally her thesis project at ENSAD- École des Arts Décoratifs, Paris) using spatial analysis as a tool for political and social purposes.'
+    bio: 'Louise Drulhe is a graphic designer working in Paris. She authored Critical Atlas of the Internet _Critical Atlas of the Internet_ (an adaption of her thesis project at École nationale supérieure des arts décoratifs, Paris)which uses spatial analysis as a tool for political and social purposes.'
     azone_username: ''
     azone_reviews: []
     azone_funds: []
@@ -59,9 +59,9 @@
   ,
   {
     name: 'Keller Easterling'
-    location: 'New York City - New Haven'
+    location: 'New York and New Haven'
     links: ['[kellereasterling.com](http://kellereasterling.com/)', '[extrastatecraft.net](http://extrastatecraft.net/Projects)']
-    bio: 'Keller Easterling is an architect, writer and professor at Yale University. Easterling’s research and writing was included in the 2014 Venice Biennale, and she has been exhibited at Storefront for Art and Architecture in New York, the Rotterdam Biennale, and the Architectural League in New York. Easterling has lectured and published widely in the United States and abroad.'
+    bio: 'Keller Easterling is an architect, writer, and professor at Yale University. Easterling’s research and writing was included in the 2014 Venice Biennale, and her work has been exhibited at the Architectural League, New York; the Rotterdam Biennale; and Storefront for Art and Architecture, New York. Easterling has lectured and published widely in the United States and abroad.'
     azone_username: ''
     azone_reviews: []
     azone_funds: []
@@ -71,7 +71,7 @@
     name: 'FOAM'
     location: 'Mobile'
     links: ['[foam.space](http://foam.space/)', '[@FOAM_dao](https://twitter.com/FOAM_dao)']
-    bio: 'FOAM is a decentralized architecture office (ĐAO) working to apply blockchain technologies to the production of the built environment and office-form. FOAM recently realized a partner installation, The Tropical Mining Station, and symposium, The Art of Economy for the inaugural Chicago Architecture Biennial. The Tropical Mining station is a prototype spatial product that extracts surplus value from the process of cryptocurrency mining to produce space. FOAM was founded in 2015 by Ryan John King, Ekaterina Zavyalova and Nick Axel.'
+    bio: 'FOAM is a decentralized architecture office (ĐAO) working to apply blockchain technologies to the production of the built environment and office form. FOAM recently realized an installation, _Tropical Mining Station_, and symposium, The Art of Economy, for the inaugural Chicago Architecture Biennial (2015). _Tropical Mining Station_ is a prototype spatial product that extracts surplus value from the process of cryptocurrency mining to produce space. FOAM was founded in 2015 by Ryan John King, Ekaterina Zavyalova, and Nick Axel.'
     azone_username: ''
     azone_reviews: []
     azone_funds: []
@@ -81,7 +81,7 @@
     name: 'Patri Friedman'
     location: 'Berkeley'
     links: ['[patrifriedman.com](http://patrifriedman.com/)', '[@patrissimo](https://twitter.com/patrissimo)']
-    bio: 'Patri Friedman, former Google engineer and grandson of Nobel Prize-winning economist Milton Friedman wants to build “start-up countries”: autonomous dwellings in the middle of the ocean. American libertarian activist and theorist of political economy. Friedman founded the nonprofit Seasteading Institute, which explores the creation of sovereign ocean colonies. Later, he co-founded the Future Cities Development Corporation, a project to establish a self-governing charter city within the borders of Honduras.'
+    bio: 'Patri Friedman, former Google engineer and grandson of Nobel Prize–winning economist Milton Friedman, wants to build “start-up countries”: autonomous dwellings in the middle of the ocean. An American libertarian activist and theorist of political economy, Friedman founded the nonprofit Seasteading Institute, which explores the creation of sovereign ocean colonies. He later cofounded the Future Cities Development Corporation, a project to establish a self-governing charter city within the borders of Honduras.'
     azone_username: ''
     azone_reviews: []
     azone_funds: []
@@ -91,7 +91,7 @@
     name: 'Pieterjan Ginckels'
     location: 'Brussels'
     links: ['[pieterjanginckels.be](http://www.pieterjanginckels.be/)']
-    bio: '"Our lives are hyper-real, and we feel the urge to continuously pimp, remix, recollect our own identity," says Pieterjan Ginckels. "As such, I see myself as an embedded outsider, playing with ambivalences in speed and authenticity." The Belgian artist and designer\'s work concerns itself with the acceleration of modern life. With SPEEDISM he proposes anti-methods for an increasingly theme-based, spectacular, and accelerated society.'
+    bio: '“Our lives are hyperreal, and we feel the urge to continuously pimp, remix, recollect our own identity,” says Pieterjan Ginckels. “As such, I see myself as an embedded outsider, playing with ambivalences in speed and authenticity.” The Belgian artist and designer’s work is concerned with the acceleration of modern life. As a member of the collective duo SPEEDISM, he proposes anti-methods for an increasingly theme-based, spectacular, and accelerated society.'
     azone_username: ''
     azone_reviews: []
     azone_funds: []
@@ -101,7 +101,7 @@
     name: 'Vinay Gupta'
     location: 'London'
     links: ['[re.silience.com](http://re.silience.com/)', '[hexayurt.com](http://hexayurt.com/)', '[@leashless](https://twitter.com/leashless)']
-    bio: 'Vinay Gupta works at both the theoretical level, building models and mapping tools like Simple Critical Infrastructure Maps and at the completely practical level, where he is best known as the designer of the hexayurt, an award-winning replacement for the disaster relief tent. Gupta helped start the US National Defense University STAR-TIDES program on humanitarian assistance, consulted on urban resilience for Arup, and am an associate fellow of the UCL Institute.'
+    bio: 'Vinay Gupta works at both the theoretical level, building models and mapping tools such as Simple Critical Infrastructure Maps, and at the completely practical level. He is best known as the designer of the hexayurt, an award-winning replacement for the disaster relief tent. Gupta helped start the U.S. National Defense University STAR-TIDES program on humanitarian assistance, consulted on urban resilience for Arup, and is an Associate Fellow at the University College London’s Institute for Security and Resilience Studies.'
     azone_username: ''
     azone_reviews: []
     azone_funds: []
@@ -109,9 +109,9 @@
   ,
   {
     name: 'Sam Hart'
-    location: 'New York City'
+    location: 'New York'
     links: ['[hxrts.com](http://hxrts.com/)', '[AVANT.org](http://avant.org)', '[@hxrts](https://twitter.com/hxrts)']
-    bio: 'Sam Hart is a scientist, publisher, and artist based in New York. His interests include complex systems modelling and developing strategies that advance a more ethical technoculture. Hart works as a Bioinformatician at Sloan Kettering\'s Reis-Filho Lab, where he investigates mechanisms of cancer evolution. He is also Co-Founder and Editor-in-Chief of AVANT.org, an internet project space for critical interdisciplinarity.'
+    bio: 'Sam Hart is a scientist, publisher, and artist based in New York. His interests include complex systems modeling and developing strategies that advance a more ethical technoculture. Hart works as a Bioinformatician at Memorial Sloan Kettering Cancer Center’s Jorge S. Reis-Filho Lab, where he investigates mechanisms of cancer evolution. He is also Cofounder and Editor-in-Chief of AVANT.org, an Internet project space for critical interdisciplinarity.'
     azone_username: ''
     azone_reviews: []
     azone_funds: []
@@ -121,7 +121,7 @@
     name: 'IF'
     location: 'London'
     links: ['[project-if.com](project-if.com)', '[@sarahtgold](https://twitter.com/sarahtgold)', '[@ihutc](https://twitter.com/ihutc)']
-    bio: 'IF is a new design collective, London-based but working globally, proactively engaged with the evolution of the Internet. We imagine, build and test radical tools that are capable of providing more democratic futures, unlocking the potential of emerging technologies by focusing on real user needs. Through these technologies and their civic frameworks, IF interrogates the issues of governance, ownership and control that sit behind products and services.'
+    bio: 'IF is a design collective, London-based but working globally, that is proactively engaged with the evolution of the Internet. They imagine, build, and test radical tools that are capable of providing more democratic futures, seeking to unlock the potential of emerging technologies by focusing on real user needs. Through these technologies and their civic frameworks, IF interrogates the issues of governance, ownership, and control that sit behind products and services.'
     azone_username: ''
     azone_reviews: []
     azone_funds: []
@@ -131,7 +131,7 @@
     name: 'Zoltan Istvan'
     location: 'Mill Valley'
     links: ['[zoltanistvan.com](http://www.zoltanistvan.com/)', '[@zoltan_istvan](https://twitter.com/zoltan_istvan)']
-    bio: 'Zoltan Istvan is a San Francisco-based futurist, journalist, and author of the novel The Transhumanist Wager. He is also the 2016 US Presidential candidate of the Transhumanist Party, a political organization dedicated to putting science, health, and technology at the forefront of American politics. He is driving the Immortality Bus—a 40-foot vehicle that looks like a giant coffin—across America to raise life extension science issues.'
+    bio: 'Zoltan Istvan is a San Francisco–based futurist and journalist, and the author of the novel _The Transhumanist Wager_. He is also the 2016 U.S. Presidential candidate of the Transhumanist Party, a political organization dedicated to putting science, health, and technology at the forefront of American politics. He is driving the Immortality Bus—a 40-foot vehicle that looks like a giant coffin—across America to raise life extension science issues.'
     azone_username: ''
     azone_reviews: []
     azone_funds: []
@@ -141,7 +141,7 @@
     name: 'Indy Johar'
     location: 'London'
     links: ['[about.me/indy.johar](https://about.me/indy.johar)','[project00.cc](http://www.project00.cc/)', '[@indy_johar](https://twitter.com/indy_johar)']
-    bio: 'Indy Johar is an architect, co-founder of [00](project00.cc) and a Senior Innovation Associate with the Young Foundation. Johar, on behalf of 00, has co-founded multiple social ventures from Impact Hub Westminster to Impact Hub Birmingham and has also co-led research projects such as The Compendium for the Civic Economy. Johar is an Advisor to the Earth Security Initiative and a director of WikiHouse Foundation and Civic Systems Laboratory.'
+    bio: 'Indy Johar is an architect; cofounder of 00, a collaborative group focused on designing outside of traditional borders; and a Senior Innovation Associate with the Young Foundation. Johar, on behalf of 00, has cofounded multiple social ventures from Impact Hub Westminster to Impact Hub Birmingham and has also co-led research projects such as The Compendium for the Civic Economy. Johar is an Advisor to the Earth Security Initiative and a Director of WikiHouse Foundation and Civic Systems Lab.'
     azone_username: ''
     azone_reviews: []
     azone_funds: []
@@ -149,9 +149,9 @@
   ,
   {
     name: 'Marvin Jordan'
-    location: 'New York City'
+    location: 'New York'
     links: ['[dismagazine.com](http://dismagazine.com/author/marvin-jordan/)']
-    bio: 'Marvin Jordan is an editorial assistant at _DIS Magazine_ and Black Market co-founder. Black Market is a program highlighting the practices of mostly under-recognized, young artists of color that "focuses on deconstructing and reinventing current themes central to hip hop—such as finance, determination, and celebration—in the context of contemporary art."–conceived in collaboration with artist James Allister Sprang, who raps under the name GAZR.'
+    bio: 'Marvin Jordan is a _DIS_ Magazine Editorial Assistant and cofounder of Black Market, a program highlighting the practices of mostly under-recognized, young artists of color. Black Market “focuses on deconstructing and reinventing current themes central to hip hop—such as finance, determination, and celebration—in the context of contemporary art.” The project was conceived in collaboration with artist James Allister Sprang, who raps under the name GAZR.'
     azone_username: ''
     azone_reviews: []
     azone_funds: []
@@ -159,9 +159,9 @@
   ,
   {
     name: 'Martti Kalliala'
-    location: 'Berlin - Helsinki'
+    location: 'Berlin and Helsinki'
     links: ['[marttikalliala.com](http://marttikalliala.com/)', '[@marttikalliala](https://twitter.com/marttikalliala)']
-    bio: 'Martti Kalliala is an architect based between Berlin and Helsinki whose work focuses on the intersection of technology, architectural form and social innovation across a variety of media: architectural and urban design, writing, curating, video, software and sound. Alongside his work as an architect he has sustained for the past ten years – under several aliases – an international career in electronic music.'
+    bio: 'Martti Kalliala is an architect based in Berlin and Helsinki whose work focuses on the intersection of technology, architectural form, and social innovation across a variety of mediums and practices: architectural and urban design, writing, curating, video, software, and sound. Alongside his work as an architect, he has sustained an international career in electronic music for the past ten years¬¬ under several aliases.'
     azone_username: ''
     azone_reviews: []
     azone_funds: []
@@ -171,7 +171,7 @@
     name: 'Daniel Keller'
     location: 'Berlin'
     links: [ '[dnlklr.com](dnlklr.com)', '[@dnlklr](https://twitter.com/dnlklr)','[are.na/daniel-keller](https://www.are.na/daniel-keller)']
-    bio: 'Daniel Keller, is an American artist based in Berlin. His wide-ranging output engages with issues at the intersection of economics, technology, culture and collaboration from the perspective of the prosumer imagineer artist operating within global networks. He has exhibited internationally as part of art collective Aids-3d since 2007 and independently since 2012. He was co-organizer of TEDxVaduz in 2012 and Director and CEO of Absolute Vitality Inc., a Wyoming-incorporated sculpture.'
+    bio: 'Daniel Keller is an American artist based in Berlin. His wide-ranging output engages with issues at the intersection of economics, technology, culture, and collaboration from the perspective of the prosumer imagineer artist operating within global networks. He has exhibited internationally as part of art collective Aids-3d (since 2007) and independently (since 2012). He co-organized TEDxVaduz in 2012 and is Director and CEO of Absolute Vitality Inc., a Wyoming–based corporation that functions as a vehicle for his artistic projects.'
     azone_username: ''
     azone_reviews: []
     azone_funds: []
@@ -181,7 +181,7 @@
     name: 'Nora N. Khan'
     location: 'Boston'
     links: ['[noranahidkhan.com](http://noranahidkhan.com/)', '[@noranahidkhan](https://twitter.com/noranahidkhan)']
-    bio: 'Nora N. Khan explores issues in technology, literature, games and electronic music through fiction, essays and reviews. A contributing editor at _Rhizome_, she writes regularly for _Rhizome_ and _Kill Screen_, and has recent work in _Conjunctions_, _DIS_, _After Us_, _AVANT_, and _American Literary Review_. She studied literature, history and theory at Harvard and fiction writing at the Iowa Writers\' Workshop.'
+    bio: 'Nora N. Khan explores issues in technology, literature, games, and electronic music through fiction, essays, and reviews. A contributing editor at _Rhizome_, she writes regularly for _Kill Screen_ and has published recent work in _Conjunctions_, _DIS_, _After Us_, _AVANT.org_, and _American Literary Review_. She studied literature, history, and theory at Harvard University and fiction writing at the Iowa Writers’ Workshop.'
     azone_username: ''
     azone_reviews: []
     azone_funds: []
@@ -191,7 +191,7 @@
     name: 'Nick Land'
     location: 'Shanghai'
     links: ['[ufblog.net](http://www.ufblog.net/)', '[@UF_blog](https://twitter.com/uf_blog)']
-    bio: 'Nick Land is an English philosopher and writer. The most recent of his writings can be found in various issues of _Collapse_, an independent UK-based journal for philosophical research and development, and _#Accelerate: The Accelerationist Reader_. Land is founder of two electronic presses, Urbanatomy Electronic and Time Spiral Press (with Anna Greenspan). He currently works as a freelance writer and editor, and teaches at the New Centre for Research & Practice.'
+    bio: 'Nick Land is an English philosopher and writer. The most recent of his writings can be found in various issues of _Collapse_, an independent UK-based journal for philosophical research and development, and _#Accelerate: The Accelerationist Reader_. Land is the founder of two electronic presses, Urbanatomy Electronic and Time Spiral Press (with Anna Greenspan). He currently works as a freelance writer and editor and teaches at the New Centre for Research & Practice.'
     azone_username: ''
     azone_reviews: []
     azone_funds: []
@@ -211,7 +211,7 @@
     name: 'Marina Otero Verzier'
     location: 'Rotterdam'
     links: ['[@marina_ov](https://twitter.com/marina_ov)']
-    bio: 'Marina Otero Verzier is an architect based in Rotterdam. She is Head of Research at Het Nieuwe Instituut, and Chief Curator of the Oslo Architecture Triennale 2016 together with After Belonging Agency. Previously, she was Director of Global Network Programming at Studio-X, and Adjunct Assistant Professor at Columbia University GSAPP. Her work, has been published in different publications including _sqm: The quantified Home_, _Arquitectura Viva_, _The Avery Review_, and _Domus_.'
+    bio: 'Marina Otero Verzier is an architect based in Rotterdam. She is Head of Research at Het Nieuwe Instituut and Chief Curator of the Oslo Architecture Triennale 2016 together with After Belonging Agency. Previously, she was Director of Global Network Programming at Studio-X and Adjunct Assistant Professor at Columbia University’s Graduate School of Architecture, Planning and Preservation. Her work has been published in _Arquitectura Viva_, _The Avery Review_, _Domus_, and _SQM: The Quantified Home_.'
     azone_username: ''
     azone_reviews: []
     azone_funds: []
@@ -221,7 +221,7 @@
     name: 'Nick Pinkston'
     location: 'San Francisco'
     links: ['[plethora.com/](https://www.plethora.com/)', '[@nickpinkston](https://twitter.com/nickpinkston)']
-    bio: 'Nick Pinkston is the founder of Plethora - a rapid manufacturing service that lets you go from CAD to parts faster than ever before using a flexible manufacturing system. Previously, Pinkston started CloudFab: the world\'s first manufacturing-as-a-service API, and also HackPittsburgh: a collective workshop for the makers of Pittsburgh. Pinkston\'s mission is to democratize the means of production, making developing hardware as easy software.'
+    bio: 'Nick Pinkston is the founder of Plethora, a rapid-manufacturing service that allows inventors and engineers to go from computer-aided design (CAD) software designs to physical parts faster than ever before by using a flexible manufacturing system. Previously, Pinkston started CloudFab, the world’s first manufacturing-as-a-service API and HackPittsburgh, a collective workshop for the makers of Pittsburgh. Pinkston’s mission is to democratize the means of production, making developing hardware as easy as developing software.'
     azone_username: ''
     azone_reviews: []
     azone_funds: []
@@ -231,7 +231,7 @@
     name: 'Sascha Pohflepp'
     location: 'Berlin'
     links: ['[pohflepp.net](http://pohflepp.net/)', '[@plugimi](https://twitter.com/plugimi)']
-    bio: 'Sascha Pohflepp is a German-born artist, researcher and writer. Notable exhibitions include Talk To Me at MoMA New York, _Hyperlinks_ at the Art Institute of Chicago, _ Micro Impact_ at Boijmans Van Beuningen Museum Rotterdam, _Pre-History of the Image_ at STUK Kunstencentrum Leuven, and _Science Fiction: New Death_ at FACT Liverpool. Pohflepp’s work has won two Honorary Mentions from the VIDA Art and Artificial Life Awards and in June 2015 was shortlisted for the Berlin Art Prize.'
+    bio: 'Sascha Pohflepp is a German–born artist, researcher, and writer. Notable exhibitions include _Talk To Me_, Museum of Modern Art, New York; _Hyperlinks_, Art Institute of Chicago; _Micro Impact_, Boijmans Van Beuningen Museum, Rotterdam; _Pre-History of the Image_, STUK Kunstencentrum, Leuven, Belgium; and _Science Fiction: New Death_, FACT, Liverpool. Pohflepp’s work has won two Honorary Mentions from the VIDA Art and Artificial Life Awards, and in June 2015 he was shortlisted for the Berlin Art Prize.'
     azone_username: ''
     azone_reviews: []
     azone_funds: []
@@ -241,7 +241,7 @@
     name: 'PWR Studio'
     location: 'Berlin'
     links: ['[pwr.site](http://pwr.site)', '[@pwr_studio](https://twitter.com/pwr_studio)']
-    bio: 'PWR is a studio for research, design and development. We are occupied with practical investigations into the Cloud and the Dirt. Current themes include trustlessness, home-mining and the wheezing metabolism of Capital.'
+    bio: 'PWR is a studio for research, design, and development. They are occupied with practical investigations into the Cloud and the Dirt. Current themes include trustlessness, home-mining, and the wheezing metabolism of Capital.'
     azone_username: ''
     azone_reviews: []
     azone_funds: []
@@ -251,7 +251,7 @@
     name: 'Venkatesh Rao'
     location: 'Seattle'
     links: ['[ribbonfarm.com](http://www.ribbonfarm.com/)', '[@vgr](https://twitter.com/vgr)']
-    bio: 'Venkatesh Rao is a Seattle-based independent researcher and technology consultant. He is the founder of the popular ribbonfarm blog, and the author of 3 books on decision-making and organizational behavior. He earned his PhD in aerospace engineering, in systems and control theory, from the University of Michigan in 2003.'
+    bio: 'Venkatesh Rao is a Seattle–based independent researcher and technology consultant. He is the founder of the popular _ribbonfarm_ blog, and the author of three books on decision-making and organizational behavior. He earned his Ph.D. in aerospace engineering with a focus on systems and control theory from the University of Michigan in 2003.'
     azone_username: ''
     azone_reviews: []
     azone_funds: []
@@ -259,9 +259,9 @@
   ,
   {
     name: 'Carson Salter'
-    location: 'New York City'
+    location: 'New York'
     links: ['[carsonsalter.com](http://carsonsalter.com/)', '[@carsonsalter](https://twitter.com/carsonsalter)', '[are.na/carson-salter](https://www.are.na/carson-salter)']
-    bio: 'Carson Salter is an American artist and strategist based in New York. Early work dealt with alternative models of publishing and education in contemporary art. In 2013, Salter earned a Master\'s Degree in Art, Culture, and Technology at MIT, and has since focused on knowledge-based artist enterprises. Salter currently works as a Strategist for a creative agency specializing in brand-driven collaborations.'
+    bio: 'Carson Salter is an American artist and strategist based in New York. His early work dealt with alternative models of publishing and education in contemporary art. In 2013 Salter earned a master’s degree in art, culture, and technology at MIT and has since focused on knowledge-based artist enterprises. Salter currently works as a Strategist for a creative agency specializing in brand-driven collaborations.'
     azone_username: ''
     azone_reviews: []
     azone_funds: []
@@ -271,7 +271,7 @@
     name: 'Jessy Kate Schingler'
     location: 'San Francisco'
     links: ['[embassynetwork.com](https://embassynetwork.com/)', '[@jessykate](https://twitter.com/jessykate)']
-    bio: 'Jessy Kate Schingler is a space geek turned computer scientist designing human settlements on a planet called Earth. She is a founding member of _Embassy Network_, a collective of people and places using physical place and the built environment to experiment with new modes of human organizing, and push the boundaries of how we live.'
+    bio: 'Jessy Kate Schingler is a space geek turned computer scientist who designs human settlements on a planet called Earth. She is a founding member of Embassy Network, a collective of people and places using physical place and the built environment to experiment with new modes of human organizing and push the boundaries of how we live.'
     azone_username: ''
     azone_reviews: []
     azone_funds: []
@@ -279,9 +279,9 @@
   ,
   {
     name: 'Emily Segal'
-    location: 'New York City'
+    location: 'New York'
     links: ['[khole.net](http://khole.net/)', '[emilysegal.net](http://emilysegal.net/)', '[@khole_emily](https://twitter.com/khole_emily)', '[are.na/emily-segal](https://www.are.na/emily-segal)']
-    bio: 'Emily Segal is an artist and brand consultant based in in New York. She co-founded K-HOLE, the trend forecasting group and art collective. Previously, she was a strategist for corporate branding projects at Wolff Olins and a contributing editor at the contemporary culture magazine 032c in Berlin. She has lectured on branding and consumer culture at the DLD conference, MoMA PS1, Serpentine Gallery, and TEDxVaduz, among others.'
+    bio: 'Emily Segal is an artist and brand consultant based in in New York. She co-founded K-HOLE, the trend forecasting group and art collective. Previously, she was a strategist for corporate branding projects at Wolff Olins and a contributing editor at the contemporary culture magazine _032c_ in Berlin. She has lectured on branding and consumer culture at the DLD conference, MoMA PS1, Serpentine Gallery, and TEDxVaduz, among others.'
     azone_username: ''
     azone_reviews: []
     azone_funds: []
@@ -291,7 +291,7 @@
     name: 'Jack Self'
     location: 'London'
     links: ['[jackself.com](http://www.jackself.com/)', '[@jack_self](https://twitter.com/jack_self)']
-    bio: 'Jack Self is an architect and writer based in London. He is Director of the REAL Foundation, Contributing Editor for the _Architectural Review_ and author of_Real Estates: Life Without Debt_. He has worked for the _Architectural Review_ in a number of capacities since 2009, and was previously Associate Editor at Strelka Press. His writing has appeared in _Architectural Design_, the _Guardian_, _Blueprint_ and _Dezeen_, as well as elsewhere.'
+    bio: 'Jack Self is an architect and writer based in London. He is Director of the REAL Foundation, Contributing Editor for the _Architectural Review_, and author of _Real Estates: Life Without Debt_. He has worked for the _Architectural Review_ in a number of capacities since 2009 and was previously Associate Editor at Strelka Press. His writing has appeared in _Architectural Design_, the _Guardian_, _Blueprint_, and _Dezeen_, among other publications.'
     azone_username: ''
     azone_reviews: []
     azone_funds: []
@@ -301,7 +301,7 @@
     name: 'Benedict Singleton'
     location: 'London'
     links: ['[benedictsingleton.com](http://www.benedictsingleton.com/)', '[@benedict](https://twitter.com/benedict)', '[are.na/benedict-singleton](https://www.are.na/benedict-singleton--2)']
-    bio: 'Benedict Singleton is a designer based in London. His work, both self-directed and commercial, uses design, film and writing to address contemporary questions of strategy and narrative. He is the author of the forthcoming book _The Long Con_, and runs a graduate architecture studio at the Royal College of Art. He also speaks on his work widely, most recently at Tate Britain, Brighton Lighthouse, and the HKW in Berlin.'
+    bio: 'Benedict Singleton is a designer based in London. His work, both self-directed and commercial, uses design, film, and writing to address contemporary questions of strategy and narrative. He authored the forthcoming book _The Long Con_ and runs a graduate architecture studio at the Royal College of Art. He also speaks on his work widely, most recently at Tate Britain, Brighton Lighthouse, and Haus der Kulturen der Welt, Berlin.'
     azone_username: ''
     azone_reviews: []
     azone_funds: []
@@ -311,7 +311,7 @@
     name: 'Nick Srnicek'
     location: 'London'
     links: ['[@n_srnck](https://twitter.com/n_srnck)']
-    bio: 'Nick Srnicek is the author of _Postcapitalist Technologies_ (Polity, 2016) and _Inventing the Future: Postcapitalism_ and a _World Without Work_ (Verso, 2015 with Alex Williams), and editor of _The Speculative Turn_ (Re.press, 2011 with Levi Bryant and Graham Harman).'
+    bio: 'Nick Srnicek is the author of two forthcoming works, _Postcapitalist Technologies and Inventing the Future: Postcapitalism_ and a _World Without Work_ with Alex Williams, both of which investigate the possibilities of life after capitalism and neoliberalism. He is also an editor of _The Speculative Turn: Continental Materialism and Realism_ (2011), an anthology that explores continental philosophy.'
     azone_username: ''
     azone_reviews: []
     azone_funds: []
@@ -319,9 +319,9 @@
   ,
   {
     name: 'Jenna Sutela'
-    location: 'Helsinki - Berlin'
+    location: 'Helsinki and Berlin'
     links: ['[jennasutela.com](http://jennasutela.com/)', '[@jennaemilia](https://twitter.com/jennaemilia)', '[are.na/jenna-sutela](https://www.are.na/jenna-sutela)']
-    bio: "Jenna Sutela is an artist and writer based between Helsinki and Berlin. Her projects seek to identify and react to precarious social and material moments—most recently, the relationship between the body and its technologically-mediated environment. She is a contributor to several international publications, such as _Frieze_ and _Harvard Design Magazine_, and her work has been presented at, for example, Haus der Kulturen der Welt, Museum of Contemporary Art Kiasma and South London Gallery."
+    bio: "Jenna Sutela is an artist and writer based in Helsinki and Berlin. Her projects seek to identify and react to precarious social and material moments—most recently, the relationship between the body and its technologically mediated environment. She is a contributor to several international publications such as _Frieze_ and _Harvard Design Magazine_, and her work has been presented at Haus der Kulturen der Welt, Berlin; Museum of Contemporary Art Kiasma, Helsinki; and the South London Gallery."
     azone_username: ''
     azone_reviews: []
     azone_funds: []
@@ -329,9 +329,9 @@
   ,
   {
     name: 'Morgan Sutherland'
-    location: 'New York City'
+    location: 'New York'
     links: ['[morgansutherland.com](http://morgansutherland.com/)', '[@msutherl](https://twitter.com/msutherl)', '[are.na/morgan-sutherland](https://www.are.na/morgan-sutherland)']
-    bio: 'Morgan Sutherland works between the art and tech worlds as consultant, researcher, designer, and developer. Currently he works with Diakron and OS Fund. Previously he was artist-in-residence at Intel Labs, UX designer at Octopart, and research assistant developing responsive environments with the Topological Media Lab.'
+    bio: 'Morgan Suther¬land works between the art and tech worlds as consul¬tant, researcher, designer, and devel¬oper. Currently he works with Diakron, and OS Fund. Previ¬ously he was an Artist-in-Residence at Intel Labs, a UX Designer at Octopart, and a Research Assis¬tant devel¬op¬ing respon¬sive environ¬ments with the Topological Media Lab.'
     azone_username: ''
     azone_reviews: []
     azone_funds: []
@@ -341,7 +341,7 @@
     name: 'Ben Vickers'
     location: 'Nomadic'
     links: ['[benvickers.net](http://www.benvickers.net/)', '[@benvickers_](https://twitter.com/benvickers_)']
-    bio: 'Ben Vickers is a curator, writer, explorer, technologist and luddite. Currently Curator of Digital at the Serpentine Galleries, is Co-Director of LIMAZULU Project Space, Co-Chair of Transmediale 2016, a Near Now Fellow and facilitator for the open-source development of unMonastery, a new civically minded social space prototyped in Matera, Southern Italy during 2014 and now set to replicate throughout Europe and further afield in 2015/16.'
+    bio: 'Ben Vickers is a curator, writer, explorer, technologist, and Luddite. Currently Curator of Digital at the Serpentine Galleries, he is also Codirector of LIMAZULU Project Space, Cochair of Transmediale 2016, a Near Now Fellow, and Facilitator for the open-source development of unMonastery, a new civic-minded social space. This space was prototyped in Matera, southern Italy, in 2014 and is now set to replicate throughout Europe and further afield in 2015–16.'
     azone_username: ''
     azone_reviews: []
     azone_funds: []
@@ -349,9 +349,9 @@
   ,
   {
     name: 'McKenzie Wark'
-    location: 'New York City'
+    location: 'New York'
     links: ['[publicseminar.org](http://www.publicseminar.org/author/kenwark/)', '[@mckenziewark](https://twitter.com/mckenziewark)']
-    bio: 'Mckenzie Wark is an Australian-born writer and scholar. Wark is known for his writings on media theory, critical theory, new media, and the Situationist International. His best known works are _A Hacker Manifesto_ and _Gamer Theory_. He is professor of culture and media at the New School for Social Research and Eugene Lang College, in New York City.'
+    bio: 'McKenzie Wark is an Australian–born writer and scholar. Wark is known for his writings on media theory, critical theory, new media, and the Situationist International organization. His best-known works are _A Hacker Manifesto_ (2004) and _Gamer Theory_ (2007). He is Professor of Culture and Media Studies, Eugene Lang College of Liberal Arts, The New School for Social Research.'
     azone_username: ''
     azone_reviews: []
     azone_funds: []
@@ -361,7 +361,7 @@
     name: 'Molly Wright Steenson'
     location: 'Pittsburgh'
     links: ['[girlwonder.com](http://www.girlwonder.com/)', '[@maximolly](https://twitter.com/maximolly)']
-    bio: 'Molly Wright Steenson is an associate professor in the School of Design at Carnegie Mellon University. She researches the history of design, architecture, computation and artificial intelligence, and is completing a book titled _Architecting Interactivity_ that explores these linkages, with a focus on the practices of Nicholas Negroponte, Cedric Price, Christopher Alexander, and Richard Saul Wurman.'
+    bio: 'Molly Wright Steenson is an Associate Professor in the School of Design at Carnegie Mellon University. She researches the history of design, architecture, computation, and artificial intelligence and is completing a book titled _Architecting Interactivity_ that explores these linkages with a focus on the practices of Nicholas Negroponte, Cedric Price, Christopher Alexander, and Richard Saul Wurman.'
     azone_username: ''
     azone_reviews: []
     azone_funds: []
@@ -369,9 +369,9 @@
   ,
   {
     name: 'Damon Zucconi'
-    location: 'New York City'
+    location: 'New York'
     links: ['[damonzucconi.com](http://www.damonzucconi.com/)', '[@dzucconi](https://twitter.com/dzucconi)', '[are.na/damon-zucconi](https://www.are.na/damon-zucconi)']
-    bio: 'Damon Zucconi (b.1985, Bethpage, NY) is an artist who lives and works in Providence, RI. He has presented solo exhibitions with JTT in New York and Gentili Apri in Italy. Most recently he has been included in group exhibitions at Institute of Contemporary Art, Miami and Het Nieuwe Instituut, Rotterdam.'
+    bio: 'Damon Zucconi is an artist who lives and works in Providence, Rhode Island. He has presented solo exhibitions with JTT, New York, and Gentili Apri, Italy. Most recently his work has been included in group exhibitions at the Institute of Contemporary Art, Miami, and Het Nieuwe Instituut, Rotterdam.'
     azone_username: ''
     azone_reviews: []
     azone_funds: []


add step footer class to step footer

add step footer class to step footer

--- src/components/task-step/step-footer.cjsx
+++ src/components/task-step/step-footer.cjsx
@@ -22,7 +22,7 @@
   render: ->
     {pinned, courseId, id, taskId, review} = @props

-

+

       {@renderFooter({stepId: id, taskId, courseId, review})}


Fixes #64

Fixes #64

--- lib/views/select-core-view.coffee
+++ lib/views/select-core-view.coffee
@@ -48,6 +48,17 @@

     @listDevicesPromise = spark.listDevices()
     @listDevicesPromise.done (e) =>
+      e.sort (a, b) =>
+        if !a.name
+          a.name = ''
+        if !b.name
+          b.name = ''
+        order = (b.connected - a.connected) * 1000
+        if a.name.toLowerCase() < b.name.toLowerCase()
+          order -= 1
+        else if a.name.toLowerCase() > b.name.toLowerCase()
+          order += 1
+        order
       @setItems e
       @listDevicesPromise = null
     , (e) =>


provides mocha args to mocha

provides mocha args to mocha

--- lib/mycha.coffee
+++ lib/mycha.coffee
@@ -28,7 +28,7 @@
     ]

-  constructor: (user_options={}) ->
+  constructor: (currentDir, user_options={}) ->

     # The options to use by this instance.
     @options = @_calculate_final_options user_options
@@ -56,7 +56,7 @@

   run: (callback) ->
     childProcess = child.spawn "#{__dirname}/../node_modules/mocha/bin/mocha",
-                               @options
+                               @options.mochaArgs
     childProcess.stdout.pipe @options.stdout
     childProcess.stderr.pipe @options.stderr
     childProcess.on 'exit', callback if callback


Mycha receives structured data

Mycha receives structured data

--- lib/mycha.coffee
+++ lib/mycha.coffee
@@ -33,33 +33,49 @@

   # parameters:
   # - argv: argument values provided by Optimist.
-  constructor: (argv) ->
+  constructor: (@project_directory) ->

-    # The options to configure this Mycha instance.
-    @mycha_configuration = new MychaConfiguration Mycha.default_mycha_options,
-                                                  argv
-
-    # The options to provide to Mocha.
-    @mocha_configuration = new MochaConfiguration Mycha.default_mocha_options,
-                                                  argv
-
-    # The JS/CS files to provide to Mocha.
-    @file_configuration = new FileConfiguration
-      test_dir: @mycha_configuration.options.testDir
-      default_files: Mycha.default_files
-      argv: argv
+    # TODO: read the config file here

   get_mocha_args: ->
     @mocha_configuration.to_args().concat @file_configuration.to_args()

-  run: (callback) ->
+  run: (run_options, files, done) ->
+
+    # The options to configure this Mycha instance.
+    @mycha_configuration = new MychaConfiguration
+      run_options: run_options
+      default_mycha_options: Mycha.default_mycha_options
+      files: files
+
+    # The options to provide to Mocha.
+    @mocha_configuration = new MochaConfiguration
+      run_options: run_options
+      default_mocha_options: Mycha.default_mocha_options,
+      files: files
+
+    # The JS/CS files to provide to Mocha.
+    @file_configuration = new FileConfiguration
+      test_dir: "#{process.cwd()}/#{@mycha_configuration.options.testDir}"
+      default_files: Mycha.default_files
+      files: files
+
+    @call_mocha @get_mocha_args(),
+                done
+
+
+  #
+  watch: (run_options, files) ->
+
+
+  call_mocha: (mocha_args, done) ->
     childProcess = child.spawn path.resolve(__dirname, '../node_modules/mocha/bin/mocha'),
-                               @get_mocha_args()
+                               mocha_args
     childProcess.stdout.pipe @mycha_configuration.options.stdout
     childProcess.stderr.pipe @mycha_configuration.options.stderr
-    childProcess.on 'exit', callback if callback
+    childProcess.on 'exit', done if done


Fix an issue that non-markdown preview is not updated

--- lib/broadcast-target.coffee
+++ lib/broadcast-target.coffee
@@ -9,8 +9,12 @@

     @isMarkdownPreview = @editor[0]?

-    @editor.on 'markdown-preview:markdown-changed', =>
-      @listener?()
+    if @isMarkdownPreview
+      @editor.on 'markdown-preview:markdown-changed', =>
+        @listener?()
+    else
+      @editor.getBuffer().on 'contents-modified', =>
+        @listener?()

   setListener: (listener) ->
     @listener = listener


[Email Confirmation] changed thin arrow to noop

--- client/landing/app/Applications/Account.kdapplication/AppController.coffee
+++ client/landing/app/Applications/Account.kdapplication/AppController.coffee
@@ -164,7 +164,7 @@
   indexOfItem:(item)->
     @itemsOrdered.indexOf item

-  displayConfirmEmailModal:(name, username, callback=->)->
+  displayConfirmEmailModal:(name, username, callback=noop)->
     name or= KD.whoami().profile.firstName
     message =
       """


Make API work with citysdk data

Make API work with citysdk data

--- meteor/server/api.coffee
+++ meteor/server/api.coffee
@@ -13,13 +13,17 @@

 RESTstop.add 'citysdk', ->
   node = @request.body
-  tiploc = node.tiploc
+  # XXX: the JSON data comes in as the only key for an empty string. So we need
+  # to extract it and parse it as JSON.
+  node = JSON.parse(_.keys(node)[0])
+  tiploc = node.tiploc_code
   unless tiploc?
     return [403,
       message: 'You need to provide a tiploc'
     ]
   schedules = getTodaysScheduleForTiploc(tiploc)
   result = getArrivalAndDepartureTimes(tiploc, schedules)
-  node.data = result
+  node.data =
+    times: result
   return node


Missed method rename

Missed method rename

--- resources/assets/coffee/_classes/beatmap-discussions-chart.coffee
+++ resources/assets/coffee/_classes/beatmap-discussions-chart.coffee
@@ -137,7 +137,7 @@

     @svgPoints
       .attr 'xlink:href', (d) =>
-        BeatmapDiscussionHelper.hash discussionId: d.id
+        BeatmapDiscussionHelper.url discussionId: d.id
       .attr 'class', (d) ->
         type = if d.resolved then 'resolved' else _.kebabCase(d.message_type)
         "js-beatmap-discussion--jump #{bn}__point #{bn}__point--#{type}"


Fixed Jasmine test.

Fixed Jasmine test.

--- core/spec/javascripts/backbone/views/auto_complete/search_view_spec.coffee
+++ core/spec/javascripts/backbone/views/auto_complete/search_view_spec.coffee
@@ -31,6 +31,7 @@
         collection: collection

       spyOn(window, 'AutoCompleteSearchListView').andReturn({})
+      spyOn(view, 'bindTextViewToSteppableViewAndSelf')

       view.initializeChildViews(
         search_collection: -> new SearchCollection


Fix typo

Fix typo

--- sources/tuktuk.modal.coffee
+++ sources/tuktuk.modal.coffee
@@ -64,14 +64,13 @@
     accept_button = modal.find "button.success"
     cancel_button = modal.find "button.alert"

-    accept_button = modal.unbind "click.Modal.prompt"
-    cancel_button = modal.unbind "click.Modal.prompt"
+    accept_button.unbind "click.Modal.prompt"
+    cancel_button.unbind "click.Modal.prompt"

     text.html message
-    accept_button.on "click.Modal.prompt", ->
-      content = content.val()
-      hide()
-      accept_button.unbind "click.Modal.prompt"
+    accept_button.on "click.Modal.prompt", ->
+      content = content.val()
+      hide()
       if callback then setTimeout ->
         callback(content)
       , 250


wrapper for no QuoJS library (compatible with jquery, zepto...)

--- source/class/atom.coffee
+++ source/class/atom.coffee
@@ -7,6 +7,12 @@
 @author Javier Jimenez Villar <javi@tapquo.com> || @soyjavi
 ###
 "use strict"
+
+EVENTS_DESKTOP =
+  touch             : "click"
+  singleTap         : "click"
+  tap               : "click"
+  doubleTap         : "dblClick"

 class Atoms.Class.Atom extends Atoms.Core.Module

@@ -45,5 +51,6 @@
   bindEvents: ->
     if @attributes.events
       for event in @attributes.events
-        @el.on event, do (event) => (handler) =>
+        event_desktop = EVENTS_DESKTOP[event] unless $$?
+        @el.on event_desktop or event, do (event) => (handler) =>
           unless @el[0].disabled is true then @bubble event, handler


removing blank lines

removing blank lines

--- examples/basic/src/app.coffee
+++ examples/basic/src/app.coffee
@@ -30,6 +30,4 @@
 		new repeating.B

-new App
-
-
+new App


add missing module

add missing module

--- app/templates/gulp/tasks/minify.coffee
+++ app/templates/gulp/tasks/minify.coffee
@@ -1,5 +1,6 @@
 gulp         = require "gulp"
 cssnano      = require "gulp-cssnano"
+exec         = require "gulp-exec"
 imagemin     = require 'gulp-imagemin'
 pngquant     = require 'imagemin-pngquant'
 rename       = require "gulp-rename"


Add spec for clearing opened session from undo stack

--- spec/app/editor-spec.coffee
+++ spec/app/editor-spec.coffee
@@ -253,6 +253,14 @@

       editor.insertText("def\n")
       expect(editor.lineElementForScreenRow(0).text()).toBe 'def'
+
+    it "removes the opened session from the closed sessions array", ->
+      editor.edit(rootView.project.buildEditSessionForPath('sample.txt'))
+      expect(editor.closedEditSessions.length).toBe 0
+      editor.trigger "core:close"
+      expect(editor.closedEditSessions.length).toBe 1
+      editor.edit(rootView.project.buildEditSessionForPath('sample.txt'))
+      expect(editor.closedEditSessions.length).toBe 0

   describe "switching edit sessions", ->
     [session0, session1, session2] = []


Fix failing unit test

Fix failing unit test

--- services/web/test/UnitTests/coffee/Email/EmailBuilderTests.coffee
+++ services/web/test/UnitTests/coffee/Email/EmailBuilderTests.coffee
@@ -13,7 +13,7 @@

 	beforeEach ->

-		@settings = {}
+		@settings = appName: "testApp"
 		@EmailBuilder = SandboxedModule.require modulePath, requires:
 			"settings-sharelatex":@settings
 			"logger-sharelatex": log:->


Update argv descriptions.

Update argv descriptions.

--- lib/docxconv/command.coffee
+++ lib/docxconv/command.coffee
@@ -3,17 +3,17 @@
 path = require 'path'

 argv = require('optimist')
-  .usage('Usage: $0 [-foc] <file>|<glob> ...')
+  .usage('Usage: docxconv [-fq] -o <path> <file>|<path> [--watch]')
   .alias('f', 'format')
   .default('f', 'html')
   .describe('f', 'conversion format')
   .alias('o', 'output')
   .demand('o')
-  .describe('o', 'output destination')
+  .describe('o', 'output destination <path>')
   .alias('q', 'workers')
-  .describe('q', 'queue worker concurrency')
+  .describe('q', 'queue worker concurrency <int>')
   .default('q', 4)
-  .describe('watch', 'directory to watch for added files')
+  .describe('watch', 'watch for new documents')
   .argv

 msg = require './msg'


Show error msg of proxy

Show error msg of proxy

--- lib/proxy.coffee
+++ lib/proxy.coffee
@@ -239,6 +239,8 @@
       remote.on 'timeout', ->
         client.destroy()
         remote.destroy()
+    @server.on 'error', (err) ->
+      error err
     listenPort = config.get 'poi.port', 12450
     @server.listen listenPort, ->
       log "Proxy listening on #{listenPort}"


Sqrt stretch now offset by min to avoid sqrt of negative numbers

--- fits/web_gl.coffee
+++ fits/web_gl.coffee
@@ -55,7 +55,7 @@

             "float min = logarithm(u_extremes[0]);",
             "float max = logarithm(u_extremes[1]);",
-            "float pixel = logarithm(pixel_v[0]);",
+              "float pixel = logarithm(pixel_v[0]);",

             "pixel = (pixel - min) / (max - min);",

@@ -72,10 +72,13 @@

         "void main() {",
           "vec4 pixel_v = texture2D(u_tex, v_textureCoord);",
-
-          "float min = sqrt(u_extremes[0]);",
-          "float max = sqrt(u_extremes[1]);",
-          "float pixel = (sqrt(pixel_v[0]) - min) / (max - min);",
+
+          # Shift value by min to avoid negative numbers
+          "float min = u_extremes[0];",
+          "float max = u_extremes[1] - min;",
+          "float pixel = pixel_v[0] - min;",
+
+          "pixel = sqrt(pixel_v[0] / max);",

           "gl_FragColor = vec4(pixel, pixel, pixel, 1.0);",
         "}"


Refactor embedded string variable tests.

--- spec/powershell-spec.coffee
+++ spec/powershell-spec.coffee
@@ -72,20 +72,26 @@
       it "should tag the closing double-quote as empty string", ->
         expect(tokens[1]).toEqual value: "\"", scopes: ["source.powershell", "string.quoted.double.single-line.powershell", "punctuation.definition.string.end.powershell", "meta.empty-string.double.powershell"]

-    describe "Highlight Powershell variables within the string", ->
+    describe "Highlight Powershell variables within a string", ->
       tokens = null

       beforeEach ->
         {tokens} = grammar.tokenizeLine("\"Hi there $name\"")

       it "should tag content", ->
-        expect(tokens[1]).toEqual value: "Hi there ", scopes: ["source.powershell", "string.quoted.double.single-line.powershell"]
+        expect(tokens[1].value).toEqual "Hi there "
+        expect(tokens[1]).toHaveScope "string.quoted.double.single-line.powershell"

       it "should tag the beginning of variable names", ->
-        expect(tokens[2]).toEqual value: "$", scopes: ["source.powershell", "string.quoted.double.single-line.powershell", "embedded.variable.other.powershell", "embedded.punctuation.variable.begin.powershell"]
+        expect(tokens[2].value).toEqual "$"
+        expect(tokens[2]).toHaveScope "string.quoted.double.single-line.powershell"
+        expect(tokens[2]).toHaveScope "embedded.variable.other.powershell"
+        expect(tokens[2]).toHaveScope "embedded.punctuation.variable.begin.powershell"

       it "should tag variable names", ->
-        expect(tokens[3]).toEqual value: "name", scopes: ["source.powershell", "string.quoted.double.single-line.powershell", "embedded.variable.other.powershell"]
+        expect(tokens[3].value).toEqual "name"
+        expect(tokens[3]).toHaveScope "string.quoted.double.single-line.powershell"
+        expect(tokens[3]).toHaveScope "embedded.variable.other.powershell"

   describe "Highlighting keywords", ->
     describe "Flow keywords", ->


Improving schema description for errors.

--- lib/documents/errors.coffee
+++ lib/documents/errors.coffee
@@ -2,8 +2,9 @@

 class @LoggedError extends Document
   # errorMsg: the error message
-  # url: url that error ocurred on
-  # lineNumber: line number in the code where error occured on
+  # url: url that error ocurred on (can be also just a string "eval" or "anonymous" or even null)
+  # lineNumber: line number in the code where error occured on (can be null as well)
+  # stack: optional stack when logging an error ourselves
   # location: document location (URL) as seen by JavaScript at the moment of the error
   # userAgent: browser information string
   # language: language set in the browser (not language from HTTP headers)


fix editVesselModal closing

fix editVesselModal closing

--- imports/ui/components/editVesselModal/editVesselModal.coffee
+++ imports/ui/components/editVesselModal/editVesselModal.coffee
@@ -69,5 +69,4 @@
 					if e2
 						handleError e2
 					else
-						$('#addVesselModal').modal('hide')
-						$('#vesselSearch').val(name).keyup()
+						$('#editVesselModal').modal('hide')


ComputeProvider::create move stack fetcher to client version of create

--- workers/social/lib/social/models/computeproviders/computeprovider.coffee
+++ workers/social/lib/social/models/computeproviders/computeprovider.coffee
@@ -79,35 +79,32 @@
       { provider, stack, label } = options
       { r: { group, user, account } } = client

-      JStack = require '../stack'
-      JStack.getStack account, stack, (err, stack)=>
-        return callback err  if err?
-
-        provider.create client, options, (err, machineData)=>
-
+      provider.create client, options, (err, machineData)=>
+
+        return callback err  if err
+
+        { meta, postCreateOptions } = machineData
+
+        @createMachine {
+          provider : provider.slug
+          label, meta, group, user
+        }, (err, machine)->
+
+          # TODO if any error occurs here which means user paid for
+          # not created vm ~ GG
           return callback err  if err

-          { meta, postCreateOptions } = machineData
-
-          @createMachine {
-            provider : provider.slug
-            label, meta, group, user
-          }, (err, machine)->
-
-            # TODO if any error occurs here which means user paid for
-            # not created vm ~ GG
+          provider.postCreate {
+            postCreateOptions, machine, meta, stack: stack._id
+          }, (err)=>
+
             return callback err  if err

-            provider.postCreate {
-              postCreateOptions, machine, meta, stack: stack._id
-            }, (err)=>
-
-              return callback err  if err
-
-              stack.appendTo machines: machine.getId(), (err)->
-
-                account.sendNotification "MachineCreated"  unless err
-                callback err
+            stack.appendTo machines: machine.getId(), (err)->
+
+              account.sendNotification "MachineCreated"  unless err
+              callback err, machine
+

   @create$ = permit 'create machines', success: revive

@@ -115,7 +112,17 @@
     shouldPassCredential : yes
     shouldReviveProvider : no

-  , @create
+  , (client, options, callback)->
+
+    { stack } = options
+
+    JStack = require '../stack'
+    JStack.getStack account, stack, (err, revivedStack)=>
+      return callback err  if err?
+      return callback new KodingError "No such stack"  unless revivedStack
+
+      options.stack = revivedStack
+      @create client, options, callback


fixed test for max validator

fixed test for max validator

--- spec/validators_spec.coffee
+++ spec/validators_spec.coffee
@@ -82,7 +82,7 @@
     it 'should have the correct error message', ->

       max = new Max 2
-      max.message.should_be 'Please enter no more than 2 character(s).'
+      max.message.should_be 'Your entry has more than 2 character(s).'

     it 'should be true if value is a number', ->


Use setCursorBufferPosition() first to collapse cursors.

--- spec/whitespace-spec.coffee
+++ spec/whitespace-spec.coffee
@@ -63,7 +63,7 @@

     it "removes the whitespace from all lines, excluding the current lines", ->
       editor.insertText "1  \n2  \n3  \n"
-      editor.addCursorAtBufferPosition([1,3])
+      editor.setCursorBufferPosition([1,3])
       editor.addCursorAtBufferPosition([2,2])
       editor.save()
       expect(editor.getText()).toBe "1\n2  \n3  \n"
@@ -80,7 +80,7 @@

     it "removes the whitespace from all lines, including the current lines", ->
       editor.insertText "1  \n2  \n3  \n"
-      editor.addCursorAtBufferPosition([1,3])
+      editor.setCursorBufferPosition([1,3])
       editor.addCursorAtBufferPosition([2,2])
       editor.save()
       expect(editor.getText()).toBe "1\n2\n3\n"


ComputeProvider: updateGroupResourceUsage: add more information into report

--- workers/social/lib/social/models/computeproviders/computeprovider.coffee
+++ workers/social/lib/social/models/computeproviders/computeprovider.coffee
@@ -459,18 +459,24 @@

       if err and change is 'increment'

-        { account, template, provider } = details
-        user = account?.getAt?('profile.nickname') ? 'an unknown user'
+        { account, template, provider } = details ? {}
+        user     = account?.getAt?('profile.nickname') ? 'an unknown user'
+        provider = if provider? then "#{provider} " else ''
+        template = if template?.title?
+        then "Stack: #{template.title} - #{template._id}"
+        else ''

         KodingLogger.warn group, \
-          "#{user} failed to create #{item} due to plan limitations."
+          "#{user} failed to create #{provider}#{item} due to plan limitations. #{template}"

       callback err

     options = { group, change, amount: instanceCount }

     if instanceOnly
-      @updateGroupInstanceUsage options, handleResult
+      @updateGroupInstanceUsage options, (err) ->
+        handleResult err, 'machine'
+
       return

     @updateGroupStackUsage group, change, (err) =>


hash links as ids for products in vr_ar and additional_products categories

--- assets/coffeescript/pupil_store.coffee
+++ assets/coffeescript/pupil_store.coffee
@@ -74,21 +74,19 @@
       for vr_ar_id in get_vr_ar_product_ids()
         product = db[vr_ar_id]

-        html = "

-
-

-

-
-

-

-
 #{ product.title_store }

-
 #{ product.description_store }

-

-
-                      <button id='#{ vr_ar_id }' class='AddToCart Button-store' href='#' data-product='product'>€ #{product.cost}</button>
-
+        html = "

+

+

+

-
+

+
 #{ product.title_store }

+
 #{ product.description_store }

+

+
+                    <button id='#{ vr_ar_id }' class='AddToCart Button-store' href='#' data-product='product'>€ #{product.cost}</button>
+
+

"
         $("div[class~='VR-AR-products']").append(html)

@@ -96,21 +94,19 @@
       # create additional products
       for p_id in get_additional_product_ids()
         product = db[p_id]
-        html = "

-
-

-

-
-

-

-
 #{ product.title_store }

-
 #{ product.description_store }

-

-
-              <button id='#{ p_id }' class='AddToCart Button-store' href='#' data-product='product'>€ #{product.cost}</button>
-
+        html = "

+

+

+

-
+

+
 #{ product.title_store }

+
 #{ product.description_store }

+

+
+            <button id='#{ p_id }' class='AddToCart Button-store' href='#' data-product='product'>€ #{product.cost}</button>
+
+

"

         $("div[class~='Additional-products']").append(html)


typo error

typo error

--- vcard/strophe.vcard.coffee
+++ vcard/strophe.vcard.coffee
@@ -41,4 +41,4 @@
     ###
     set: (handler_cb, vCardEl, jid, error_cb) ->
         iq = buildIq "set", jid, vCardEl
-        this._connection.sendIQ iq, handler_cb, error_rb
+        this._connection.sendIQ iq, handler_cb, error_cb


Add filtering for suggestions in USE statements

 - Limit to module names after "USE"
 - Limit to module members after "ONLY:" statement

--- lib/fortran-provider.coffee
+++ lib/fortran-provider.coffee
@@ -177,9 +177,11 @@
       cursorScope = @getClassScope(editor, bufferPosition, lineScopes)
       if cursorScope?
         return @addChildren(cursorScope, completions, prefixLower, [])
-      lineContext = @getLineContext(editor, bufferPosition)
+      useSuggestions = @getUseSuggestion(editor, bufferPosition, prefixLower)
+      if useSuggestions?
+        return useSuggestions
       for key in @globalObjInd when (@projectObjList[key]['name'].startsWith(prefixLower))
-        if @projectObjList[key]['type'] == 'module' and lineContext != 1
+        if @projectObjList[key]['type'] == 'module'
           continue
         completions.push(@buildCompletion(@projectObjList[key]))
       #
@@ -188,10 +190,7 @@
         completions = @addChildren(lineScope, completions, prefixLower, [])
         usedMod = @getUseSearches(lineScope, usedMod, [])
       for useMod of usedMod
-        if lineContext == 1
-          completions = @addPublicChildren(useMod, completions, prefixLower, [])
-        else
-          completions = @addPublicChildren(useMod, completions, prefixLower, usedMod[useMod])
+        completions = @addPublicChildren(useMod, completions, prefixLower, usedMod[useMod])
     else
       lineScopes = @getLineScopes(editor, bufferPosition)
       cursorScope = @getClassScope(editor, bufferPosition, lineScopes)
@@ -222,7 +221,6 @@
     if @globalObjInd.indexOf(wordLower) != -1
       return @getDefLoc(@projectObjList[wordLower])
     # Look in local scopes
-    lineContext = @getLineContext(editor, bufferPosition)
     for lineScope in lineScopes
       containingScope = @findInScope(lineScope, wordLower)
       if containingScope?
@@ -241,12 +239,33 @@
       return @modFiles[fileRef]+":"+lineRef.toString()
     return null

-  getLineContext: (editor, bufferPosition) ->
-    useRegex = /^[ \t]*use/i
+  getUseSuggestion: (editor, bufferPosition, prefixLower) ->
+    useRegex = /^[ \t]*use[ \t]+/i
+    wordRegex = /[a-z0-9_]+/gi
+    suggestions = []
     line = editor.getTextInRange([[bufferPosition.row, 0], bufferPosition])
     if line.match(useRegex)?
-      return 1 # In use declaration
-    return 0 # Unknown enable everything!!!!
+      unless prefixLower.match(wordRegex)?
+        prefixLower = ""
+      matches = line.match(wordRegex)
+      if matches.length == 2
+        if prefixLower?
+          for key in @globalObjInd when (@projectObjList[key]['name'].startsWith(prefixLower))
+            if @projectObjList[key]['type'] != 'module'
+              continue
+            suggestions.push(@buildCompletion(@projectObjList[key]))
+        else
+          for key in @globalObjInd
+            suggestions.push(@buildCompletion(@projectObjList[key]))
+        return suggestions
+      else
+        modName = matches[1]
+        suggestions = @addPublicChildren(modName, suggestions, prefixLower, [])
+        for suggestion in suggestions
+          if 'snippet' of suggestion
+            suggestion.snippet = suggestion.snippet.split('(')[0]
+        return suggestions
+    return null # Unknown enable everything!!!!

   getLineScopes: (editor, bufferPosition) ->
     filePath = editor.getPath()


Rename chat states names

Rename chat states names

--- app/assets/javascripts/interaction_web_tools/chat.coffee
+++ app/assets/javascripts/interaction_web_tools/chat.coffee
@@ -5,8 +5,8 @@
   stateEnum = {
     INITIAL: 0
     START_PENDING: 1,
-    STARTED: 2,
-    KILLED: 3
+    ACTIVE: 2,
+    TERMINATED: 3
   }

   constructor: ->
@@ -27,7 +27,7 @@

   send: (message) ->
     console.log "Chat Client wants to send message", message
-    @startChat() unless @state == stateEnum.STARTED
+    @startChat() unless @state == stateEnum.ACTIVE
     @sendMessage(message)

   startChat: ->
@@ -37,10 +37,10 @@
     console.log "Chat Client Chat Start Peding"

   pollMessages: ->
-    return if @state == stateEnum.KILLED
+    return if @state == stateEnum.TERMINATED
     console.log "Chat Client is polling for messages"
     $.get @endpoint, (data) =>
-      @state = stateEnum.STARTED
+      @state = stateEnum.ACTIVE
       @dismissWelcome()
       @dequeueMessages()
       @renderMessages data.events
@@ -49,15 +49,15 @@
         if (event.type == 'participantStateChanged' &&
             event.state == 'disconnected' &&
             event.participant_type == 'WebUser')
-          @state = stateEnum.KILLED
+          @state = stateEnum.TERMINATED

       setTimeout () =>
         @pollMessages()
-      , 1000 if @state == stateEnum.STARTED || @state == stateEnum.START_PENDING
+      , 1000 if @state == stateEnum.ACTIVE || @state == stateEnum.START_PENDING

   sendMessage: (message) ->
     return unless message
-    return @queueMessage(message) unless @state == stateEnum.STARTED
+    return @queueMessage(message) unless @state == stateEnum.ACTIVE

     $.post @endpoint, { event: { content: message } }, (data) =>
       @renderMessages data.events
@@ -99,5 +99,5 @@
       type: 'DELETE'
     console.log "Chat Terminated"

-    @state = stateEnum.KILLED
+    @state = stateEnum.TERMINATED
     console.log "Chat Client Chat Terminated"


update file info after resizing

update file info after resizing

--- app/assets/javascripts/uploadcare/files/object.js.coffee
+++ app/assets/javascripts/uploadcare/files/object.js.coffee
@@ -16,13 +16,20 @@
     constructor: (settings, @__file) ->
       super

+      @fileName = @__file.name or 'original'
+      @__notifyApi()
+
+    setFile: (file) =>
+      if file
+        @__file = file
       @fileSize = @__file.size
-      @fileName = @__file.name or 'original'
       @fileType = @__file.type or 'application/octet-stream'
+      @__runValidators()
       @__notifyApi()

     __startUpload: ->
       if @fileSize >= @MP_MIN_SIZE and utils.abilities.blob
+        @setFile()
         @multipartUpload()
       else
         if @settings.imageReduce and utils.abilities.blob
@@ -32,11 +39,9 @@
           utils.imageProcessor.reduceFile(@__file, @settings.imageReduce)
             .progress (progress) ->
               df.notify(progress * resizeShare)
-            .done (file) =>
-              @__file = file
-              @fileSize = @__file.size
-              @fileType = @__file.type or 'application/octet-stream'
-            .fail (reason) ->
+            .done(@setFile)
+            .fail (reason) =>
+              @setFile()
               resizeShare = resizeShare * .1
             .always =>
               df.notify(resizeShare)
@@ -47,6 +52,7 @@
                   df.notify(resizeShare + progress * (1 - resizeShare))
           df
         else
+          @setFile()
           @directUpload()

     __autoAbort: (xhr) ->


don't put "show and hide courses menu" on user files

test plan:
 - enable new styles in the root account
 - on a course files page, when the window is shrunk to where
   the course nav doesn't fit, a hamburger menu should appear
   to toggle it
 - on a user files page, the hamburger menu should not be there
   (because there is no course nav to toggle; currently it is
    toggling an empty space)

fixes CNVS-21105

Change-Id: I229e308ead615f6790002aee3d17de436655f727
Reviewed-on: https://gerrit.instructure.com/60803
Reviewed-by: Clay Diffrient <9dff2e5c98626d20d2848250c411e8009465bb87@instructure.com>
Tested-by: Jenkins
QA-Review: Charles Kimball <46fea98154686b8132aa2745574cc8021812cb41@instructure.com>
Product-Review: Jeremy Stanley <b3f594e10a9edcf5413cf1190121d45078c62290@instructure.com>

--- app/coffeescripts/react_files/components/FilesApp.coffee
+++ app/coffeescripts/react_files/components/FilesApp.coffee
@@ -114,7 +114,7 @@
         header {},
           h1 {className: 'screenreader-only'},
             I18n.t('files_heading', "Files")
-        if ENV.use_new_styles
+        if ENV.use_new_styles and contextType == 'courses'
           div {className: 'ic-app-nav-toggle-and-crumbs ic-app-nav-toggle-and-crumbs--files'},
             button {
               className:'Button Button--link Button--small ic-app-course-nav-toggle',


Fix bufferIncrement

Fix bufferIncrement

--- lib/utils.coffee
+++ lib/utils.coffee
@@ -5,15 +5,12 @@
 		b = new Buffer buffer
 		i ?= b.length - 1

-		return Buffer.concat [new Buffer [1], b] if i < 0
+		return Buffer.concat [new Buffer([1]), b] if i < 0

-		tmp = new Buffer [parseInt b[i]]
-		tmp[0]++
-
-		newBuffer = @bufferIncrement(b, i - 1) if tmp[0] < b[i]
+		tmp = new Buffer [parseInt b[i]++]
+		newBuffer = @bufferIncrement(b, i - 1) if tmp[0] > b[i]
 		return newBuffer if newBuffer and b.length < newBuffer.length

-		b[i] = tmp[0]
 		b


First stab at scope

First stab at scope

--- src/god.coffee
+++ src/god.coffee
@@ -2,33 +2,30 @@
 isFunction = (value) ->
   typeof(value) == "function"

-normalize_value = (rx, value) ->
-  if isFunction(value)
-    value
-  else if value instanceof Object
-    value = new World(rx, value)
-  else
-    value

 class World
-  constructor: (rx, doc) ->
+  constructor: (rx, label, doc, up) ->
+    @rx = rx
     @doc = rx.map()
-    @rx = rx
-    @bind = rx.bind
+    @label = label
+    @up = up
     for key, value of doc
-      value = normalize_value(rx, value)
+      value = normalize_value(key, value)
       @doc.put(key, value)

-  map: (callback) ->
-    result = []
-    for key in Object.keys(@doc.x)
-      value = @get_raw(key)
-      result.push callback(key, value)
-    console.log result
-    result
+  normalize_value = (key, value) ->
+    if isFunction(value)
+      value
+    else if value instanceof Object
+      value = new World(@rx, key, value, this)
+    else
+      value

+  get_local: (key, world) ->
+    @doc.get(key)
+
   get_raw: (key) ->
-    @doc.get(key)
+    @get_local(key, this) or @up.get_local(key, this)

   get: (key) ->
     value = @get_raw(key)
@@ -44,10 +41,24 @@
     closure(this, args)

   bind: (exp) ->
-    @bind exp
+    @rx.bind exp
+
+  map: (callback) ->
+    result = []
+    for key in Object.keys(@doc.x)
+      value = @get_raw(key)
+      result.push callback(key, value)
+    console.log result
+    result
+
+  toString: ->
+    @doc.toString()

-  toString: ->
-    @doc
-
+class Root
+  get_local: (key, world) ->
+    console.log "#{key} not found"
+    console.log world
+
 exports.god = (rx, doc) ->
-  new World(rx, doc)
+  root = new Root()
+  new World(rx, "world", doc, root)


OPCE3: Rewriting of index function to handle correctly trailing/pre spaces

--- lib/y-rte.coffee
+++ lib/y-rte.coffee
@@ -1,5 +1,11 @@
+_ = require 'underscore'
+
+splitWord = word ->
+  word.match(/(^ +|)\W+ +/g)
+
+
 buildWord = (word, prepend='', append='') ->
-  tmp = word.split ' '
+  tmp = word.match /(^ +|)\W+ +/g
   tmp2 = []

   if tmp.length == 1
@@ -59,27 +65,27 @@
   #   @option endPos [Integer] pos position in last word of selection
   #   @option options [Object] style the style of the selection
   constructor: (a, b, c, d, e)->
-    if a? and b? and c? and d?
-      if !( typeof a is "number" and
-            typeof b is "number" and
-            typeof c is "number" and
-            typeof d is "number")
+    if not _.isUndefined(a) and not _.isUndefined(b) and not _.isUndefined(c) and not _.isUndefined(d)
+      if !( _.isNumber(a) and
+            _.isNumber(b) and
+            _.isNumber(c) and
+            _.isNumber(d))
         throw new Error "Expecting numbers as arguments"
       @startPos = {word: a, pos: b}
       @endPos = {word: c, pos: d}

       style = e

-    else if a? and b? and c?
-      if !( typeof a is "number" and
-            typeof b is "number")
+    else if not _.isUndefined(a) and not _.isUndefined(b) and not _.isUndefined(c)
+      if !( _.isNumber(a) and
+            _.isNumber(b))
         throw new Error "Expecting numbers as arguments"
       c.constructor is "Rte"

       [@startPos, @endPos] = @_relativeFromAbsolute(a, b, c)
       attr = d

-    else if a? and b? and a.pos? and a.word? and b.pos? and b.word?
+    else if not _.isUndefined(a) and not _.isUndefined(b) and a.pos? and a.word? and b.pos? and b.word?
       @startPos = a
       @endPos = b

@@ -87,7 +93,7 @@

     else throw new Error "Wrong set of parameters #{[a, b, c, d, e]}"

-    if style?
+    if not _.isUndefined(style)
       @style = style

     @startPos.lt = @endPos.lt = (s) ->
@@ -229,7 +235,7 @@
   #   @param [String] content the initial content to set
   #
   val: (content)->
-    if content?
+    if not _.isUndefined(content)
       # reset styles when replacing content
       @_rte.words = []
       @_rte.style = []
@@ -251,7 +257,7 @@
     @_rte.words[i].word

   getWords: (begin, end) ->
-    if not end?
+    if _.isUndefined(end)
       end = @_rte.words.length
     if not (0 <= begin <= end <= @_rte.words.length)
       throw new Error "Index out of bounds: #{[begin, end]}"
@@ -316,7 +322,7 @@
   # @param [Integer] start position of first word to delete
   # @param [Integer] end position of last word to delete
   deleteWords: (start, end) ->
-    if not end?
+    if _.isUndefined(end)
       end = start+1

     if start <= end
@@ -378,15 +384,68 @@
   # @param [String] content the content to insert
   #
   insert: (sel, content)->
-    if not sel.startPos?
+    if (_.isUndefined sel.startPos)
       throw new Error "Expected a location object as first argument"
-    if typeof content isnt "string"
+    if not (_.isString content)
       throw new Error "Expected a string as second argument"

-    n = sel.startPos.word
+    if content.length == 0
+      return
+    index = sel.startPos.word   #position to work from
     pos = sel.startPos.pos
-    word = @getWord(n)
-    @setWord(n, word.substring(0, pos) + content + word.substring(pos))
+
+    wordsToInsert = content.match /\w+ +/g
+    preSpaces = content.search /^ +/
+
+    currWord = @getWord index
+
+    # Get spaces of next input and append them to last word to insert
+    if index < @_rte.words.length - 1 and pos == (currWord.length - 1)
+      nextWord = @getWord (index+1)
+      preSpaces = nextWord.search /^ +/
+      if preSpaces > -1         # add them to current word
+        @setWord (index+1) nextWord.substring(preSpaces)
+        last = _.last(wordsToInsert) + nextWord.substring(0, preSpaces)
+        wordsToInsert[wordsToInsert.length-1] = last
+    else if pos < (currWord.length - 1)
+      nextWord = currWord.substring(pos)
+      preSpaces = nextWord.search /^ +/
+      if preSpaces > -1
+        if not preSpaces == (nextWord.length-1)
+          @insertWord (index+1) nextWord.substring(preSpaces)
+        last = _.last(wordsToInsert) + nextWord.substring(0, preSpaces)
+        wordsToInsert[wordsToInsert.length-1] = last
+
+    # Add the spaces at beginning of input string to previous word
+    # if any, or create an empty one
+    if preSpaces > -1
+      if pos == 0
+        if index == 0
+          emptyWord = new Word content.substring(0, preSpaces)
+          @insertWord 0, emptyWord
+        else
+          # update previous word
+          prevWord = @getWord (index-1)
+          prevWord += content.substring(0, preSpaces)
+          @setWord (index-1), prevWord
+
+
+  split: (n) ->
+    word = @getWord n
+    if _.isString(word) and -1 < (word.indexOf ' ') < word.length-1
+      @deleteWords n
+      wlist = (new Word w for w in word.split(' '))
+      while wlist[0] == ''
+        if n-1 >= 0
+          @setWord (n-1) ((@getWord (n-1))+' ')
+        wlist[0] = ' '+wlist[0]
+      while wlist[wlist.length-1] == ''
+        wlist[wlist.length-2] += ' '
+      @insertWords n, wlist
+    else
+      console.log word
+      console.log "Error here"
+

   # Relative jump from position
   #


TomDoc for dialectizer

TomDoc for dialectizer

--- src/scripts/dialectizer.coffee
+++ src/scripts/dialectizer.coffee
@@ -1,3 +1,7 @@
+# Allows Hubot to translate text into various dialects.
+#
+# dialectize|dialect|dia <dialect>|help <text> - Translates the given text into the given dialect.
+#
 Select     = require("soupselect").select
 HtmlParser = require "htmlparser"


fix for firefox

fix for firefox

--- core.coffee
+++ core.coffee
@@ -1,13 +1,10 @@
 window.lead = {}
-
-is_string = (x) ->
-  toString.call(x) is '[object String]'

 process_arg = (arg) ->
   return _lead: arg._lead if arg._lead
   if typeof arg is "number"
     return _lead: ['n', _lead_: arg]
-  if is_string arg
+  if $.type(arg) == 'string'
     return _lead: ['s', _lead_: arg]
   throw new Error('illegal argument ' + arg)

@@ -44,7 +41,7 @@
       lead.to_string values[0]

 lead.to_target_string = (node) ->
-  if is_string node
+  if $.type(node) == 'string'
     node
   else
     lead.to_string node


Modify enabled state when activated.

Modify enabled state when activated.

--- lib/line-focus-stats.coffee
+++ lib/line-focus-stats.coffee
@@ -10,7 +10,7 @@
     atom.commands.add 'atom-workspace',
       'line-focus-stats:toggle': => @toggle()

-    # @enable()
+    enabled = false

   deactivate: ->
     @disable()


only linting on errorCode 65

only linting on errorCode 65

--- lib/linter/scss-lint.coffee
+++ lib/linter/scss-lint.coffee
@@ -14,7 +14,7 @@
     runner.run (commandError, result) =>
       return callback(commandError) if commandError?

-      unless result.exitCode == 0
+      if result.exitCode == 65
         xml2js.parseString result.stdout, (xmlError, xml) =>
           return callback(xmlError) if xmlError?
           callback(null, @createViolationsFromXml(xml))


BF-291 texture loading & shader loading working; yet full of bugs

--- modules/isoshader/app/assets/javascripts/iso_shader.coffee
+++ modules/isoshader/app/assets/javascripts/iso_shader.coffee
@@ -57,9 +57,9 @@

     threshold_speed = 0.01
     max_dt = 0.2
-    debug_mode = 0
+    @debug_mode = 0
     max_debug_mode = 2
-    shading_type = 3
+    @shading_type = 3

     @initSurfaces()
     @initKeyboard()
@@ -78,8 +78,8 @@
       surface = {}
       surface.threshold = 0.61
       surface.uniform_name = "surface_#{i}"
-      surface.draw_surface = 0
-      surface.draw_map = 0
+      surface.draw_surface = 1
+      surface.draw_map = 1

       surface.draw_surface = 1 if not @surfaces[1].draw_surface_set

@@ -93,8 +93,10 @@

     # Initialize main THREE.js components
     @renderer = new THREE.WebGLRenderer( canvas: @canvas[0], clearColor: 0xffffff, antialias: true, preserveDrawingBuffer: true  )
-    @camera = new THREE.PerspectiveCamera(90, width / height, 0.1, 10000)
+    #@camera = new THREE.PerspectiveCamera(90, width /   height, 0.1, 10000)
     @scene = new THREE.Scene()
+    @camera = new THREE.Camera()
+    @camera.position.z = 1

     @scene.add(@camera)
     #@camera.lookAt(new THREE.Vector3( 0, 0, 0 ))
@@ -129,10 +131,12 @@
     parameters = @parameters

     shaderUniforms =
-      time :          { type: "f", value: parameters.time }
-      resolution :    { type: "v2", value: new THREE.Vector2(parameters.screenWidth, parameters.screenHeight) }
-      camera_matrix : { type: "m4", value: new THREE.Matrix4(@camera_matrix) }
-      backbuffer :    { type: "backbuffer", value: new THREE.Texture() } #unused right now
+      time :          { type: "f", value: parameters.time },
+      resolution :    { type: "v2", value: new THREE.Vector2(parameters.screenWidth, parameters.screenHeight) },
+      camera_matrix : { type: "m4", value: new THREE.Matrix4(@camera_matrix) },
+      shading_type :  { type: "i", value : @shading_type},
+      debug_mode :    { type: "i", value : @debug_mode},
+      backbuffer :    { type: "backbuffer", value: new THREE.Texture() }, #unused right now
       mouse :         { type: "mouse", value: new THREE.Vector2(parameters.mouseX, parameters.mouseY) } #unused

     for i in [0 .. @surfaces.length - 1]
@@ -140,7 +144,7 @@
       texture = new THREE.Texture( @assetHandler.getFile("texture")[i] )
       texture.needsUpdate = true

-      shaderUniforms["surface_#{i}.texture"] =      { type: "t", value: 0, texture: texture }
+      shaderUniforms["surface_#{i}.texture"] =      { type: "t", value: texture }
       shaderUniforms["surface_#{i}.threshold"] =    { type: "f", value: @surfaces[i].threshold }
       shaderUniforms["surface_#{i}.draw_surface"] = { type: "i", value: @surfaces[i].draw_surface }
       shaderUniforms["surface_#{i}.draw_map"] =     { type: "i", value: @surfaces[i].draw_map }
@@ -156,14 +160,14 @@

     input = new Input.KeyboardNoLoop(
       #enable or disable surface
-      "m" : @surfaces[0].draw_surface = +!@surfaces[0].draw_surface
-      "p" : @surfaces[1].draw_surface = +!@surfaces[1].draw_surface
+      "m" : => @surfaces[0].draw_surface = +!@surfaces[0].draw_surface
+      "p" : => @surfaces[1].draw_surface = +!@surfaces[1].draw_surface

       # thresholds
-      "," : @surfaces[0].threshold
-      "." : @surfaces[0].threshold
-      "[" : @surfaces[1].threshold
-      "]" : @surfaces[1].threshold
+      "," : => @surfaces[0].threshold
+      "." : => @surfaces[0].threshold
+      "[" : => @surfaces[1].threshold
+      "]" : => @surfaces[1].threshold

       "t" :  ->

@@ -211,9 +215,9 @@
     parameters.time = Date.now() - parameters.startTime
     @cam_matrix = glMatrix.mat4.fromRotationTranslation(@cam_matrix, @cam.dir, @cam.pos)

-    @shaderMaterial.uniforms["time"] = parameters.time / 1000
-    @shaderMaterial.uniforms["resolution"] = new THREE.Vector2(parameters.screenWidth, parameters.screenHeight)
-    @shaderMaterial.uniforms["camera_matrix"] = new THREE.Matrix4(@camera_matrix) #array or single values???
+    @shaderMaterial.uniforms["time"].value = parameters.time / 1000
+    @shaderMaterial.uniforms["resolution"].value = new THREE.Vector2(parameters.screenWidth, parameters.screenHeight)
+    @shaderMaterial.uniforms["camera_matrix"].value = new THREE.Matrix4(@camera_matrix) #array or single values???

     #both unused right now in shader
     #@shaderMaterial.uniforms["backbuffer"] = new THREE.Texture()
@@ -246,6 +250,6 @@
     @parameters.screenHeight = height

     @renderer.setSize( width, height )
-    @camera.aspect = width / height
-    @camera.updateProjectionMatrix()
-
+    #@camera.aspect = width / height
+    #@camera.updateProjectionMatrix()
+


component should have attributes and children separately

--- resources/assets/coffee/react/profile-page/cover-uploader.coffee
+++ resources/assets/coffee/react/profile-page/cover-uploader.coffee
@@ -83,7 +83,7 @@

       div className: 'profile-cover-uploader__info',
         p className: 'profile-cover-uploader__info-entry',
-          strong
+          strong null,
             el StringWithComponent,
               mappings:
                 ':link': a


move helper loading from constructor to context.new

--- lib/ewg/haml/context.coffee
+++ lib/ewg/haml/context.coffee
@@ -11,6 +11,7 @@
 class EWGHamlContext
   # Any properties of this object are available in the Haml templates.
   constructor: (@config)->
+    @helperLoaded = false
     @context = extend(
       {},
       # express helper simulating action view helper(ruby)
@@ -22,12 +23,6 @@
       }
     )

-    @loadHelperIntoContext path.join(__dirname, 'helper', '**/*.coffee')
-    if @config.compiler.custom_helper?
-      for chelper in @config.compiler.custom_helper
-        @loadHelperIntoContext path.join(process.cwd(), chelper)
-
-
   # TODO watch for helper change and reload if
   # load a module into the persistent context
   loadHelperIntoContext: (folder) =>
@@ -37,12 +32,25 @@
       console.log "loading haml helper #{trimmedPath.green}"
       @extend require(helperPath)

+  loadHelperFirstTime: =>
+    return if @helperLoaded
+
+    @helperLoaded = true
+
+    @loadHelperIntoContext path.join(__dirname, 'helper', '**/*.coffee')
+    if @config.compiler.custom_helper?
+      for chelper in @config.compiler.custom_helper
+        @loadHelperIntoContext path.join(process.cwd(), chelper)
+
+
   # extend the persitent context
   extend: (object) =>
     extend(true, @context, object)

   # take copy from the persitent context
   new: (locals = {})=>
+    @loadHelperFirstTime()
+
     extend(true, {}, @context, locals || {})

 module.exports = EWGHamlContext