"Adapted from a mail of Peter Uhnák" | b url form originalText uninterestingWords cookedText1 cookedText2 | originalText := 'Este proyecto mostrará la nube de etiquetas de un político a partir de lo que este publica en Twitter. Se han elegido políticos en consonancia con el proyecto datapolis, porque creo que su discurso en redes sociales puede ser de interés general, pero por supuesto podría ser cualquier persona. La idea del algoritmo es sencilla: 1. Se extraen datos de la página pública de Twitter de la persona específica. Esto se hace desde el raspado de datos (*data scrapping*) pues el discurso público debería estar sujeto a las condiciones constitucionales de la libre expresión y no a los términos de API de twitter. 2. Se mira la estructura de estos datos, para seleccionar sólo aquellos que consisten en trinos (tweets) y sus metadatos y se seleccionan las palabras que consisten en la parte jugosa del trino, quitando artículos (el la los las) y letras sueltas, para dejar sólo las palabras. Se mira cual es la franja de tiempo que estamos considerando y se envía esto a un sistema de control de versiones, diciendo desde cuándo hasta cuándo corresponde la nube de etiquetas y en qué momento fue tomada. Esto hace el discurso y los procedimientos auditables. 3. Se disponen las palabras restantes y el avatar de la persona en forma de nube de etiquetas. Empezaremos por el paso 3, para ver una maqueta del resultado final y luego lo iremos afinando con los datos reales de lo que dijo.'. uninterestingWords := #('ante' 'como' 'cómo' 'con' 'cual' 'cuando' 'cuándo' 'de' 'del' 'desde' 'el' 'en' 'entre' 'es' 'este' 'esto' 'estos' 'han' 'hasta' 'la' 'las' 'lo' 'los' 'para' 'por' 'pues' 'se' 'sólo' 'solo' 'su' 'sus' 'que' 'qué' 'un' 'una'). cookedText1 := originalText. cookedText1 := cookedText1 copyReplaceAll: ',' with: ' '. cookedText1 := cookedText1 copyReplaceAll: ';' with: ' '. cookedText1 := cookedText1 copyReplaceAll: '.' with: ' '. cookedText1 := cookedText1 copyReplaceAll: ':' with: ' '. cookedText1 := cookedText1 copyReplaceAll: ')' with: ' '. cookedText1 := cookedText1 copyReplaceAll: '(' with: ' '. cookedText2 := String new. (cookedText1 splitOn: ' ') do: [:word | ((word size > 1) & (uninterestingWords includes: word asLowercase) not) ifTrue: [cookedText2 := cookedText2, word, ' ']]. b := RTNameCloud new addString: cookedText2. b build. url := 'https://pbs.twimg.com/profile_images/3179579549/f83f0e935fb5eff6d967e37e1a3efe5c_200x200.png'. "<-- the layouting is based on sizes, so if you change ?s=100 to ?s=40 the image will be center-ish" url asZnUrl. form := ZnEasy getPng: url. b view add: (RTBitmap new form: form) element. RTRectanglePackLayout new on: b view elements. "<-- since I added a new element I have to layout it myself" ^ b view