preparecode4blog.m

 function preparecode4blog(maxcolumns)
 
 if nargin == 0
     maxcolumns = 71;
 elseif maxcolumns <=4
     error(['PREPARETEXT4HTML: el numero maximo de columnas debe ser'...
     ' mayor de 4'])
 end
 
 [file, path]=uigetfile('*.*','Abrir archivo...');
 ruta=[path,file];
 espacio = ' ';
 comentario = '%';
 
 stringlist = textread(ruta, '%s','delimiter','\n','whitespace', '');
 
 lines = length(stringlist);
 newstringlist = cell(lines, 1);
 newstringlist{1} = '<pre>';
 
 inew = 2;
 for i = 1:lines
     string = cell(1);
     string{1} = stringlist{i};
     ii = 1; % su valor incrementarA si el renglon se divide en dos 
     % o mas.
 
     % quitar espacios del final del renglon para estimar bien su 
     % tamaño, etc...
     while ~isempty(string{1}) & (string{1}(end) == espacio)
         string{1}(end) = [];
     end
 
     if ~isempty(string{1})
 
         escomentario = 0;
         esliteral = 0;
         while length(string{ii}) > maxcolumns
 
             % buscar primer caracter del renglon
 
             primerc = 1;
             while (string{ii}(primerc) == espacio) & (primerc < ...
             (maxcolumns - 8))
                 primerc = primerc + 1;
             end
             if primerc == (maxcolumns - 8)
                 error(['No es posible ajustar el documento al '...
                 'ancho deseado sin romper el nivel de tabulacion.' ...
                        'Linea ' num2str(i)])
             end
 
             % buscar espacio por donde cortar
             caracter = maxcolumns - 4;
             while (string{ii}(caracter) ~= espacio) & (caracter > ...
             max(primerc, 4))
                 caracter = caracter - 1;
             end
             if caracter == max(primerc, 4)
                 caracter = maxcolumns - 4;
             end
             % comprobar si estamos en un comentario
             if any(string{ii}(primerc:caracter) == comentario)
                 escomentario = 1;
             end
 
             % comprobar si estamos en un literal
             if ~escomentario
                 if mod(sum(string{ii}(primerc:caracter) == ''''),2) > 0
                     esliteral = 1;
                 end
             end
 
             if escomentario
                 string{ii + 1} = [repmat(espacio, 1, primerc-1), ...
                 comentario, espacio, string{ii}(caracter+1:end)];
                 string{ii} = string{ii}(1:caracter);
             elseif esliteral
                 string{ii + 1} = [repmat(espacio, 1, primerc-1), ...
                 '''', string{ii}(caracter+1:end)];
                 string{ii} = [string{ii}(1:caracter), '''...'];
                 msg = sprintf(['Atencion: Cadena de caracteres '...
                 'rota en la linea ' num2str(inew + ii - 1)...
                         '\nEs posible que tenga que concatenar las '...
                         'dos partes manualmente']);
                 disp(msg)
             else
                 string{ii + 1} = [repmat(espacio, 1, primerc-1), ...
                 string{ii}(caracter+1:end)];
                 string{ii} = [string{ii}(1:caracter), '...'];
             end
 
             ii = ii + 1;
         end
 
         % Si el ultimo renglon es un comentario a medias, se une 
         % al siguiente renglon de comentario.
         if escomentario & (string{ii}(end) ~= '.') & (i < lines) & ...
         (ii > 1)
             if ~isempty(stringlist{i+1})
                 % buscar primer caracter del renglon siguiente 
                 % (esto se repite dos veces por renglon. No esta 
                 % optimizado. No importa)
                 primercnext = 1;
                 while (stringlist{i+1}(primercnext) == espacio) & ...
                 (primercnext < ...
                 min(length(stringlist{i+1}),(maxcolumns - 8)))
                     primercnext = primercnext + 1;
                 end
                 if stringlist{i+1}(primercnext) == comentario
                     stringlist{i + 1} = [string{ii} espacio ...
                     stringlist{i + 1}(2:end)];
                     ii = ii - 1;
                 end
             end
         end
     end
 
     % Copiamos los renglones a newstringlist
     for j = 1:ii
         newstringlist{inew} = string{j};
         inew = inew + 1;
     end
 
 %      disp(['listo renglon ' num2str(i) ' de ' num2str(lines)])
 end
 
 newstringlist{inew} = '</pre>';
 
 for i = 2:length(newstringlist)-1
     newstringlist{i} = replace(newstringlist{i}, '&', '&amp;');
     newstringlist{i} = replace(newstringlist{i}, '<', '&lt;');
     newstringlist{i} = replace(newstringlist{i}, '>', '&gt;');
 end
 
 [file, path]=uiputfile('*.*','Guardar como...');
 ruta=[path,file];
 fid = fopen(ruta, 'w');
 
 for i = 1:length(newstringlist)
     fprintf(fid, '%s\n ', newstringlist{i});
 end
 
 fclose(fid);
 
 
 
 
 
 function strout = replace(strin, s1, s2)
 
 strout = [];
 
 caracter1 = 1;
 caracter2 = 2;
 indices = findstr(strin, s1);
 if ~isempty(indices)
     for i = 1:length(indices)
         caracter2 = indices(i);
         if caracter2 > caracter1
             strout = [strout, strin(caracter1:caracter2-1), s2];
         else
             strout = [strout, s2];
         end
         caracter1 = caracter2 +1;
     end
     if indices(end) < length(strin)
         strout = [strout strin(indices(end) + 1:end)];
     end
 else
     strout = strin;
 end
 

About this entry